在游戏开发的世界里,DirectX是一个强大的工具,它允许开发者利用底层硬件资源来创建高性能的游戏。本文将分享一些关于使用 DirectX 开发游戏的经验和技巧,包括游戏引擎的设计、游戏速度的控制以及精确的碰撞检测等。
游戏引擎是游戏开发的核心,它负责处理游戏的运行逻辑、图形渲染、声音播放等。在设计游戏引擎时,目标是简化 Direct Sound 的使用,允许声音被添加到播放器中,并从那里调用。尽管也希望支持 MP3 格式,但找到的代码都是用 C 语言编写的,因此只支持一个 MP3 文件。这是一个遗憾,因为声音和图像占据了下载的大部分。
游戏引擎还负责内存管理,但在关闭时会出现内存泄漏的问题。如果有开发者愿意接手并完善它,将非常欢迎。
游戏速度是游戏体验的关键因素之一。在开发过程中,成功地实现了游戏以最快帧率绘制,并保持恒定速度。这是通过在每次绘制时检查是否已经过去了一定时间来实现的,以便调用移动飞船和陨石的函数。
if (timeGetTime() - m_LastTime > (unsigned int)(30-((m_iLevel>15) ? 30 : m_iLevel * 2))) {
m_LastTime = timeGetTime();
MoveStuff();
}
if (timeGetTime() - m_ShipTimer > 30) {
m_ShipTimer = timeGetTime();
MoveShip();
}
通过这种方式,即使游戏难度增加,陨石移动速度加快,飞船的速度也不会受到影响。
游戏中定义了两个类用于数据存储:
class floatpoint {
public:
float x;
float y;
};
class gameitem {
public:
int Type;
floatpoint ptPos;
float iMoveX;
float iMoveY;
int iSprite;
int iTime;
CRect rcPosition;
};
floatpoint 类用于跟踪飞船的加速度和位置,而 gameitem 类用于跟踪陨石。
为了实现像素级的碰撞检测,采用了与 C# 游戏中相同的方法。这种方法在 C++/DirectX中的实现如下:
while (rcShip.top > 0 && rcAsteroid.top > 0) {
rcShip.OffsetRect(CPoint(0,-1));
rcAsteroid.OffsetRect(CPoint(0,-1));
}
while (rcShip.left > 0 && rcAsteroid.left > 0) {
rcShip.OffsetRect(CPoint(-1,0));
rcAsteroid.OffsetRect(CPoint(-1,0));
}
通过这种方式,可以确保碰撞检测的准确性。