- 1.1 - Amin Roc是什么?
-
Amin Roc是一个B/S游戏的开源项目(Open Source Project)。
它是基于房间制的框架结构,拥有完整的服务器、Flash平台、Flash游戏三大部分的源代码。
对于制作Flash多人在线游戏平台或应用具有一定参考的价值。
- 1.2 - 你可以从中获取的知识
-
1、服务器:Roc的服务器用C++和lua编写的,可以在多种操作系统上的编译和运行,你可以从中了解到服务器的编写技术及跨平台的编译知识。
2、平台:做为承上启下的作用,一个平台的好坏将影响整个架构的安全及稳定,你可以从中了解一些基础的平台设计及技巧。
3、游戏:Roc外带了一款Bomber的演示游戏,在里面你可以了解到一些预测技术及网络同步的东西,这对你开发多人网络游戏将有一定帮助。
- 1.3 - 问题与建议
- 问题(Bug)与建议的提交地址:http://code.google.com/p/aminroc/issues/list
也可以直接发E-mail给我:aminlab@qq.com
- 1.4 - 授权许可
-
AminRoc有两种授权许可:公众版和商业版。
公众版(默认授权):基于GPLv3协议,代码的开源、免费使用及引用,并可以自由修改、衍生开源的代码。在一个软件中使用(“使用”指类库引用,
包括修改或衍生后的代码)此产品,则此软件也必须采用GPL授权协议(GPL协议具有“传染性”),禁止修改或衍生后的代码做为闭源的商业软件发布和销售,
更多详细内容请自行查阅GPLv3协议。此许可的授权范围仅限于学习、参考和研究之用,不提供技术服务与咨询。
商业版:允许使用者自由使用、修改、衍生开源的代码,并可以做为闭源的商业产品进行开发和运营,同时提供技术服务与咨询。
警告:请勿擅自把Roc及其修改或衍生后的产品应用于商业上,这样会使你陷入不可评估的法律风险中,请谨慎。
联系邮箱:aminlab@qq.com
- 1.5 - 版权声明
-
无论是开源协议还是商业协议最终还是基于版权法之上的。
为了避免将来的纠纷,特此声明:任何提交或贡献给Roc项目的代码,将视为其作者只保留其署名权,不拥有其版权。
请在提交代码前先检视及同意此声明款项。
成为Roc开发组成员或贡献人员之后,可以获得两个免费的商业许可,可以自由地转让或者应用。
- 2.1 - 框架结构

- 2.2 - 文件组织结构(主要部分)
| - bin |
[生成]服务器文件夹 |
| - config.xml |
服务器配置文件 |
| - policy.xml |
Flash策略文件 |
| - Roc.exe |
服务器执行文件(Windows) |
| - Roc.bin |
服务器执行文件(linux或FreeBSD,需自行编译) |
| |
|
| - cpp |
[源码]服务器文件夹 |
| - com |
通用库文件夹 |
| - al |
AminLab库文件夹 |
| - lua5.1.4 |
Lua库文件夹(MIT开源许可) |
| - tinyxml2.5.3 |
TinyXml库文件夹(zlib/libpng开源许可) |
| - def |
定义文件夹 |
| - src |
源码文件夹 |
| - main.cpp |
服务器首源文件 |
| - tmp |
编译文件临时存放文件夹 |
| - Makefile |
用在linux、FreeBSD下编译的工程文件 |
| - Roc.vcproj:Visual |
用在windows下编译的工程文件(Studdio 2005) |
| |
|
| - fla |
[源码]客户端文件夹 |
| - games |
游戏文件夹 |
| - TestDemo |
测试示例文件夹 |
| - src |
测试示例文件夹 |
| - TestDemo.as |
游戏首源文件 |
| - Bomber |
Bomber文件夹(外带,仅供参考) |
| - keys |
钥匙文件夹 |
| - platform |
Roc平台文件夹 |
| - __def |
定义文件夹 |
| - __src |
源码文件夹 |
| - Platform.as |
平台首源文件 |
| - InitScene.as |
初始化场景 |
| - ZoneScene.as |
空间场景 |
| - TeamScene.as |
队伍场景 |
| - GameScene.as |
游戏场景 |
| - ui |
UI文件夹 |
| - com |
通用库文件夹 |
| - al |
AminLab的库文件夹 |
| - T |
平台游戏开发包 |
| |
|
| - lua |
[源码]服务器脚本文件夹 |
| - com |
通用库文件夹 |
| - def |
定义文件夹 |
| - keys |
钥匙文件夹 |
| - src |
源码文件夹 |
| - tree |
数据结构文件夹 |
| - Node.lua |
数据结点基类 |
| - config.lua |
服务器数据结构配置 |
| - index.lua |
脚本首源文件 |
| |
|
| - www |
[生成]客户端文件夹 |
| - games |
存放游戏文件 |
| - infos |
用户信息文件夹 |
| - keys |
钥匙文件夹 |
| - index.html |
默认页 |
| - play.html |
游戏页(配置平台接口) |
| - platform.swf |
平台文件 |
- 3.1 - 客户端部署
-
Roc的客户端支持三种类型的Web服务器:ASP服务器、PHP服务器和JSP服务器。
将Web服务器的目录指向www目录即可,访问地址为:http://localhost/index.html
如果你想扩展支持额外的Web服务器类型,请参考index.html的智能识别函数以及在www/infos目录下创建你的相关处理文件。
注:可能某些在支持列表中的Web服务器不能识别出来,请手动在index.html中修改url变量(具体请查看index.html里的说明)。
- 3.2 - 服务器部署
-
Roc的服务器目前支持在三种操作系统上的编译和运行,分别为windows、linux、FreeBSD,对应的高级socket技术分别是IOCP、epoll(LT)、kqueue.
windows下的编译需安装Visual Studio 2005或以上版本,然后打开cpp目录下的Roc.vcproj工程文件进行编译即可,
编译生成后的文件存放在bin目录下,名字为Roc.exe,双击运行即可。
linux,FreeBSD下的编译需安装gcc、g++编译器(最新版本即可),在终端窗口里进入cpp目录,输入make linux或make FreeBSD命令编译即可,
编译生成后的文件存放在bin目录下,名字为Roc.bin,在终端窗口中转到bin目录下输入./Roc.bin回车运行即可。
注:1、在装有sudo工具的系统上监听1024或以下端口时将会失败,所以必须键入sudo ./Roc.bin来执行程序。
2、在linux下编译时内核必须在2.6.17或以上版本以确定新的epoll事件能够使用,可用uname -r查询本地linux内核版本。
3、在FreeBSD下编译时请确定你的make工具是GNU make(gmake)
- 4.1 - 游戏开发需求
-
基于Roc平台上的游戏需要加入一个as3的开发类包,类包是fla/platform目录下的T类包。
T类包包括以下四个文件:
| TEmbed.as |
用来调用Roc平台的API |
| TError.as |
错误事件类型 |
| TEvent.as |
Roc平台发出的事件 |
| TUser.as |
Roc平台的用户结构 |
请将此包复制到你游戏工程文件夹下,具体的使用方法请参考fla/games/TestDemo工程,里面已经有完整注解和使用方法。
- 4.2 - 游戏测试调试
-
T类包中包含了一个本地模拟测试环境,只要你的游戏一生成就可以进行一些基本的模拟测试,如果想进行真实环境测试请将其部署到平台下。
在真实环境测试中如果想快速调试的话,需先将Roc项目设为Flash本地受信任文件夹,在
C:\Documents and Settings\[用户文件夹]\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust文件夹里新建一个TrustFiles.txt文档,
输入Roc项目所在的路径保存即可,然后打开fla/platform/__src/InitScene.as文件,你可以找到以下内容
| if(Security.sandboxType == 'localTrusted'){ |
//[本地调试模式] |
| params.navigation = '/'; |
// 导航地址 |
| params.key = 'keys/090427.swf'; |
// 钥匙文件 |
| params.server = '127.0.0.1'; |
// 服务器地址 |
| params.port = 1985; |
// 游戏端口 |
| params.policyPort = 843; |
// 策略端口 |
| params.path = 'games'; |
// 游戏资源目录 |
| params.game = 'TestDemo'; |
// 游戏文件 |
| params.info = 'infos/user.txt'; |
// 用户信息文件 |
| } |
|
按需修改、保存、编译之后可以直接执行www/platform.swf进行调试了。
- 4.3 - 快速部署游戏
-
当游戏开发完之后,请其发布到www/games/目录下,
然后用记事本打开www目录下的index.html文件,你可以找到以下内容
<li>Test Demo(测试示例)
<div>
- <a href="javascript:play('TestDemo')">匿名登入</a><br>
- <a href="javascript:play('TestDemo','name')">昵称登入</a><br>
- <a href="javascript:play('TestDemo','auto')">自动登入</a>
</div>
</li>
复制一份TestDemo的代码块增加到其下面,并修改其中所有play函数的第一个参数为你的游戏文件名。
接下来再用记事本打开lua目录下的config.lua文件,你可以看到以下内容
| ['TestDemo'] = { |
|
| maxOnline = 1000, |
-- 最多在线人数 |
| maxTeam = 99, |
-- 最多可用队伍 |
| minUserForTeam = 2, |
-- 最少游戏人数 |
| maxUserForTeam = 8, |
-- 最多游戏人数 |
| }, |
|
复制一份TestDemo的代码块增加到其下面,并按自己的需求修改其配置属性。
最后重启服务器,浏览http://localhost/index.html点击进入你的游戏即可。
- 5.1 - 编译配置
如果你要配置windows下的编译,那使用Visual Studio 2005及以上版本打开后进行配置,
如果你要配置Linux、FreeBSD下的编译,那记事本打Makefile文件,看里面的注解按需配置。
- 5.2 - 服务器配置
-
服务器的配置存在bin目录下的config.xml,
逻辑处理配置存在lua目录下的congif.lua,
相关说明已经注解在文档中,可参阅后按需配置。
- 5.3 - 客户端平台配置
-
客户端平台的配置存在www目录下的play.html,用记事本打开文件你可以找到以下内容
| // 平台参数 |
|
| var params = [ |
|
| "navigation=" + nav, |
// 导航地址 |
| "server=" + location.hostname, |
// 服务器地址(当前所处主机地址) |
| "port=1985", |
// 游戏端口 |
| "policyPort=843", |
// 策略端口(默认且推荐843端口) |
| "path=games", |
// 游戏资源目录 |
| "key=keys/090427.swf", |
// 钥匙文件 |
| "info="+getCookie('info'), |
// 用户信息文件地址 |
| "game="+getCookie('game'), |
// 游戏文件 |
| "auto="+getCookie('auto'), |
// 是否自动登入 |
| ]; |
|
如果你想制作自己的play.html文件,可参阅后自行制作。
- 6.1 - 安全验证机制
-
Roc的安全机制主要是防止非法连接的进入(如外挂),你可以会发现fla、www、lua三个目录都有一个keys文件夹,三者的关系分别是:
fla\keys里的文件是用来生成钥匙的;
www\keys里的文件是生成好的钥匙文件;
lua\keys里的文件是来产生明密文的;
验证的流程是这样的:用户通过平台访问服务器,服务器生成一个明文和一个密文,同时将密文发往用户处解密,用户平台将会加载key参数指定的
钥匙文件,然后通过此文件解密回送明文给服务器,服务器将收到的明文与之前生成的明文进行对比,然后处理最终结果。
这个验证机制如验证码一样,但不同之处在于它是后台处理的,用户不用去操作,体验更好,
且它比验证码更为复杂和安全,你可以将钥匙、加解密算法指定为随机生成,生成的文件再进行二次加密等。
而且最重要的是能更方便地帮你找到非法连接的帐号,因为验证码输入是容许用户输错的,而这套验证机制正常流程下是不会出错的,
发生错误的帐号将是有问题的。
- 6.2 - Flash的多方交互
-
可能你会注意到平台的info参数,没错,它就是用来读取当前登陆的Web服务器的用户信息,为什么不从游戏服务器读取呢,要多此步骤干吗?
我的设计是Flash跟游戏服务器交互也跟Web服务器交互,这样形成一个多方交互的体系以适应B/S的架构和部署。
- 6.3 - 更多Make命令
cpp目录下的Make支持额外的命令如下:
make clean - 删除cpp/temp目录下的临时文件
make run - 执行bin目录的Roc.bin
- 7.1 - fla目录里的工程可读性
-
虽然fla目录里的工程全是flash cs4的,但你完全可以把它加到flex(flash builder)中去编写(添加到Flex Build Path里),全部代码无错误及警告。
- 7.2 - C/C++服务器与flash通讯需要注意的问题
-
flash的socket在接收XML数据时是以\0做为结束标识符。
很好,C的字符串也是以\0做结束标识符,直接发过去不就行了,你有可能会写这样一段代码:send(socket,buf,strlen(buf),0);
那么恭喜你,客户端将会永远不响应你,因为strlen不把\0计算在内。这个问题会出现在策略请求和XMLSocket上请注意。
另外在flash player 10的时候你设置System.useCodePage不会对XMLSocket产生作用,推荐使用Socket类。
- 7.3 - 服务器脚本的选择
-
我倾向的两个选择:Python和Lua,这两个脚本都与C/C++结合的很不错。
Python是拥有庞大的第三类库,而且.net和java都有相应编译器,无耐就是性能差点(Python3000据说快很多,这个还没试过)
Lua是性能一流的脚本,但相对Python来说类库还是很少,且目前也只有C的版本,其他语言只能望洋兴叹了。
脚本这个东西见仁见智,适用最好。
- 7.4 - 网络延时与同步
-
在中国的网络环境里,同步问题更为关心,而且Flash目前也只支持TCP通讯(UDP虽然有了但没有开放),
你可以看到TEvent里有一个delay参数是为同步游戏提供,虽然它不太精准,但还是帮得上忙。
如果你想在Roc平台上开发一款ARPG的MMO游戏,那你现在可以取消这个念头;
如果你想在Roc平台上开发一款类似我写的Bomber的游戏,那还是有希望的,可以参考下Bomber。
- 7.5 - Flash游戏开发注意事项
-
你写过C吗?OK,有过,那你应该知道malloc和free的重要性,没错,搞不好就是内存泄露。
不过后来出现的语言都号称是内存泄露的救世主,as3也名列其中。但对一些人来说将可能是恶梦的开始。
GC(garbage collection),垃圾回收,天使的微笑。
打个比方:你或许会很高兴你吃了东西有人帮你收拾,但问题如果你不知那人什么情况下过来收拾,那你将被你所扔的垃圾所淹灭了。
GC就是这个人,你不断地创建对象而不知GC怎么回收的话,那有可能你的游戏将占用更多的内存直至运行不了。
我在这要说的只有两点:
1、在as3中任何调用了addEventListener的地方都要有相应的removeEventListener的处理
2、在as3中任何调用了setTimeout或setInterval的地方都要有相应的clearTimeout和clearInterval的处理
更多关于GC的内容请查阅其他相关文档。
- 9.1 - Roc第三方库提供者
-
tinyxml2.5.3 - Lee Thomason
http://sourceforge.net/projects/tinyxml
lua5.1.4 - Roberto Ierusalimschy、Waldemar Celes、Luiz Henrique de Figueiredo
http://www.lua.org/
- 9.2 - Roc贡献人员
- 感谢kids.lee提交若干Bug及js_unescape函数。