메뉴 건너뛰기

창조도시 기록보관소

 


어제는 깜박하고 강좌를 못 올렸네요 -_-;


 


원래 스프라이트까지 담으려고 했지만 하다보니 내용이 많아져서 생략합니다.


 







 


(3) 더블 버퍼의 생성과 블리팅


 


0) 더블 버퍼(백 버퍼)란?


 


VB의 PictureBox를 이용해 오브젝트를 옮겨 본 적이 있는 분이시라면, 플리커링(깜박임)현상을 아실겁니다. 메모리 상의 비트맵을 직접 화면에 표시하면 그런 플리커링 현상이 일어나지요.


그래서 '더블 버퍼'라는 가상 표면 위에 그림을 그리고, 더블 버퍼를 매우 빠른 속도로 화면에 표시하는 기법을 씁니다.


 


1) 더블 버퍼의 생성


 


더블 버퍼는 메인 표면이 아니니 보조 표면으로 DirectDrawSurface7객체를 생성합니다.


 


Dim ddBackBuffer As DirectDrawSurface7
Private ddsdBackBuffer As DDSURFACEDESC2
Dim rBackBuffer As RECT
ddsdBackBuffer.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
ddsdBackBuffer.lWidth=640
ddsdBackBuffer.lHeight=480
Set ddBackBuffer = ddraw.Createsurface(ddsdBackBuffer)
rBackBuffer.Bottom = ddsdBackBuffer.lHeight
rBackBuffer.right = ddsdBackBuffer.lWidth

 


2) 더블 버퍼로의 블리팅


 


만약 어떤 스프라이트가 ddSprite에 저장되어 있다고 가정하고, 이를 화면에 표시하기 위해 백 버퍼에 출력한다고 가정합시다. 이 ddSprite의 RECT객체인 rSprite는 ddSprite에서 복사될 범위를 지정합니다.


 


 



ddBackBuffer.Blt rbbRect, ddSprite, rSprite, DDBLT_WAIT


 


여기서 rbbRect가 무엇을 의미하냐면, 바로 백 버퍼 상의 rSprite가 복사될 범위를 지정합니다.


 


* rbbRect의 크기와 rSprite의 크기가 다르면 자동으로 사이즈의 변환이 이루어 집니다.


 


3) 더블 버퍼에서의 블리팅


 


더블 버퍼를 다 채웠다면, 이제 더블 버퍼의 내용을 메인 표면으로 로드해야 겠지요?


 


Picture1라는 PictureBox에 복사한다고 가정하고 프로그램을 작성하여 봅시다.


 


우선 ddScreen이라는 메인 표면을 생성해 여기에 더블 버퍼를 출력할 것입니다.



 



ddraw.SetCooperativeLevel Picture1.hWnd, DDSCL_NORMAL


ddsdScreen.lFlags = DDSD_CAPS


ddsdScreen.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE


ddsdScreen.lWidth = SCREENWIDTH


ddsdScreen.lHeight = SCREENHEIGHT


Set ddScreen = ddraw.CreateSurface(ddsdScreen)


rScreen.Bottom = ddsdScreen.lHeight


rScreen.Right = ddsdScreen.lWidth



 


이제 메인 표면이 생성되었으니 여기에 더블 버퍼를 블리팅 해봅시다.


 




objDX.GetWindowRect Picture1.hWnd, rScreen 'Picture1의 RECT를 rScreen으로 리턴해줍니다.


ddScreen.Blt rScreen, ddBackBuffer, rBackBuffer, DDBLT_WAIT



 


 






 


여러분은 이번 강좌까지 DirectDraw객체를 생성하고, 백 버퍼를 생성하여 메인 표면에 백 버퍼의 내용을 출력한는 방법까지 배웠습니다.


 


다음 강좌에서는 스프라이트를 생성하여 이를 백 버퍼에 출력하고, 메인 객체에 표시하는 법을 배울 것이고, 그 다음강좌에서는 직접 프로그램을 작성하여 DirectDraw의 첫 프로그램을 감상하게 되실 겁니다.


 


그럼 다음시간에...

번호 제목 글쓴이 날짜 조회 수
429 [덧붙임] 변수번호의 스위치 사용은 되도록이면 자제 [1] A. 미스릴 2007.10.15 503
428 RPG에 자주 있는것들 [15] ⓦildⓡose★ 2007.09.26 1514
427 [한단계 도약]변수 번호의 변수 [5] A. 미스릴 2007.09.21 643
426 한가지 경우에만 적용되는 경험치 게이지바 [7] file 베넘 2007.09.21 616
425 [한단계 도약] 변수 번호의 스위치 [6] A. 미스릴 2007.09.12 653
424 [한단계 도약] 되풀이 처리 [2] A. 미스릴 2007.09.12 449
423 RPG 2K시리즈에서도 Script의 사용이 가능합니다. [9] 타다기 2007.08.21 1103
422 귀찮아‡님의 자동세이브 스크립트의 한글화 [3] J.Clifford 2007.08.19 617
421 가장 보편적인 범위 좌표 설정하기. [6] 아싸사랑 2007.08.15 852
420 간단팁) XP에서 1초는 몇프레임인가? [4] 유진 2007.08.08 993
419 대기중에 캐릭터가 움직이게/못움직이게 하려면? [2] 유진 2007.08.08 679
418 게임의 리얼리티화 [3] 유진 2007.08.05 1248
417 [C++] 최단거리 구하는 알고리즘, E log V Dijkstra [2] 악희 2007.08.01 749
» [DX/VB] DirectDraw? 별거 아냐! (3) 더블 버퍼의 생성과 블리팅 [2] 악희 2007.08.01 624
415 0707후반기[제작자포럼]공성결과 [5] 천무 2007.08.01 401
414 [DX/VB] DirectDraw? 별거 아냐! (2) 블리팅, 그리고 투명도 [1] 악희 2007.07.30 570
413 [DX/VB] DirectDraw? 별거 아냐! (1) DirectDraw객체의 생성과 표면의 생성 [3] 악희 2007.07.27 631
412 게시판 이용 및 라이센스 공지 J.Clifford 2007.07.23 521
411 두드리는 미니게임... [3] JIN[晉] 2007.07.22 565
410 7월상반기(제작자포럼)공성결과 천무 2007.07.16 358