返回信息流[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
-------------------
以上是写的代码。运行没问题。可是得不到对应结果。。。
对了,两个资源都是网上下载的随机图标,是用来使用在窗口上的小图标用的。
==下马上贴下自己的运行结果。
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35667同步于 2009/9/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
部分游戏代码疑问:请教大牛。。[求助]
sd4039924
2009/9/14镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
【 在 sd4039924 的大作中提到: 】
: [QUOTE]哎。。这个游戏代码是一本书上的,但是我在实现之后与书上画出的结果完全不同。在书上,画出的是定时出现黄圈并且用线相连,但是自己的却不知道为什么失去了效果。请教大牛们。下面是全部的代码:
: -------------------------------------
: BLIZZARD.CPP全部代码:
: ...................
附件(224.1KB) 11.exe
【 在 sd4039924 的大作中提到: 】
: [QUOTE]哎。。这个游戏代码是一本书上的,但是我在实现之后与书上画出的结果完全不同。在书上,画出的是定时出现黄圈并且用线相连,但是自己的却不知道为什么失去了效果。请教大牛们。下面是全部的代码:
: -------------------------------------
: BLIZZARD.CPP全部代码:
: ...................
附件(13.7KB) QQGame.ico
附件(12.6KB) earth.ico
这是那两个加载的图标: