从书上看,这个DEMO不复杂,就是把源矩形复制到目标矩形,我得每天首先封装引擎一个,
核心代码应该是
int x1 = rand() % SCREEN_WIDTH;
int y1 = rand() % SCREEN_HEIGHT;
int x2 = rand() % SCREEN_WIDTH;
int y2 = rand() % SCREEN_HEIGHT;
int x3 = rand() % SCREEN_WIDTH;
int y3 = rand() % SCREEN_HEIGHT;
int x4 = rand() % SCREEN_WIDTH;
int y4 = rand() % SCREEN_HEIGHT;
source_rect.left = x1;
source_rect.top = y1;
source_rect.right = x2;
source_rect.bottom = y2;
dest_rect.left = x3;
dest_rect.top = y3;
dest_rect.right = x4;
dest_rect.bottom = y4;
lpddsprimary->Blt( & dest_rect, lpddsback, & source_rect, DDBLT_WAIT, NULL );
截图如下图所示。
在引擎中,直接看看t3dlib吧,
先看ddraw_init()
将DDSCL_MULTITHREADED加到m_dwCooprativeFlags;
m_lpdd->SetDisplayMode( m_dwWidth, m_dwHeight, m_dwBPP, 0, 0 );明确表示
在窗口模式中
ddsd.dwBackBufferCount = 0;
然后,在清除颜色时,窗口只清除后备缓冲,全屏需要都清除。
DDraw_Fill_Surface( m_lpddsback, 0 );
DDraw_Fill_Surface( m_lpddsprimary, 0 );
在窗口上,要创建一个lpddsback离屏表面,是后面的内容了,所以先不要。
由于这个DEMO,并非很标准,用到了汇编,所以也先不用在GAME_MAIN()里面了。
再看下函数DDraw_Flip()
加上了窗口模式,
RECT dest_rect;
GetWindowRect( m_hWnd, & dest_rect );
dest_rect.left += window_client_x0;
dest_rect.top += window_client_y0;
dest_rect.right += dest_rect.left + SCREEN_WIDTH;
dest_rect.bottom += dest_rect.top + SCREEN_HEIGHT;
m_lpddsprimary->Blt( & dest_rect, m_lpddsback, NULL, DDBLT_WAIT, NULL );