- 博客(26)
- 收藏
- 关注
原创 组件架构的动态链接库实现方式
<br />最近技术总监让我用动态链接库的方式将ShinyNova新版聊天框集成到大厅中,以降低大厅对ShinyNova引擎的依赖。<br />研究了一整天动态链接库相关,顺便看了看QQ的插件文件结构。我猜测他的每个插件都是显式加载的,在dll的声明中把几个标准的入口函数都声明成成标准名:如“IniPlugin()”。这样只需要一个配置文件来保存插件dll名,甚至用搜索文件目录的方式就可以自动加载所有的插件。<br /> <br />由此想到wow加载lua脚本插件的方式应该类似。<br />
2010-11-08 15:40:00
163
原创 标准化实体
<br />随着gss项目的进行,发现实体之间混乱的关系使得维护和开发的难度越来越大。实体之间松散的联系虽然得到了开发的自由度,但代价同样巨大。往往为了一些简单的功能,不大不花费大量的精力协调实体之间的关系。为了解决这个问题,打算在原有的基础上,增加一种物体属性:<br />OBJECT_FLAGS_STANDARD //标准化<br /> <br />满足标准化的实体应该是满足下列条件的:<br />1.一个标准化实体的所有子代都是标准化的。<br />2.标准化实体的子代图层总是位于父体之上,同时关联
2010-11-04 14:08:00
178
原创 鼠标选取实体一二
<br />在xyBackPaint中,当移动鼠标时,内核从下到上分析所有视域内实体,选中最上层的实体。<br />简单明了,但未必实用。很简单的例子,就是一个控件,框体需要处理鼠标移动的消息,但之上的按钮未必需要反应。因为只选中最上层物体,所以当鼠标移动到控件子按钮上时,控件就收到了UNTOUCH消息,而异常中断了对鼠标移动的处理。<br /> <br />理想的方式是,首先检索所有的父实体。<br />命中父实体后,再在父实体内寻找子实体。<br />ShinyNova目前的处理方式是,检索所有具有OB
2010-11-04 11:32:00
228
原创 MFC::GetDC(),ReleaseDC()导致的内存泄漏
<br />昨天发现自己的游戏运行时内存一直缓慢增长,但是结束的时候检查不到内存泄漏。<br />今天又调试了5个小时,发现是在OnPaint()里面GetDC()和ReleaseDC()造成的。<br />但是同样的使用情况,在xyBackPaint里面又没有发现过类似问题。<br />后来查了下百度,发现这是MFC的一个BUG并且一直未修正,ReleaseDC()时只释放了GDI对象,未释放内存。<br /> <br />具体参见:http://support.microsoft.com/kb/8196
2010-08-24 15:06:00
1168
原创 ShinyNova中的焦点交互处理问题
<br />最近碰到一个难题,假设我们希望某个控件在失去焦点时隐藏,同时这个控件可以被某个按钮触发显示。<br />想起来很简单,处理下失去焦点的消息MSG_INPUT_LOST_FOCUS和在按钮触发时判断下控件的显示状态,并调整到相反状态就可以了。<br />但问题是,点击按钮本身会让控件失去焦点,于是控件状态已经切换了,在按钮处理消息时再反状态,于是负负得正。。。囧。<br /> <br />和其他同事讨论了下这个问题,有人提出可以用参数来同步。这个办法不是不可以,但是有很多弊端。例如,当手动隐藏这个
2010-08-02 11:30:00
242
1
原创 第十章,ShinyNova中资源调用方式
游戏开发的程序员经常会为资源管理而犯愁,尤其是资源量较大时。什么是最理想的开发模式?我们把资源放到指定目录下,就可以直接按资源名使用,无须定义资源ID,也不用什么配置文件。考虑到内存空间占用,最好能按需要加载,而不是一股脑靠近内存中,甚至能够自动将长时间未使用的内存自动清理。(未完)
2010-06-25 17:33:00
172
原创 第九章,PPS图片格式与SNG_PIC结构
<br /> 对于2D游戏引擎来说,如何储存和使用图片是非常关键的问题。我们首先分析一下当前市面上通用图片格式的优缺点,主要考虑以下几点:是否支持透明,是否支持半透明,是否支持调色板,是否支持多帧格式,储存空间占用。<br /> <br /> bmp 支持调色板,储存空间大<br /> png 支持透明,支持半透明,储存空间小<br /> gif 支持透明,支持多帧,支持调色板,储存空间小<br /> <br /> 从游戏开发程序员的角
2010-06-25 17:27:00
388
原创 第八章,真正的开始,逻辑组织者CClassSenior
<br /> 前面我们介绍了实体PObject,并且说明游戏的逻辑将在PObject内展开。我们的目标是资源加载,音乐播放,流程设计都可以用尽量简短的语句完成以加快开发速度。但作为物理实现和逻辑实现的共同基类,PObject又不适合太过复杂。因此类似于BITObject和PlaneObject,我们制作了一个专用于游戏逻辑组织的PObject派生类:CClassSenior,集成了游戏开发需要的主要功能。
2010-06-24 14:34:00
155
原创 第七章,流程与动画
假设现在我们要在视域中播放一组gif动画,时长20秒播放3遍,应该怎么办?唔,毫无疑问,你应该有个定时器,固定时间间隔检测一下是否跳转到一下帧。好的,现在我们要播放一百组这样的gif动画,在屏幕的不同地方,他们的起始时间和播放次数都不尽相同,有些快有些慢。。。相信你一定囧到了。 另举一例,假设我们要使一个物体加速前进,初始速度v,加速度a,直到命中目比地(x,y)为止。这两个例子的共同点是:我们想要达到的效果是确定的,但却不能在当前时刻立即完成,需要有一个模块(函数)来定时更新状态。我们
2010-06-24 13:48:00
184
原创 第六章,BITObject与PlaneObject
<br /> 读到本章前,读者或许会有一些疑惑:笔者将实体描述得很玄乎,可以构成游戏世界的基础,却丝毫没有提及到资源的应用。一个游戏能够离开图片资源而存在吗?答案是,当然不能。本文将介绍在ShinyNova中图片资源如何与实体结合工作。<br /> PObject是一个纯粹的逻辑概念,仅能描述物体的性状而不包含任何资源信息,因此PObject本身是不可见的。BITObject与PlaneObject是PObject最重要的两个派生类,可以接受资源信息,并将其显示出来。<br />
2010-06-22 10:59:00
201
原创 第五章,消息相关
<br /> 如同前文所说,在任何一个PObject的派生类中可以使用SendMsg和PostMsg向其他实体发送消息。关于消息号定义和处理,ShinyNova有一些相关规范。系统占用的消息号定义于ShinyNovaQuest.h中,用户自定义的消息号应该从 MSG_CUSTOMER_BEGIN = 80000000开始。<br /> 通过消息发送指针时,如果该指针需要在使用后清理,清理工作应由接受实体完成。但系统自动转发输入外设消息中附带在param2上的 MOUSEDATA指针
2010-06-22 09:41:00
187
原创 第四章,如何获取并处理外设输入(INPUT)
游戏开发少不了处理鼠标键盘手柄等外设输入消息。比较传统的做法是,截取windows系统消息,如WM_MOUSEMOVE,WM_LBUTTONDOWN等,然后对游戏数据进行分析:当前坐标位于什么物体之上,应该做出何种反应。这是一件非常复杂而繁琐的事情,你必须首先搞清楚物体的相互遮掩关系,如果要透过图像中的透明区域点选到背景物体则更加令人头疼。 ShinyNova的基础思想是面向对象化,一切面向实体。为了达到快速,便利开发的目标,我们必须把: 点在哪里--->点到什么物体上--->该物
2010-06-21 11:32:00
321
原创 第三章,实体(PObject)
如前文所述,实体是构成游戏的基础,不仅仅是最基础的显示单元,也是最基础的逻辑单元。用一个装B的说法,实体的二向性。 ShinyNova内核中最重要的模块ObjectModule负责维护所有的实体。通常我们会在引擎外部创建一个实体并注册到内核作为游戏逻辑的母体,而之后的开发过程将全部封装在母体内部进行,例如: class CMyGame:public PObject { ... } m_core.RegistNewObject(n
2010-06-20 15:42:00
303
原创 第二章,ShinyNova如何描述世界?
我们试图用最简单的三个概念将这个精彩纷呈的世界描述清楚,并依照这三个基本概念来设计我们的游戏。 毫无疑问,实体是最基础的。你,我,阿猫阿狗都是实体,各种简单的实体复杂的组合在一起构成了我们眼中的画面。但我们的游戏不是油画,什么东西使我们的世界“动”了起来? 是什么驱使你拿起水杯?是什么驱使风拂动柳叶?是什么让你的脸红了起来...当面对着“她”。我们不妨把这种动力称为“刺激”,又或者更专业化的名词“消息”。当实体收到消息进而将反应以消息的形式扩散出去的时候,我们的世界荡漾了起来。 然而我们
2010-06-07 16:47:00
212
原创 第一篇,ShinyNova为什么而生.
“好的,让我们开始做这个游戏吧!” “唔,它应该支持3-5万人同时在线!” “画面应该相当华丽,操作要绚,怪要傻!” “随机掉宝,锻造插孔,宠物系统,玩家可以结婚生子!” “。。。。。。” 也许我们花费了一整天美丽的时光来幻想这个游戏应该如何精彩如何吸引玩家,但当你终于决定动手去做的时候却发现,梦想与现实之间的鸿沟是如此之巨大。当你埋头编写几个像素贴图,在画面某个角落打上黄色字符串提示玩家输入帐号时,你会发现这与初衷已经全然不同。游戏是如此的精彩,而实现过程是如此之枯燥无趣,大量的
2010-06-03 13:50:00
298
原创 比赛系统注意细节
1.replay图标放在D:/matchchannel/share/Image/common下,注意提醒凯哥添加资源replayico.ico2.
2010-05-26 15:38:00
133
原创 进程为什么不断收到OnMouseMove,即便拔掉鼠标
今天碰见如上很奇怪的问题,后来发现,原来我在检查鼠标是否位于窗口内的函数中,调用了: while(::ShowCursor(TRUE) 根据Windows的设置,显示或隐藏光标时都会重新发送一次OnMouseMove。
2010-05-25 16:51:00
197
原创 CFileDialog相关
CFileDialog会改变当前目录。我在处理的时候,是取得了程序运行目录,然后在那个目录下创建了文件。今天查了MSDN得知,在创建CFileDialog对象的时候,加入OFN_NOCHANGEDIR标志,可以使得文件不改变当前目录。 CFileDialog dlg(TRUE,"*.tcrep" //默认类型名,"
2010-05-20 16:12:00
152
原创 创建目录CreateDirectory使用说明
原型:BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); 注意,只能创建一层目录,如c:/aaa/bbbb.当aaa不存在时就会创建失败。必须用递归的方法一层一层创建下去。具体参见PglCommon.h里面的BulidDirectory函数
2010-05-19 17:11:00
631
原创 比赛系统开发计划表(2010年6月2日修改)
2010-05-13玩家淘汰退出流程 预计工期1工作日2010-05-14比赛结果客户端显示 预计工期1工作日2010-05-17比赛结束流程 预计工期2工作日2010-05-18比赛复盘及上传系统
2010-05-13 11:17:00
327
1
原创 字体加载及使用
1.使用 AddFontResource 把您的字体送入 Windows 字体列表。 2.使用 SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0) 广播通知。 3.这时候开始,您的字体才可以随意使用。 4.使用 RemoveFontResource 从 Windows 字体列表删除您的字体。 5.SendMessage(HWND_BROADCAST,W
2010-05-11 10:54:00
197
原创 资源对照表
ScorllBar_VertBack 垂直滚动条背景ScrollBar_VertBtn 垂直滚动条按钮ScrollBar_VertDownBtn 垂直滚动条下翻按钮ScrollBar_VertUpBtn 垂直滚动条上翻按钮ScrollBar_VertPattern 垂直滚动条花纹 ScorllBa
2010-05-06 10:05:00
136
原创 游戏结束的自我清理可能造成轻微的内存泄漏
最近8byte的内存泄漏查到崩溃,各种工具都尝试了,vld库,boundschecker,都无法检查出原因。最终发现是这样,在结束游戏的时候,聊天框控件在自我清理中发出了一个带8byte数据的申请(StopApply)。但在系统清理过程中,跳过了对这些申请的执行,所以造成内存泄漏。这种情况应该是无法避免的,也是允许的不用深究。
2010-04-30 10:38:00
175
原创 如何导出VC6.0路径环境为注册表
运行-->regedit。HKEY_USER/你的操作系统/Software/Micosoft/Devstudio/6.0/BulidSystem/Components/Platfoms/Win32(x86)/Directories,右键导出。
2010-04-29 19:08:00
304
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人