BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35667同步于 2009/9/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

部分游戏代码疑问:请教大牛。。[求助]

sd4039924
2009/9/14镜像同步2 回复
[QUOTE]哎。。这个游戏代码是一本书上的,但是我在实现之后与书上画出的结果完全不同。在书上,画出的是定时出现黄圈并且用线相连,但是自己的却不知道为什么失去了效果。请教大牛们。下面是全部的代码: ------------------------------------- BLIZZARD.CPP全部代码: //Blizzard应用程序 //C++文件 //包含文件如下 #include "Blizzard.h" BOOL GameInitialize(HINSTANCE hInstance) { //创建游戏引擎 g_pGame=new GameEngine(hInstance,TEXT("1a"),TEXT("11"),IDI_ICON2,IDI_ICON1); if(g_pGame==NULL) return FALSE; //设置帧频 g_pGame->SetFrameRate(1); return TRUE; } void GameStart(HWND hWindow) { srand(GetTickCount()); g_rcRectangle.left=g_pGame->GetWidth()*2/5; g_rcRectangle.top=g_pGame->GetHeight()*2/5; g_rcRectangle.right=g_rcRectangle.left+g_pGame->GetWidth()/10; g_rcRectangle.bottom=g_rcRectangle.top+g_pGame->GetWidth()/10; } void GameEnd() { //清理游戏引擎 delete g_pGame; } void GameActivate(HWND hWindow) { HDC hDC; RECT rect; //在游戏屏幕上绘制文本 GetClientRect(hWindow,&rect); hDC = GetDC(hWindow); DrawText(hDC,TEXT("doubles!DNF"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); ReleaseDC(hWindow,hDC); } void GameDeactivate(HWND hWindow) { HDC hDC; RECT rect; //在游戏屏幕上绘制停用文本 GetClientRect(hWindow,&rect); hDC=GetDC(hWindow); DrawText(hDC,TEXT("aaaaaaa"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); ReleaseDC(hWindow,hDC); } void GamePaint(HDC hDC) { //绘制工作专用 RECT rect; GetClientRect(g_pGame->GetWindow(),&rect); HBRUSH hBrush=CreateSolidBrush(RGB(128,128,0)); FillRect(hDC,&rect,hBrush); DeleteObject(hBrush); } void GameCycle() { RECT rect; HDC hDC; HWND hWindow=g_pGame->GetWindow(); int iXLast=g_rcRectangle.left+(g_rcRectangle.right-g_rcRectangle.left)/2; int iYLast=g_rcRectangle.top+(g_rcRectangle.bottom-g_rcRectangle.top)/2; GetClientRect(g_pGame->GetWindow(),&rect); int iInflation=(rand()%17)-8; InflateRect(&g_rcRectangle,iInflation,iInflation); OffsetRect(&g_rcRectangle, rand()%(rect.right-rect.left)-g_rcRectangle.left, rand()%(rect.bottom-rect.top)-g_rcRectangle.top); hDC=GetDC(hWindow); HPEN hPen=CreatePen(PS_SOLID,5,RGB(192,192,0)); SelectObject(hDC,hPen); MoveToEx(hDC,iXLast,iYLast,NULL); LineTo(hDC, g_rcRectangle.left+(g_rcRectangle.right-g_rcRectangle.left)/2, g_rcRectangle.top+(g_rcRectangle.bottom-g_rcRectangle.top)/2); HBRUSH hBrush=CreateSolidBrush(RGB(192,192,0)); SelectObject(hDC,hBrush); Ellipse(hDC,g_rcRectangle.left,g_rcRectangle.top, g_rcRectangle.right,g_rcRectangle.bottom); ReleaseDC(hWindow,hDC); DeleteObject(hBrush); DeleteObject(hPen); } ---------------------------------------------- GameEngine.cpp代码: #include "GameEngine.h" //静态变量初始化 GameEngine *GameEngine::m_pGameEngine=NULL; //Windows函数 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { MSG msg; static iTickTrigger=0; int iTickCount; if(GameInitialize(hInstance)) { //初始化游戏引擎 if(!GameEngine::GetEngine()->Initialize(iCmdShow)) return FALSE; while(TRUE) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //处理消息 if(msg.message==WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { //确保游戏没有休眠 if(!GameEngine::GetEngine()->GetSleep()) { //检查计数器TRIGGer,查看是否经历了一个游戏周期 iTickCount=GetTickCount(); if(iTickCount>iTickTrigger) { iTickTrigger=iTickCount+GameEngine::GetEngine()->GetFrameDelay(); GameCycle(); } } } } return (int)msg.wParam; } GameEnd(); return TRUE; } LRESULT CALLBACK WndProc(HWND hWindow,UINT msg,WPARAM wParam,LPARAM lParam) { //将所有WINDOWS消息度传给游戏引擎 return GameEngine::GetEngine()->HandleEvent(hWindow,msg,wParam,lParam); } //GameEngine类的构造和析构函数 GameEngine::GameEngine(HINSTANCE hInstance,LPTSTR szWindowClass,LPTSTR szTitle, WORD wIcon,WORD wSmallIcon,int iWidth,int iHeight) { //设置游戏引擎的成员变量 m_pGameEngine=this; m_hInstance=hInstance; m_hWindow=NULL; if(lstrlen(szWindowClass)>0) lstrcpy(m_szWindowClass,szWindowClass); if(lstrlen(szTitle)>0) lstrcpy(m_szTitle,szTitle); m_wIcon=wIcon; m_wSmallIcon=wSmallIcon; m_iWidth=iWidth; m_iHeight=iHeight; m_iFrameDelay=50; m_bSleep=TRUE; } GameEngine::~GameEngine() { } BOOL GameEngine::Initialize(int iCmdShow) { //引擎常规方法 WNDCLASSEX wndclass; //创建主窗口的窗口类 wndclass.cbSize =sizeof(wndclass); wndclass.style =CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc =WndProc; wndclass.cbClsExtra =0; wndclass.cbWndExtra =0; wndclass.hInstance =m_hInstance; wndclass.hIcon =LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon())); wndclass.hIconSm =LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon())); wndclass.hCursor =LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wndclass.lpszMenuName =NULL; wndclass.lpszClassName =m_szWindowClass; //注册窗口类 if(!RegisterClassEx(&wndclass)) return FALSE; //根据游戏大小计算窗口大小和位置 int iWindowWidth=m_iWidth+GetSystemMetrics(SM_CXFIXEDFRAME)*2, iWindowHeight=m_iHeight+GetSystemMetrics(SM_CXFIXEDFRAME)*2+GetSystemMetrics(SM_CYCAPTION); if(wndclass.lpszMenuName!=NULL) iWindowHeight+=GetSystemMetrics(SM_CYMENU); int iXWindowPos=(GetSystemMetrics(SM_CXSCREEN)-iWindowWidth)/2, iYWindowPos=(GetSystemMetrics(SM_CXSCREEN)-iWindowHeight)/2; //创建窗口 m_hWindow=CreateWindow(m_szWindowClass,m_szTitle,WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,iXWindowPos,iYWindowPos, iWindowWidth,iWindowHeight,NULL,NULL,m_hInstance,NULL); if(!m_hWindow) return FALSE; ShowWindow(m_hWindow,iCmdShow); UpdateWindow(m_hWindow); return TRUE; } LRESULT GameEngine::HandleEvent(HWND hWindow,UINT msg,WPARAM wParam,LPARAM lParam) { //将Window消息传递给游戏引擎成员函数 switch(msg) { case WM_CREATE: //设置游戏窗口并且开始游戏 SetWindow(hWindow); GameStart(hWindow); return 0; case WM_SETFOCUS: //激活游戏并且更新休眠状态 GameActivate(hWindow); SetSleep(TRUE); return 0; case WM_KILLFOCUS: //停用游戏并且更新游戏状态 GameDeactivate(hWindow); SetSleep(TRUE); case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC =BeginPaint(hWindow,&ps); //绘制游戏 GamePaint(hDC); EndPaint(hWindow,&ps); return 0; case WM_DESTROY: //结束游戏退出应用程序 GameEnd(); PostQuitMessage(0); return 0; } return DefWindowProc(hWindow,msg,wParam,lParam); } ------------------------------------- BLIZZARD.H代码: //应用程序 #pragma once //包含文件 #include <windows.h> #include "Resource.h" #include "GameEngine.h" //全局变量 GameEngine * g_pGame; RECT g_rcRectangle; ----------------------------------- GameEngine.h全部代码: #pragma once #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow); LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); //引擎函数说明 BOOL GameInitialize(HINSTANCE hInstance); void GameStart(HWND hWindow); void GameEnd(); void GameActivate(HWND hWindow); void GameDeactivate(HWND hWindow); void GamePaint(HDC hDC); void GameCycle(); //GameEngine类 class GameEngine { //成员变量 protected: static GameEngine * m_pGameEngine; HINSTANCE m_hInstance; HWND m_hWindow; TCHAR m_szWindowClass[32]; TCHAR m_szTitle[32]; WORD m_wIcon,m_wSmallIcon; int m_iWidth,m_iHeight; int m_iFrameDelay; BOOL m_bSleep; public: //构造函数及析构函数 GameEngine(HINSTANCE hInstance,LPTSTR szWindowClass,LPTSTR szTitle, WORD wIcon,WORD wSmallIcon,int iWidth=640,int iHeight=480); virtual ~GameEngine(); //常规方法 static GameEngine * GetEngine(){return m_pGameEngine;}; BOOL Initialize(int iCmdShow); LRESULT HandleEvent(HWND hWindow,UINT msg,WPARAM wParam,LPARAM lParam); //访问方法 HINSTANCE GetInstance(){return m_hInstance;}; HWND GetWindow(){return m_hWindow;}; void SetWindow(HWND hWindow){m_hWindow=hWindow;}; LPTSTR GetTitle(){return m_szTitle;}; WORD GetIcon(){return m_wIcon;}; WORD GetSmallIcon(){return m_wSmallIcon;}; int GetWidth(){return m_iWidth;}; int GetHeight(){return m_iHeight;}; int GetFrameDelay(){return m_iFrameDelay;}; void SetFrameRate(int iFrameRate){m_iFrameDelay=1000/iFrameRate;}; BOOL GetSleep(){return m_bSleep;}; void SetSleep(BOOL bSleep){m_bSleep=bSleep;}; }; ------------------------------- resources.h代码: //{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by Blizzard.rc // #define IDI_ICON1 1000 #define IDI_ICON2 1001 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ------------------- 以上是写的代码。运行没问题。可是得不到对应结果。。。 对了,两个资源都是网上下载的随机图标,是用来使用在窗口上的小图标用的。 ==下马上贴下自己的运行结果。
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
sd4039924机器人#1 · 2009/9/14
【 在 sd4039924 的大作中提到: 】 : [QUOTE]哎。。这个游戏代码是一本书上的,但是我在实现之后与书上画出的结果完全不同。在书上,画出的是定时出现黄圈并且用线相连,但是自己的却不知道为什么失去了效果。请教大牛们。下面是全部的代码: : ------------------------------------- : BLIZZARD.CPP全部代码: : ................... 附件(224.1KB) 11.exe
sd4039924机器人#2 · 2009/9/14
【 在 sd4039924 的大作中提到: 】 : [QUOTE]哎。。这个游戏代码是一本书上的,但是我在实现之后与书上画出的结果完全不同。在书上,画出的是定时出现黄圈并且用线相连,但是自己的却不知道为什么失去了效果。请教大牛们。下面是全部的代码: : ------------------------------------- : BLIZZARD.CPP全部代码: : ................... 附件(13.7KB) QQGame.ico 附件(12.6KB) earth.ico 这是那两个加载的图标: