1 游戏引擎就是写游戏用的公共的代码,可以令游戏开发变得简单.
如果不用引擎, 就要自己创建窗口和消息处理函数等 见 http://blog.csdn.net/a8887396/article/details/9247419
一个简单的引擎有七大功能:
游戏初始化 游戏开始 游戏结束 游戏激活 游戏激死 游戏绘制 游戏循环
2 游戏周期
一般帧数是15-20帧
3 开始项目
(1 ) 新建一个win32空项目
(2) 在头文件和源文件中分别创建空的Blizzard.h 和 Blizzard.cpp 文件, 再选择添加现有项将游戏引擎的头文件GameEngine.h和源文件GameEngine.cpp加进来.
(3) 添加资源
资源文件上右键- 添加资源- 选ICON - 导入
再将两个图标导入进来
并且会自动生成资源文件Blizzard.rc和头文件resource.h
然后通过资源视图可以看到这两个图标的ID 大的将作为桌面图标 小的作为标题栏图标 IDI_ICON1 IDI_IDCON2是它们的资源ID 可以在这里改名字 后面会用到
(4) 利用引擎写一个简单的动画
Blizzard.h
#pragma once
#include <windows.h>
#include "resource.h"
#include "GameEngine.h"
GameEngine *g_pGame;
包含一个预编译指定,表示只包含一次
其他的是几个头文件
还有一个引擎指针的全局变量
之前说过引擎有七大功能 他们们在GameEngine.h中有定义
BOOL GameInitialize(HINSTANCE hInstance);
void GameStart(HWND hWindow);
void GameEnd();
void GameActivate(HWND hWindow);
void GameDeactivate(HWND hWindow);
void GamePaint(HDC hDC);
void GameCycle();
但是需要我们写游戏时 去实现
所以在 Blizzard.cpp 中实现的就是它们
#include "Blizzard.h"
BOOL GameInitialize(HINSTANCE hInstance)
{
g_pGame = new GameEngine(hInstance,TEXT("Blizzard"),TEXT("Blizzard 暴风雪"),IDI_ICON1,IDI_ICON2);
if(g_pGame == NULL)
{
return FALSE;
}
g_pGame->SetFrameRate(15); //每秒GameCycle()运行15次
return TRUE;
}
void GameStart(HWND hWindow)
{
srand(GetTickCount()); //随机种子
}
void GameEnd()
{
delete g_pGame;
}
void GameActivate(HWND hWindow)
{
HDC hDC;
RECT rect;
hDC = GetDC(hWindow);
GetClientRect(hWindow,&rect);
DrawText(hDC,TEXT("Here comes the blizzard"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWindow,hDC);
}
void GameDeactivate(HWND hWindow)
{ HDC hDC;
RECT rect;
hDC = GetDC(hWindow);
GetClientRect(hWindow,&rect);
DrawText(hDC,TEXT("The blizzard has passsed"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWindow,hDC);
}
void GamePaint(HDC hDC)
{
}
void GameCycle()
{
HDC hDC;
HWND hWindow = g_pGame->GetWindow();
hDC = GetDC(hWindow);
DrawIcon(hDC,rand()%g_pGame->GetWidth(),rand()%g_pGame->GetHeight(),(HICON)(WORD)GetClassLong(hWindow,GCL_HICON));
ReleaseDC(hWindow,hDC);
}
一个一个地讲
1 GameInitialize 游戏初始化
BOOL GameInitialize(HINSTANCE hInstance)
{
g_pGame = new GameEngine(hInstance,TEXT("Blizzard"),TEXT("Blizzard 暴风雪"),IDI_ICON1,IDI_ICON2);
if(g_pGame == NULL)
{
return FALSE;
}
g_pGame->SetFrameRate(15); //每秒GameCycle()运行15次
return TRUE;
}
做了两件事情
1 )是创建了一个游戏引擎对象,并将指针赋给全局变量 这个函数是游戏引擎中的构造函数
g_pGame = new GameEngine(hInstance, //游戏窗口句柄
TEXT("Blizzard"), //窗口类名 TEXT是一个表示文本的宏
TEXT("Blizzard 暴风雪"), //标题栏名字
IDI_ICON1, //图标资源 这里放桌面上显示的图标
IDI_ICON2); //这里放标题栏中的图标
2 ) 是设置了游戏的帧数
g_pGame->SetFrameRate(15); 这也是引擎中的函数 15帧表示一秒执行15次GameCyle函数
2 GameStart 游戏开始
void GameStart(HWND hWindow)
{
srand(GetTickCount()); //随机种子
}
设置了一个随机种子,一般游戏都会用到随机数
GetTickCount()是 WINDOWS函数 ,返回值是从1970年1月1日到现在的秒数
3 GameEnd 游戏结束
void GameEnd()
{
delete g_pGame;
}
释放资源 之前new了一个引擎对象 所以在结束时要delete掉
4 GameActivate 游戏激活
void GameActivate(HWND hWindow)
{
HDC hDC;
RECT rect;
hDC = GetDC(hWindow);
GetClientRect(hWindow,&rect);
DrawText(hDC,TEXT("Here comes the blizzard"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWindow,hDC);
}
什么叫激活呢?
游戏开始时 会自动激活.
比如你在玩游戏时 点了其他一个窗口 你就将它激死了 再点游戏窗口 就激活了
为了看到激活的效果,激活时就显示一行字 . 怎么写字 下节会讲 ,这篇只讲流程
5 GameDeactivate 游戏激死
void GameDeactivate(HWND hWindow)
{ HDC hDC;
RECT rect;
hDC = GetDC(hWindow);
GetClientRect(hWindow,&rect);
DrawText(hDC,TEXT("The blizzard has passsed"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWindow,hDC);
}
同理 你在玩游戏时 点其他窗口 游戏窗口失去焦点就激死了
6 GamePaint 游戏重绘
void GamePaint(HDC hDC)
{
}
游戏开始时 会进行一次游戏重绘
将游戏最小化.再打开时又会进行一次游戏重绘
由于要做的动画 不画背景 所以什么都不画
我在这个地方 自己加了个MessageBox 我发现 MessgeBox会执行2次
这里不是很懂 以后看到再回来改
7 GameCycle 游戏循环 每秒15帧 所以每秒执行15次循环
void GameCycle()
{
HDC hDC;
HWND hWindow = g_pGame->GetWindow();
hDC = GetDC(hWindow);
DrawIcon(hDC,rand()%g_pGame->GetWidth(),rand()%g_pGame->GetHeight(),(HICON)(WORD)GetClassLong(hWindow,GCL_HICON));
ReleaseDC(hWindow,hDC);
}
这里面的意思是 随机在面板上画雪图案,也就是我们的图标
有人问 WinMain在哪里 ? 在游戏引擎的源文件里面.
代码 http://download.csdn.net/detail/a8887396/5756331