基于2D游戏引擎的设计
擎各功能模块,设置游戏帧频等游戏初始化工作
void GameStart(HWND hWindow);
// 创 建 各 种 游 戏 对 象 , 开 始
游戏
void GameEnd(); //游戏结束,清理内存对象
void GameActivate(HWND hWindow); //激活游戏(如还原游戏窗
【关键词】2D 游戏;引擎;稳定性;可扩展性 Engine designing basing 2D game XIAO Zhou-fang ,ZHAO Da-wei
(School of Computer Science and Technology,China University of Mining and Technology,Jiangsu,Xuzhou 221008,P.R.China ) 【Abstract】The engine is the core of the playing -game software.It includes I/O processing, graphics processing,cartoon processing,audio processing, collision detection, physics system, artificial intelligence and so on.This paper proposes a kind of the design and realization on 2D engine, and using this engine software programmer can develop any kinds of non-network 2D games. 【Key words】2D playing game; engine; stability; scalability
void GameDeactivate(HWND hWindow); //游戏失去焦点(如最小化 游戏窗口)
void GamePaint(HDC hDC);//完 成 游 戏 运 行 过 程 中 各 种 资 源 的 绘 制
void GameCycle(); //负责游戏循环 void HandleKeys(); //处理键盘操作 void MouseButtonDown(int x, int y, BOOL bLeft); //处 理 鼠 标 键 按下 void MouseButtonUp(int x, int y, BOOL bLeft); //处理鼠标键弹起 void MouseMove(int x, int y); //处理鼠标移动 void HandleJoystick(JOYSTATE jsJoystickState); //处 理 游 戏 杆 操作 BOOL SpriteCollision(Sprite* pSpriteHitter, Sprite* pSpriteHittee); // 处理子画面碰撞 void UpdateSaucer(); //更新子画面 void SpriteDying(Sprite* pSpriteDying); //处理子画面的消亡 程序员借助 2D 游戏引擎的其它功能模块接口实现以上全局接口 就完成了一个 2D 游戏的开发。 3.2 图像处理模块的实现 图像处理模块负责将位图资源(或其它图像资源)加载到内存并 显示到显示器上。 其接口如下所示: // 构 造 函 数
1.引 言
随着社会物质生活水平的提高及计算机技术的提高,游戏已逐渐 成为人们生活中的一部分 。 2D 游戏作为上个世纪的产物已经发展了 很长的时间,其技术已逐渐趋于成熟,这要归功于引擎技术的发展。 游 戏引擎在游戏程序中处于核心地位,驱动着游戏软件的顺畅运行。 在 市面上已经有了很多非常成熟的游戏引擎,很多成功的游戏就是基于 这些引擎构建的。 本文将讨论基于 2D 游戏引擎的设计与实现。
2D 游戏引擎由多个子系统组成, 如和用户进行交互的输入输出 系统、音效处理系统、图像处理、动画处理、碰撞检测、物理系统和人工 智能等,如图 1 所示。
各个子系统向外界提供实现相应功能的接口。 另外,2D 游戏引擎 中还负责维护游戏初始化、启动、结束、激活、停用、绘制、循环的全局 接口。 程序员可以借助这些子系统接口调用子系统实现的各种独立功 能和实现全局接口来开发各类 2D 游戏。
能进行了测试,测试表明,引擎的性能令人非常满意。
3.5 音效处理模块 此模块负责处理游戏中的声音播放。 动听真实的声音往往让玩家 有一种身临其境的感觉,可以使玩家完全参与到游戏中来。 实现音乐 和音效处 理 , 我 们 用 到 的 是 DirectX 中 的 DirectMusic 和 DirectSound 库 ,DirectMusic 是 控 制 音 乐 播 放 的 ,DirectSound 是 控 制 音 效 的, 它 是 一种新的基于 DLS 数据的实时音乐编排和回访技术。 操作 DirectSound: (1) 初 始 化 DirectSound 声 明 DirectSound 对 象 调 用 Direct SoundCreate( )创建 DirectSound( )对象。 (2)设 定 协 作 等 级 ,调 用 SetCooperativeLevel( ) 函 数 ,Direct-Sound 一共有四个协作等级:普通级、优先级、排它级和 White_Primary 级。 (3)建立缓冲,声明 DirectSound 缓冲,调 CreateSoundBuffer( )来创 建缓冲对象。 (4)把声音写入缓冲,锁定(Lock( )) 、写入、解锁(Unlock( )) 。 (5)控制声音播放:播放声音,调用 play( )函数;停止播放声音,调 用 stop ( ) 函 数 ; 控 制 音 量 , 调 用 SetVolume ( ) 函 数 ; 调 整 频 率 , 调 用 SetFrequency( )函数;改变声道平衡,调用 SetPan( )函数。 3.6 碰撞检测模块 此模块负责动画的碰撞检测。 碰撞探测是物理系统的核心部分, 它可以探测游戏中各物体的物理边缘。 当两个物体撞在一起的时候, 这种技术可以防止它们相互穿过, 这就确保了当你撞在墙上的时候, 不会穿墙而过,也不会把墙撞倒,因为碰撞探测会根据你和墙之间的 特性确定两者的位置和相互的作用关系。 由于这与具体游戏有关,所 以只留一个接口,具体实现由编程人员完成。 3.7 物理系统模块 引擎的另一重要功能是提供物理系统,这可以使物体的运动遵循 固定的规律,例如,当角色跳起的时候,系统内定的重力值将决定他能 跳多高,以及下落的速度有多快,子弹的飞行轨迹、车辆的颠簸方式也 都是由物理系统决定的。
// 图 像 BOOL Create (HDC hDC, int iWidth, int iHeight, COLORREF crColor); //创建单色
// 文 件 void DrawPart (HDC hDC, int x, int y,int xPart,int yPart,int wPart, int hPart, BOOL bTrans = FALSE, COLORREF crTransColor = RGB (255, 0, 255)); //绘制部分图像 void Draw (HDC hDC, int x, int y, BOOL bTrans = FALSE, COLORREF crTransColor = RGB(255, 0, 255)); //绘制图像 int GetWidth() { return m_iWidth; }; //返回位图宽度 int GetHeight() { return m_iHeight; }; //返回位图高度
75
科技信息
○IT 技术论坛○
SCIENCE & TECHNOLOGY INFORMATION
2008 年 第 30 期
以上是图像处理模块的接口,限于篇幅详细实现从略。 3.3 输入输出模块实现 此模块负责处理与用户交互的输入输出。 用户参与到游戏中主要 是通过该模块来实现, 因此该模块的设计和玩家的感受联系最为紧 密,有必要慎重考虑。 DirectInput 是 DirectX 中的一个很重要的组件, 提供对输入数据快速、灵活、高效的访问,这些输入数据可以是键盘、 鼠标、游戏杆等。 DirectInput 可以不依赖 Windows 的消息而直接用 硬 件驱 动 实 现 数 据 的 输 入 ,所 以 它 比 Win32 API 更 快 、更 灵 活 的 访 问 输 入设备。 3.4 动画处理模块 动画处理模块是 2D 游戏中的核 心 部 分 ,负 责 整 个 游 戏 中 动 画 的 实现。 2D 动画有帧动画和形状动画。 所谓帧动画是指将游戏中的每一 帧都做成一张图像,这就像电影胶片一样,通过以一定频率播放这些 胶片产生动画效果。 形状动画则是通过改变图像的坐标来实现动画效 果。 两种动画类型各有优缺点,前者可以产生较为真实的动画但需要 的图像资源多,后者需要的图像资源少但动画效果不真实。 在本游戏 引擎中,采用两种动画类型的结合,循环使用一组图像来实现动画,如 图 2 所示为人奔跑的一组图像,循环播放此组图像就可以实现奔跑效 果 [2]。
3.8 人工智能模块 引擎中的人工智能模块为游戏中的非玩家控制角色的行为和决 策提供智能支持, 游戏中人工智能在现代游戏引擎中越来越重要,它 直接影响到游戏的可玩性和游戏设计的复杂性。 图 3 给出了人工智能 模 块 的 基 本 布 局 [3]。
图 3 人工智能模块的基本布局
图 2 人奔跑图像
4.引 擎 测 试 通过以上方法我们具体实现了一个 2D 游戏引擎, 并对引擎的性
2.2D 游戏引擎的分析与设计 一 款 出 色 的 2D 游 戏 引 擎 系 统 往 往 可 以 给 游 戏 程 序 员 带 来 很 大 的便利。 设计和编写基于引擎的 2D 游戏的程序员可以专心于游戏逻
辑的编写,而不用花费太多的时间去做些琐碎的编程工作,这不仅可 以提高游戏软件开发效率,而且可以提高游戏软件的稳定性和可扩展 性(即游戏软件的升级)。