首先,我们先介绍一下游戏场景的概念。
例如,在飞机大战游戏里面,就分为两个场景。
- 开始菜单
- 主游戏
开始菜单场景中,有一张背景图片,和两个可以选择的按钮。主游戏场景就是正常的游戏运行场景,玩家控制英雄飞机发射子弹射击敌人飞机。
从上面的描述中,可以看出:每个场景当中包含多个精灵,并且这些精灵可能互相影响。比如:子弹击中敌机,英雄撞击敌机。
目前我们仅实现了让一个精灵在游戏循环中显示与更新。比如刚刚的单独渲染英雄和背景。
源文件gameloop.cpp
#include "gameloop.h"
#include "sprite.h"
#include <easyx.h>
void gameLoop(sprite *s, int fps)
{
timeBeginPeriod(1);
LARGE_INTEGER startCount, endCount, F;
QueryPerformanceFrequency(&F);
BeginBatchDraw();
while (1)
{
QueryPerformanceCounter(&startCount);
cleardevice();
// 执行sprite的draw方法
s->draw(s);
// 执行sprite的update方法
s->update(s);
QueryPerformanceCounter(&endCount);
long long elapse = (endCount.QuadPart - startCount.QuadPart)
/ F.QuadPart * 1000000;
// 利用fps计算游戏每一帧之间的时差,注意这里的单位是微秒
while (elapse < 1000000 / fps)
{
Sleep(1);
QueryPerformanceCounter(&endCount);
elapse = (endCount.QuadPart - startCount.QuadPart)
* 1000000 / F.QuadPart;
}
FlushBatchDraw();
}
EndBatchDraw();
timeEndPeriod(1);
}
现在,我们要创建一个场景对象,把需要渲染和更新的精灵集中在这个场景当中。接着,渲染和更新该场景。我们考虑一下,游戏中场景的共性,让我们把它的共性抽取出来。建立成一个新的场景基础对象,这个对象是所有场景对象的父对象。