在游戏编程中,迷宫和精灵是两个核心的组成部分,它们为游戏提供了丰富的交互性和动态效果。本文将介绍如何使用DirectX技术来实现迷宫类(CMaze)和精灵类(CSprite),以及它们在游戏开发中的应用。
迷宫类(CMaze)负责读取文本文件并显示迷宫。构造函数接受一个纹理名称,该纹理将用于显示迷宫的线条。
CMaze(char* pszTextureBMP);
通过调用LoadMaze方法来加载文本文件。迷宫文本文件的格式如下:
(Name)
(Number of Horizontal lines)
(Vertical Coord) (Horiz Coord Start) (Horiz Coord End)
...
(Number of Vertical Lines)
(Horiz Coord) (Vert Coord Start) (Vert Coord End)
...
(Number of Deploy points)
(Deploy Point X) (Deploy Point Y)
...
其中,Name是迷宫级别的名称,将在游戏底部显示。水平和垂直线条用于在游戏内显示迷宫。Deploy points是敌人或食物出现的点。
纹理的尺寸决定了迷宫类给出的线条宽度。如果调用DisplayGrid方法,将看到迷宫屏幕是如何被划分的。如果部署位置是1,1,那么实际的屏幕位置是(1* WidthOfTexture, 1 * HeightOfTexture)。要查看部署位置,需要调用DisplayDeployRects方法,并传递精灵的大小,以便它为绘制一个矩形。
DisplayDeployRects
IsHit方法接受一个矩形,并返回true,如果它与迷宫中的任何线条发生碰撞。线条实际上是一个矩形,其尺寸由纹理大小决定。
IsHit
GetPathFindingArray方法接受一个数组,并根据是否有线条填充1或0。这在创建一个表示迷宫的数组时非常有用,以便与寻路算法一起使用。虽然这个游戏没有使用这个功能,但如果与寻路算法结合使用,可以使游戏变得非常困难。
GetPathFindingArray
精灵类(CSprite)是游戏中最有趣的类。它负责动画和移动精灵。可以通过调用CreateSprite方法来创建一个精灵。
void CSprite::CreateSprite(CSurface** ppSurface, long nType, long nHeight, long nWidth)
表面包含精灵的图像,Type是用户定义的数据,给出了精灵的尺寸。
精灵可以有不同的状态,如向左走或向右走。可以通过调用AddState方法来添加所有不同的状态。
void CSprite::AddState(
long nState, POINT ptFrame,
long nNoOfFrames,
long nDelay,
RECT* prcBound, LPTSTR pszSound,
bool bLoopSound)
nState是用于识别这个状态的方式。稍后会调用SetState方法来设置这个状态。ptFrame是Surface上包含这个状态的第一个图像的点。不需要在这里给出尺寸,因为它对于一个精灵是固定的,已经在创建精灵时给出了。nNoOfFrames是这个状态的帧数。例如,如果向左走有三个动画图像,那么nNoOfFrames将是3。nDelay是动画更改的速率。nDelay是一个时间单位,这个单位由update方法被调用的频率决定。可以将这个单位视为游戏脉冲。游戏可能有每秒60个脉冲,这完全取决于主游戏循环多久调用一次精灵的update方法。prcBound是用于碰撞检测的边界矩形。当调用IsHit时,如果给定的矩形与边界矩形相交,则为命中。每个状态也可以有与之关联的声音。
void CSprite::SetAnimBiDir(bool bIsAnimBiDir)
用于使动画帧双向。如果动画有4帧,那么顺序将是1 2 3 4 3 2 1,如果设置为true。
void CSprite::EnableBorder(bool bDraw = false)
显示精灵的边界和边界矩形。这对于调试非常有用。
Movement结构控制移动。m_dx和m_dy是精灵应该移动的速率和方向。它调用m_pfnCollision指向的函数来查看新位置是否空闲。如果发生碰撞,那么调用m_pfnFindPath指向的函数来获取新的移动方向。
struct SMovement {
long m_dx,m_dy;
long m_nMoveDelay;
long m_nCurrMoveDelay;
bool (*m_pfnCollision)(RECT& rcRect);
long m_nInvulnerable;
long m_nPathFindDelay;
long m_nCurrPathFindDelay;
void (*m_pfnFindPath)(CSprite* pSprite);
} m_Movement;
m_nInvulnerable是精灵不应该被杀死的延迟时间,并且精灵会在显示中闪烁。m_nPathFindDelay是调用寻路函数以更新移动方向的速率。如果需要Update自动移动精灵,那么fnCollision和fnFindPath应该指向某个函数。如果没有一种方法知道给定位置是否有效,那么移动精灵就没有意义。Update应该在游戏循环中每次调用所有精灵。这负责更新精灵的位置和动画。
可以通过调用SetState(ST_KILL)来杀死一个精灵,这将立即调用m_pfnKill指向的函数。这个函数是可选的。原型是:
bool fnKill(CSprite* pSprite);
如果fnKill返回false,状态不会被设置为KILL,SetState返回。在这个游戏中,这个函数被用来在玩家触摸门时进入下一个级别。如果Kill继续进行,那么它将显示死亡动画,一旦完成,它将调用m_pfnDead指向的函数,其原型是:
void fnDead(CSprite* pSprite);
可以使用这个函数来更新分数,创建一个新的敌人等。最后,
void CSprite::Draw(LPDIRECTDRAWSURFACE7 pdds)
将精灵绘制到给定的表面上。