Posted on 2009-11-27 08:36
hyf 阅读(1179)
评论(0) 编辑 收藏 引用 所属分类:
Game Design
ASL游戏引擎,是个人创作的2d游戏图像引擎,学习一下。
//09-11-1
//注1///////////////////////////////////////////////////////////////////////////
内存泄漏检测方法:
使用debug模式下的除错函数
首先要
#define _crtdbg_map_alloc
#include "stdlib.h"
#include "crtdbg.h"
然后调用_CrtDumpMemoryLeaks()输出调试信息,输出内存泄露信息
一般是在程序结束时调用,如果结束点不止一个,为防止疏忽,可以在程序开始时调用
_CrtSetDgbFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 会在程序结束时自动调用_CrtDumpMemoryLeaks()
////////////////////////////////////////////////////////////////////////////////
引擎的入口时ASLWinApp的应用程序框架类,封装了Win32程序基本框架
首先该类的构造函数设置了一个自己的全局指针,然后调用_CrtDumpMemoryLeaks()设置内存泄漏检查(注1)。
初始化函数Init设为纯虚函数,为用户设置个人信息所设计
该类主要封装窗口创建、程序运行、消息循环等功能,用户继承并重写Init和OnIdle函数已实现开发
Create()是创建应用程序的函数,其中注册了窗口类(先检查CPU是否支持MMX命令,应该使用到了汇编优化)并创建了窗口,其中需要注意的是哟哦那个AdjustWindowRect调整了实际工作区窗口大小,用SystemParametersInfo取得了屏幕工作区位置并在其中间的位置设置窗口。最后,初始化了Screen,input,audio和gui的管理类。
Run()函数是程序主要执行模块,首先是更新计时器,然后是消息循环,然后是利用计时器的卡帧操作,最后是按input,gui,OnIdle和screen执行程序逻辑
再说一下消息处理函数_WndProc,首先把消息给input过一遍,然后处理了一些消息,重要的有根据m_bShowCursor决定是否显示光标、根据WM_ACTIVATEAPP在自己窗口被激活或其他窗口继红时开关Application的m_bActive和计时器的Active,其他还有常规的WM_PAINT和程序关闭时的WM_DESTROY与WM_CLOSE。
ASLWinApp预留了Init,OnIdle和OnClose与OnActivate处理初始化、游戏进程、游戏关闭判断和激活消息处理
////////////////////////////////////////////////////////////////////////////////
ASLBitmap为位图类,貌似使用了汇编优化
首先定义了一些常用颜色和不同深度颜色之间的转换函数。(貌似用的是565的16色)
然后定义了一些列GDI相似的函数
创建位图的时候用了GDI,把相关内存设备描述表拉伸模式设置为COLORONCOLOR删除像素,拉伸删除所有原信息。
绘制时在各表面间使用了数据块进行保存,只有最后一次绘制到主表面使用GDI函数。
////////////////////////////////////////////////////////////////////////////////
ASLInput封装了键盘和鼠标信息,每次Update截取当前键盘状态,并且用多个队列保存上次Update后按下和松开的键,可以查询指定键是否刚被按下。
////////////////////////////////////////////////////////////////////////////////
ASLScreen类管理当前屏幕,由于DirectDraw的唯一性,所以用Singleton实现(全局唯一实例)。
继承自ASLBitmap,在此基础上加入DirectDraw组件,实现向屏幕绘制的功能和切换窗口/全屏的函数。
SetWindowLong(HWND hwnd, int nindex, LONG dwNewLong);
改变指定窗口的属性
IDirectDraw7::WaitForVerticalBlank(DWORD, HANDLE)将等待知道屏幕垂直刷新信号到来(显示频的刷新周期)
////////////////////////////////////////////////////////////////////////////////
ASLTimer使用硬件内置的高精度计时器计时
////////////////////////////////////////////////////////////////////////////////
ASLIni读写ini文件
.ini文件格式如下
////////////////////////////
[段1]
键1=值1
健2=值2
...
[段2]
键1=值1
键2=值2
...
/////////////////////////////
该类用链表将文件按行存放,记录每段的起始位置
////////////////////////////////////////////////////////////////////////////////
ASLFont字体类,用LRU算法管理字符信息缓存,只在第一次绘制的时候使用GDI将字体信息写入缓存,之后只用从缓存中直接读取信息,缓存不够时替换使用频率最小的部分即可。
字体缓存从两种渠道取得,当不需要平滑过渡时直接用GDI将字体写入内存描述表,然后取得字体信息,需要平滑过渡时直接用API取字符的alpha数据。
////////////////////////////////////////////////////////////////////////////////
ASLSound对DirectMusic组建的Segment对象进行了封装。
ASLAudio队DirectMusic的Perform以及loader和ASLSound链表进行管理
////////////////////////////////////////////////////////////////////////////////
ASLGui类为GUI系统管理类,使用Singleton实现,可以注册各种控件,维护控件链表和单选按钮链表。