SheRO_0.1-时之深渊发布
一个业余项目,断断续续做了很久,总算做成一个RPG了,可惜本人是一个只会敲代码的理工男,加之个人精力有限,所以这个游戏几乎没有可玩性。现在放出源码,希望能帮助到需要帮助的人吧。
关于源码:
除了界面库使用了CEGUI,其他游戏模块都是自己写的。
素材破解取自网友们的研究成果,自己只做了很小一部分,素材提取代码全部独立在ROInterface.lib里。
有关源码的编译及其他信息请阅读readme.txt。
还有RO素材格式请参阅:http://shallway.net/blog/?p=527
另外介绍一些RO客户端的常用工具:
人物,怪物等图片编辑以及其他工具:http://bbs.rohome.net/viewthread.php?tid=655766
地图编辑器,推荐BrowEdit:http://browedit.excalibur-nw.com/
关于游戏:
2.5D ARPG,素材取自仙境传说RO。
游戏操作:
- 鼠标右键旋转视野
- 鼠标滚轮增减视野
- A键为普通攻击
- S键为辅助技能,施放后,攻击速度*2,移动速度*2,攻击力*2。。
- D键为AOE技能暴风雪(建议显卡不好的童鞋少使用,不然程序会崩掉。。。。-_-)
游戏剧情分为两部分:
第一部分为骑士达西,特点:近战,肉,骑鸟。
第二部分为猎人华莱士,特点:远程,脆皮,DPS。
游戏难度简单,打骑士的技巧就是拉一波仇恨,然后放个暴风雪,基本就清理光了。打猎人的话,不要被围殴,要不死得很快,技巧就是Hit and run。最后打BOSS也是猎人打,多用S技能,不被她碰到就行。
整个游戏避免不了许多BUG,暂时没精力去修正。如果你玩2次,能有一次无崩溃通关,那RP就比较好:)
放上几张截图:
游戏下载:https://sourceforge.net/projects/sherogame/files/abyssoftime.rar/download(63.5M)
源码下载:https://sourceforge.net/projects/sherogame/files/shero0.1.rar/download(9.0M)
项目主页:http://sherogame.sourceforge.net/
最后,这个版本的源码我还是没有整理,注释很少,代码很乱,建议大家选择性阅读。也希望使用此源码的人能把它分享给其他人。
[SheRO]Lua框架搭建的一点思路
脚本的搭建真的是件非常具有创造性的事情,也是游戏开发里最核心的技术活,因为它是整个游戏的发动机,粘合剂,涉及整个游戏的方方面面。一般还集成在地图编辑器里,比如War3,RPGMaker这些。总之,把脚本框架搭好,我个人认为是一个好游戏必备的核心要求。
今天刚把SheRO的Lua框架搭完,觉得用来创作自己的小游戏完全够用了。还是记一些思路吧,仅供参考,不涉及源码及Lua与C++集成这些,因为我觉得这些开源后就能看明白的,而且我用的是LuaPlus。实在没啥讲的。
我在SheRO里暴露给Lua的函数有这些,分为3个模块,GameLogic,GameView,Audio。
GameLogic::GetPos(param) --获得某个Entity的Pos GameLogic::SetPos(param) --设置某个Entity的Pos GameLogic::GetAttribute(param)--获得某个Entity的属性 GameLogic::SetAttribute(param)--设置某个Entity的Pos GameLogic::CreateEntity(param)--创建一个Entity,Npc,Mob等 GameLogic::RemoveEntity(param)--删除一个Entity GameLogic::ChangeEntityState(param)--更换一个Entity的状态机 GameLogic::ChangeMap(param) --更换地图 GameView:Talk(param) --显示一个Npc对话框直到所有语句显示完毕 GameView:AddEffect(param) --显示一个特效 Audio:AddAudio(param) --播放一个音效
注意,param为table类型,所以它里面可以存储很多数据,关于上面函数的细节,可以参阅SheRO源码
有了这些函数后,Lua在SheRO里扮演的角色是:
- Datebase
- 地图初始化
- 触发器
- AI
下面逐个简单介绍下:
1,Database
其实,我用Lua作数据库纯粹是取巧,对于SheRO来说,目前整个游戏就几个种类的怪物,用Lua来存储信息足够了。不过比较好的方法是用自定义二进制格式存储。
在SheRO里,我用的是一个table存储一个Entity的信息,实际上所有数据我都用的table。比如对于Mob1,它的数据如下:
Mob1=
{
EntityType = "mob",
VisualData = "data\\sprite\\阁胶磐\\wish_maiden",
typeId = 1,
Attribute =
{
fov=14,--视野
fof=4,--攻击距离
walkSpeed=14,--移动速度
atkSpeed=60,--攻击速度
hp=10000,
maxHP=10000,
mp=2000,
maxMP=2000,
minAtk=600,--最小攻击力
maxAtk=800,--最大攻击力
def=100,--防御力
},
}
2,地图初始化:
在进入某个地图时,地图上需要增加哪些怪物,哪些触发器等,这些都由它来做。
3,触发器:
一般来说这是最重要的,它分为2种:主动触发和被动触发。
主动触发:比如传送点,它在每轮循环判断是否满足设置的条件,满足则触发
被动触发:比如Npc,它需要玩家点击Npc才触发
4,AI:
实际上就是把怪物AI最上层的决策模块用Lua来驱动,最主要的还是编码在C++里的状态机与寻路。
具体的一些例子可以在Script目录下查看。
最后,用一个设计实例来介绍下上面的应用,这是我目前设置的Boss关卡,纯粹脚本驱动的。
首先,地图上一个触发器,实际上是传送点,进入范围内就传送到Boss所在房间
然后和Boss对话:
这个Npc对话是一个被动触发器,对话完毕后,增加两个怪物,Boss也进入战斗状态。其中,两个怪物是普通AI,就是如果玩家在视野内则追着打,Boss则不一样,当它血量大于一半时,它会每隔10秒施放一个火焰技能,当血量少于一半时,它就会进入狂暴状态跟着你打:
整个关卡的设计没有一点硬编码,而且可以任意更改数据使可玩性增强,这就是Lua的强大。。。
Over。
[DEBUG]记一次野指针调试
关于野指针,我觉得最可怕的情况就是,它在程序大部分时候都不会出错,当你项目越来越大的时候,可能就会出现各种随机性诡异错误了,而这时你压根就不会想到是自己很久前的一次疏忽。
我在shero里用的实体框架是这样的,逻辑对象为Entity,视觉对象为Visual,Visual根据Entity来渲染自己,所以它保存了一个Entity指针m_pEntity。
更新流程是:
Entity->Update();
Visual->Update();
当Entity需要删除时,将m_canDel置为true。
所以在EntityManager的更新里就是这样:
if (m_canDel) delete pEntity;
但是Viusual怎么办呢,Entity没有保存Visual指针,没法通知它需要删除,所以我是这样更新的:
if(m_pEntity->CanDel()) delete pVisual;
倒霉的是,当m_pEntity为野指针后,m_pEntity->CanDel()还真为true。。所以一直没发觉。
DEBUG就是这样,源头找到后就会觉得很简单,如果就这样自大的一笑了之,那以后肯定继续被它虐。所以重要的还是对过程的一些反思:
首先,我这种情况就会产生一些随机性诡异错误,而且源头是在其他模块里,比如这个BUG很早以来就一直存在,而且很早前我也发现过一个由于它导致的堆损坏。当时我查到的源头是在Audio模块里,而且只是某个怪物的音效才会出错。所以,我当时的结论是:嗯,这个怪物的音效文件有误,以后给它换过就没问题了。
后来,又是CEGUI出错,而且这次不是提示堆损坏,直接run time error指针错误。郁闷,换回WIN7,运行居然一切正常,怀疑又是哪里的库版本不对,想半天没有结果。
又蛋疼的持续2天调试一些根本没有问题的模块。后来,采用注释法把这些出错的模块注释掉,回到了很久前的一个游戏结构。再采用极限法,加大产生Entity的速度,然后也是不停删除他们。果然,找到了其实是自己很久前的一次野指针疏忽,导致这么多诡异错误。。。
总结几点:
- VS提供了堆检查机制,但是它是有限的,比如野指针操作导致内存错乱这种情况,它很难检查到。
- XP下运行出现run time error,WIN7下运行正常,这是因为WIN7的堆管理要先进一些,野指针导致的错误要难触发一些。囧,网上搜了很久,貌似还没人出现过这种情况。
- SAFE_DELETE能避免一些野指针错误,但是不要忘了,指针可能赋值在其他地方,你用SAFE_DELETE把指针置0后,其他地方的指针还是野指针。
[DEBUG]做项目切忌编译器版本混乱
蛋疼。今天装了XP双系统,重新装了VS2005,没有打SP1补丁。
以为都是2005嘛,运行不会有问题,哪晓得出现了一个非常诡异的运行错误,类似heap corruption的这种诡异,源头在第三方库CEGUI里,很难调试。
最后才恍然大悟我用的CEGUI是用打了SP1补丁的VS2005编译的,也许是这个问题,重新编译后就没问题了。
那么关于第三方库的问题,总结一下就是一定要保证编译环境相同。编译环境涉及很多方面,首先,编译器发布版本要相同,比如VS2005与VS2008就不同。然后保证升级版本也要相同,比如VS2005与VS2005 SP1就不同。最后,编译设置也要相同,比如Debug,Release;/MT,/MD这些设置是否相同。
如果没有保证环境相同,运气好的话可能会没啥大问题,运气不好的话会提示你一些版本错误,运气最差的就是会导致一系列诡异的run time error,调试都找不到源头的。
最后附上一个VS各个发行版运行时库的比较:
http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx
[DEBUG]内存泄露调试
呼。。又是一次痛苦的调试经历,赶紧记点心得吧。虽然是一个很傻X的失误,但是经历的过程还是收获蛮多的。开始之前,顺便透露一下,关于shero,我已经决定做一个单机开源RPG了,最迟在5月发布吧,最终效果相信不会令大家失望。。:)
好了,起因是这样的,因为集成了CEGUI,界面基本搭好时,却发现有严重的内存泄露,至少当时我是这样认为的,然后便开始尝试各种办法,没有结果。其实最后才发现,原因很简单,我自己的项目里加入了这个设置:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_EVERY_1024_DF | _CRTDBG_CHECK_CRT_DF);
_CRTDBG_DELAY_FREE_MEM_DF,我傻B了,英语白学了。在加入CEGUI以前,项目的每轮循环里不会都有new 与 delete的操作,自然看不出啥问题,但是有了CEGUI后就不一样了,new分配的空间是延迟释放的,不断堆积后看上去肯定就是严重的内存泄露了!
上面的不是重点,重点是过程中的一点调试心得,简单记录下吧:
1,关于内存泄露检测,VC环境下可以检测的,http://shallway.net/blog/?p=337这里的DEBUG_NEW有提到。
但是,这种方法不能解决2个问题:
- 如果内存泄露是在附加库或者Dll中,调试输出窗口显示的信息不包括源文件地址
- 通常更诡异的内存泄露是这样的:程序运行中不断积累,程序退出时却会一起释放的,这种情况是检测不出的。
对于1,一个很有用的技巧是,调试输出窗口不会显示源文件地址,但是会显示这个未分配Block的ID,知道这个ID后,在程序中加入_CrtSetBreakAlloc(ID),再运行程序,就会在分配这个BLock时中断,这样调试就有堆栈输出窗口了,这样就可以知道是附加模块哪里的问题了。
对于2,除开其他调试技巧,其实用1的办法也会有帮助,那就是在_CrtSetBreakAlloc(ID)里,不断更改ID值,视具体情况,达到对问题根源的准确定位。
2,关于Release下运行出现指针访问错误,Debug下却没问题的可能原因:
- 检查DEBUG下所有warning
- 某些函数不是每个路径都有返回值
- 对象构造函数里不是对每个成员变量都做了初始化(这个最有可能)
也可能有其他原因,以后再整理。OVER。
[SheRO]RO文件格式整理
网上关于RO文件格式的资料很多,在此整理下,其中.str技能特效文件是我自己破解的,我直接把SheRO里面读取.str文件的源码贴在里面了,仅供大家参考。我在其他文件格式里都注明了破解的出处,非常感谢作者们的分享精神。
首先还是说明下各个文件的用处吧:
ACT(Action File):包含了人物,怪物,以及个别特效的动画帧数据
SPR(Sprite File):包含了一组2D图像的数据
RSW(Resource World File):包含了在一个地图里面的所有物件:地形,建筑模型,特效,光源,地形属性等
RSM(Resource Model File):包含了一个3D模型的数据
GND(Ground Map File):地形数据
GAT(Ground Altitude File):地形属性数据
STR(??):包含了技能特效的动画帧数据,注意与,act不同,它的帧是动态生成的
文件格式打包下载:http://shero.googlecode.com/files/RO%20FileFormats.rar
另外附上一些有用的RO文件格式资料网站:
http://rolaboratory.ximosoft.com/file-format
http://svn.eathena.ws/svn/ea/devel/FlavioJS/client/file_formats/、
除开.str文件格式,你还能在上面网站找到一样的资料。
[SheRO].rsm模型文件完美渲染
关于.rsm文件的解析网上有很多资料,本身数据没有错,但是,大家应该知道,素材数据破解只是第一步,还有更重要的一步是如何使用这些数据。.rsm文件令人头疼的是,它自身带有一些变换矩阵,而且其自身模型原点也未知,要想把它渲染到我们3D引擎的坐标系下,必须把这些变换矩阵的用途及顺序搞清楚,还要把它的模型原点猜准。本文主要就是讨论这2点。
在往下之前,我想特别感谢下Borf(http://www.borf.info/),关注RO客户端破解的肯定知道他吧,他发布了首个RO地图编辑器BrowEdit,很强大的东西,造福了N多私服搭建者,可惜它并没有开源。上周,抱着尝试的心态给他写了封邮件,没想到他Gtalk马上跟我聊起来了。。非常Nice的一个GG,聊了很多,大家有空可以去玩玩他写的一个网页网游:http://sagramore.com/main.html。最后他很乐意的给了我BrowEdit渲染rsm的.cpp/.h文件,激动万分,马上开始尝试,结果发现更是头大,他的矩阵变换变得复杂得多了。而且是OpenGL的,我应用到自己的D3D下,错误反而更多了。郁闷了,接下来的1个多星期都是寝食难安状态,程序员都是这样,有一个BUG没搞定,那在搞定之前他肯定是焦虑的。
然后我意识到这个只能靠自己了,重新研究了.rsm文件各个版本的格式,查资料更详细的了解了OPenGL与D3D的差异,然后就是一个个的比较各个.rsm文件的差异性并作出合理的假设(这个很重要,搞破解的无一例外都是这样的思路)还好总算是出成果了,我目前敢99.9%保证这就是RO原客户端rsm的矩阵变换。而且这也是目前最简单,最明了的矩阵变换。虽然browedit也是完美渲染,但是他的矩阵变换绕了很大一圈,明显是暴力尝试出来的。好了,开始切入正题了。
shero needs help
As you may know, I am having a problem with rendering the ro map, I tried to fix it, but only to find it getting worse. since i'm not familar with the rsm's file format, so i don't want to waste much my time on it any more(the rsm's transform matrix is really werid-_-)
Though there are some source-code about the ro's map rendering, none of those are perfect. and they are all refered deufeufeu's early work : rsmviewer. I know deufeufeu had developed a better tool which rendering the map model perfect called "yarec",and it's open sourced. but i can't download it from the internet now.
So, if someone still have yarec.tgz from deufeufeu laying around, or knows another source of information, please tell me, Tks!
[SheRO]用D3D绘制2D图像
我在GameRes发布SheRO后,收到了几封热心朋友的来信,都希望我坚持把SheRO做下去,还意外的发现有一个志同道合者UHI-Shine以前也做过模拟RO的客户端,不过中途太监了。。他给我提供了很多有用的资料和意见,再次表示感谢:)
不管坚持不坚持做下去,现在首要任务是开源,所以有了关于SheRO的第一篇开发资料《用D3D绘制2D图像》。因为从图书馆借的资料快到期了,加之最近改正了一个2D渲染的性能问题,所以先从这个题目讲解了。
在D3D之前,绘制2D图像都用的是DirectDraw的API,可是现在微软的D3D根本没有DirectDraw了。那么如何在D3D里绘制2D图像呢?比较普遍的方法是使用D3D提供的ID3DXSprite,但是局限性太大,其一是它是微软封装好的类,我们不知道它的底层原理,其二是,它不提供自身顶点的操作,所以无法使用顶点着色器,纹理效果等。其三是,使用自己打造的ID3DXSprite,性能会更优。还有人可能会想,用BillBoard也可以绘制2D效果,的确是这样,但是BillBoard始终是3D世界的东西,我们需要的是直接在屏幕坐标绘制2D图像。
Shero Demo发布。。
原打算在毕业前做出一个完整的游戏的,但是现在看来实在是力不从心了,毕竟是自己一个人捣鼓的东西,光是代码维护与DEBUG就太费精力了。而且我的毕业设计选的是一个完全陌生的科研性的题目,叫什么P2P流媒体流量的测量与分析。现在还没开始做。。。所以草草先完成一个DEMO放在网上了,我至少会在今年6月前把源码整理好并写一些资料一起发布,希望能对游戏开发爱好者们有所帮助。
关于shero:
- 2.5D,素材取自网游RO,素材破解大部分取自国外牛人们的成果。
- C++与Direct3D编写,内置一个自己写的简单3D引擎,凑合着可以用。
- 搭上了Lua,与游戏自己的消息系统相结合,界面配有Lua控制台。
- 音效与画面基本可以模拟出RO的效果(比如技能,怪物,人物等),但是后期维护工作还很困难。
todo:
- 源码待整理,渲染引擎性能还需要优化。
- 地图模型显示不是很正确,主要原因是自己对RO的模型文件格式不是很熟悉,网上资料还欠缺,还需自己完善。
- 各种DEBUG
操作说明在压缩包里有,关于开启Lua控制台我在这里再用图片说明下:
以下是3张截图:
Demo下载地址:http://shero.googlecode.com/files/SheRODemo.rar
WIN7下能运行,XP下可能点击后没反应。暂时不晓得原因。我现在的机器上还没装XP,以后在XP下编译后再发布了,见谅了。。。