资源描述:
《游戏开发基础(9)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、游戏开发基础(9)第一节窗口的移动和改变大小时caseWM_SIZE:caseWM_MOVE:if(IsIconic(hWnd)){ Msg("FoxBearisminimized,pausing"); PauseGame();}if(bFullscreen){ SetRect(&rcWindow,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));}else{ GetClientRect(hWnd,&r
2、cWindow); ClientToScreen(hWnd,(LPPOINT)&rcWindow); ClientToScreen(hWnd,(LPPOINT)&rcWindow+1);}Msg("WINDOWRECT:[%d,%d,%d,%d]",rcWindow.left,rcWindow.top,rcWindow.right,rcWindow.bottom);break;caseWM_SIZE:是在窗口的大小被改变时发送的。caseWM_MOVE:是在窗口被移动时发送的。当收到这两个
3、消息后,首先检测窗口是否最小化了,如果是则暂停游戏。否则再检测游戏是否转为全屏模式,若是则改变用户区的大小为全屏。如果只是改变了窗口的大小但并没有使显示模式变成全屏或窗口最小化,则先取得窗口的用户区坐标(左上角的x、y及右下角的x、y的值)将之存入结构rcWindows,再将rcWindows中的坐标转换为屏幕坐标。请注意rcWindows是RECT型的结构,但ClientToScreen()要求的是POINT型的结构,在结构RECT中存放的是一个矩形的左上角的x、y及右下角的x、y的值而结构PO
4、INT中存放的就只是x和y的值。故此在 ClientToScreen(hWnd,(LPPOINT)&rcWindow);ClientToScreen(hWnd,(LPPOINT)&rcWindow+1);中先对rcWindow进行强制类型转换,而且两次调用该函数,同时在第二次掉用时使rcWindow的地址自加1。第二节窗口被激活时 caseWM_ACTIVATEAPP:bIsActive=(BOOL)wParam&&GetForegroundWindow()==hWnd;if(bIsActive)
5、 Msg("FoxBearisactive");else Msg("FoxBearisnotactive");if(bPaused&&bIsActive){ if(RestoreGame()) { UnPauseGame(); } else { if(GetForegroundWindow()==hWnd) { if(InitGame()) { UnPauseGame
6、(); } } }}break;caseWM_ACTIVATEAPP:当不同于当前窗口的应用程序的窗口被激活时发送本消息。当接收到这个消息时,首先令bIsActive等于(BOOL)wParam&&GetForegroundWindow()==hWnd,然后检测bIsActive是否为TURE。这里的意思就是检测游戏的窗口是否被激活且处于当前系统中最高优先级。接下来先检测游戏窗口是否是从暂停状态到激活的状态,若是则运行RestoreGame()从新开始,若Res
7、toreGame()成功则运行UnPauseGame(),如果不是从暂停状态到激活的状态,则检测本程序的窗口是否拥有最高的优先级,若有则从新初始化游戏(运行InitGame()),初始化成功后则运行UnPauseGame()。第三节实现逻辑调色板时 caseWM_QUERYNEWPALETTE:if(!bFullscreen&&lpPalette&&lpFrontBuffer){ HRESULTddrval; ddrval=IDirectDrawSurface_SetPalette(lpF
8、rontBuffer,lpPalette); if(ddrval==DDERR_SURFACELOST) { IDirectDrawSurface_Restore(lpFrontBuffer); ddrval=IDirectDrawSurface_SetPalette(lpFrontBuffer,lpPalette); if(ddrval==DDERR_SURFACELOST) { Msg("Failedt