<<游戏编程入门>> 01 - 使用引擎与加载资源

 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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值