ASL引擎代码阅读笔记

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实现,可以注册各种控件,维护控件链表和单选按钮链表。




只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理