AminRoc 完全手册

文档日期:2009-06-29
  1. 介绍
    1. Amin Roc是什么?
    2. 你可以从中获取的知识
    3. 问题与建议
    4. 授权许可
    5. 版权声明
  2. 架构
    1. 框架结构
    2. 文件组织结构(主要部分)
  3. 部署
    1. 客户端部署
    2. 服务器部署
  4. 开发
    1. 游戏开发需求
    2. 游戏测试调试
    3. 快速部署游戏
  5. 配置
    1. 编译配置
    2. 服务器配置
    3. 客户端平台配置
  6. 高级
    1. 安全验证机制
    2. Flash多方交互
    3. 更多Make命令
  7. 编外
    1. fla目录里的工程可读性
    2. C/C++服务器与flash通讯需要注意的问题
    3. 服务器脚本的选择
    4. 网络延时与同步
    5. Flash游戏开发注意事项
  8. 链接
    1. 演示地址:www.aminlab.cn/Roc
    2. 项目地址:http://code.google.com/p/aminroc/
    3. 下载地址:http://code.google.com/p/aminroc/downloads/list#
    4. 最新文档:www.aminlab.cn/Roc/manual.html
    5. 官方网站:www.aminlab.cn
  9. 感谢(Thanks)
    1. Roc第三方库提供者
    2. Roc贡献人员

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的服务器目前支持在三种操作系统上的编译和运行,分别为windowslinuxFreeBSD,对应的高级socket技术分别是IOCPepoll(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函数。