Firefly的角色跳转场景简单示例
源地址:http://bbs.9miao.com/thread-45790-1-2.html
本例演示的是模拟游戏服务端,让角色在场景1中跳转到场景2中。在实际游戏中,client将要跳转的角色id和目标场景id发给net,net转发给gate,gate将目标场景id与角色当前所在场景id进行对比,一样则返回跳转失败,不一样则在目标场景服务器重新实例化一个角色,然后将之前的场景服务器中的角色实例删除。因为此次只是掩饰原理,所以实际中的各种验证等就不进行处理了,有问题可以在论坛发帖探讨。
1.创建工程
命令行下输入firefly-admin.py createproject communication(linux在终端输入)
<ignore_js_op>

firefly会创建一个名为communication的工程
<ignore_js_op>

2.导入工程
将工程导入到eclipse中
<ignore_js_op>

3.配置参数
配置config.json中的相应参数
- {
- "master":{"rootport":8999,"webport":9998},
- "servers":{
- "gate":{"rootport":10000,"name":"gate","app":"app.gate.gateserver"},
- "net":{"netport":11009,"name":"net","remoteport":[{"rootport":10000,"rootname":"gate"}],"app":"app.net.netserver"},
- "scene1":{"remoteport":[{"rootport":10000,"rootname":"gate"}],"name":"scene1","app":"app.scene.sceneserver"},
- "scene2":{"remoteport":[{"rootport":10000,"rootname":"gate"}],"name":"scene2","app":"app.scene.sceneserver"}
- },
- "db":{
- "host":"localhost",
- "user":"root",
- "passwd":"111",
- "port":3306,
- "db":"anheisg",
- "charset":"utf8"
- },
- "memcached":{
- "urls":["127.0.0.1:11211"],
- "hostname":"test"
- }
- }
复制代码
具体参数含义和配置说明详见:http://bbs.9miao.com/forum.php?m ... 6orderby%3Ddateline
4.编写代码
在上面填写的server配置的app对应路径下分别建立netserver.py、gateserver.py和sceneserver.py,这里只列出了几个重要文件,其他如User.py、UserManager.pu等详见附件。
1)netserver.py:
- #coding:utf8
- from firefly.server.globalobject import netserviceHandle,GlobalObject
- @netserviceHandle
- def login_1004(_conn,data):
- data = eval(data)#客户端传来的number是str型,转换成dict型
- pid = data.get("pid")#获取pid
- sid = data.get("sid")#获取sid
- result = GlobalObject().remote['gate'].callRemote("enterScene_1003",pid,sid)#调用root服务器(gate)的enterScene_1003方法,参数为pid,sid
- return result#返回结果
复制代码
2)gateserver.py:
- #coding:utf8
- from User import User
- from UserManager import UserManager
- from firefly.server.globalobject import GlobalObject,rootserviceHandle
- @rootserviceHandle
- def enterScene_1003(pid,sid):
- '''进入场景
- @param pid: int 角色id
- @param sid: str 要跳转的场景id
- '''
- if not UserManager().isHaveUser(pid):#如果用户管理器中没有该用户
- user = User(pid,sid)#实例化角色
- UserManager().addUser(user)#添加到用户管理器中
- result = GlobalObject().root.callChildByName(sid,"enterScene_1001",pid,sid)#调用node服务器(sid)的enterScene_1001方法,参数为pid,sid
- return result#返回结果
- else:#如果用户管理器中有该用户
- user = UserManager().getUser(pid)#获取该用户实例
- nowSid = user.sid#用户当前所在场景id
- if nowSid == sid:#用户当前所在场景id与要跳转的场景id相同
- return "Failure"#返回失败信息
- else:#否则
- result1 = GlobalObject().root.callChildByName(sid,"enterScene_1001",pid,sid)#调用node服务器(sid)的enterScene_1001方法,参数为pid,sid
- GlobalObject().root.callChildByName(nowSid,"deletePlayer_1002",pid)#调用node服务器(nowSid)的deletePlayer_1002方法,参数为pid
- UserManager().updateSid(pid, sid)#更新用户前所在场景id
- return result1#返回结果
复制代码
3)sceneserver.py
- #coding:utf8
- from firefly.server.globalobject import remoteserviceHandle
- from Player import Player
- from PlayersManager import PlayersManager
- @remoteserviceHandle("gate")
- def enterScene_1001(pid,sid):
- '''进入场景'''
- player = Player(pid,sid)#实例化角色实例
- PlayersManager().addPlayer(player)#将角色添加到角色管理器中
- return "I'm now at %s" % sid#返回跳转成功信息
- @remoteserviceHandle("gate")
- def deletePlayer_1002(pid):
- '''删除角色实例
- '''
- if PlayersManager().isHavePlayer(pid):#如果角色管理器中有该角色
- user = PlayersManager().getPlayer(pid)#获取该角色实例
- sid = user.sid#获取角色所在场景实例
- PlayersManager().dropPlayer(pid)#从角色管理器中删除该角色
- print 'I left %s' % sid
复制代码
4)最后编写客户端——client.py:
- #coding:utf8
- from socket import AF_INET,SOCK_STREAM,socket
- import struct
- import time
- def sendData(sendstr,commandId):
- '''定义协议头
- '''
- HEAD_0 = chr(0)
- HEAD_1 = chr(0)
- HEAD_2 = chr(0)
- HEAD_3 = chr(0)
- ProtoVersion = chr(0)
- ServerVersion = 0
- sendstr = sendstr
- data = struct.pack('!sssss3I',HEAD_0,HEAD_1,HEAD_2,\
- HEAD_3,ProtoVersion,ServerVersion,\
- len(sendstr)+4,commandId)
- senddata = data+sendstr
- return senddata
- def resolveRecvdata(data):
- '''解析数据,根据定义的协议头解析服务器返回的数据
- '''
- head = struct.unpack('!sssss3I',data[:17])
- lenght = head[6]
- message = data[17:17+lenght]
- return message
- if __name__ == "__main__":
- HOST='localhost'
- PORT=11009
- ADDR=(HOST , PORT)
- client = socket(AF_INET,SOCK_STREAM)
- client.connect(ADDR)#建立socket连接
- client.sendall(sendData("{'pid':100001,'sid':'scene1'}",1004))#向服务器发送消息
- message = client.recv(1024)#接收服务器返回的消息
- message = resolveRecvdata(message)#解析消息
- print message
- time.sleep(3)
- client.sendall(sendData("{'pid':100001,'sid':'scene2'}",1004))#向服务器发送消息
- message = client.recv(1024)#接收服务器返回的消息
- message = resolveRecvdata(message)#解析消息
- print message
- time.sleep(3)
- client.sendall(sendData("{'pid':100001,'sid':'scene2'}",1004))#向服务器发送消息
- message = client.recv(1024)#接收服务器返回的消息
- message = resolveRecvdata(message)#解析消息
- print message
- client.close()
复制代码
5.运行程序
1)运行服务器,打开附件下载的communication文件夹,打开命令行窗口,输入python startmaster.py,回车,如图:
<ignore_js_op>

2)运行客户端,第一次登陆时,角色进入了场景1,成功;第二次由场景1台转到场景2,成功;第三次由场景2跳转到场景2,失败。
<ignore_js_op>

Firefly的角色跳转场景简单示例的更多相关文章
- ibeacon的使用和应用场景简单示例
目的,用ibeacon实现签到功能,不需要太严谨,只是试水. 拿到ibeacon的第一感觉是,这东西能用嘛,2-3年的电池,后面商家说是用个3M双面胶找个地方一贴就行,感觉不太靠谱,嘿嘿,在网上找了一 ...
- Optaplanner规划引擎的工作原理及简单示例(2)
开篇 在前面一篇关于规划引擎Optapalnner的文章里(Optaplanner规划引擎的工作原理及简单示例(1)),老农介绍了应用Optaplanner过程中需要掌握的一些基本概念,这些概念有且于 ...
- spring-servlet.xml简单示例
spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 <!-- springMVC简单配置 --> <?xml versi ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- springMVC源码分析--异常处理机制HandlerExceptionResolver简单示例(一)
springMVC对Controller执行过程中出现的异常提供了统一的处理机制,其实这种处理机制也简单,只要抛出的异常在DispatcherServlet中都会进行捕获,这样就可以统一的对异常进行处 ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Unity跳转场景进度条制作教程(异步加载)
Unity跳转场景进度条制作 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- Unity3d-通过简单示例来理解Time.deltaTime
转载文章: Unity3d-通过简单示例来理解Time.deltaTime 2018年04月21日 18:04:14 Black_Window 阅读数:926 标签: UnityTime 更多 个人分 ...
随机推荐
- 晒下自己App广告平台积分墙收入,顺便点评几个广告平台
这是我之前发在爱开发App源码论坛的文章.分享了我从2011年到现在移动广告方面的收入和一些心得. 产品类型:FC.街机模拟器类App游戏 广告平台:万普世纪 广告形式:积分墙,用户先试玩几次,再玩需 ...
- sqlserver 测试sql语句执行时间
查看sql语句执行时间/测试sql语句性能 写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置S ...
- 使用EntityFramework连接 Mysql
原文:使用EntityFramework连接 Mysql 1,安装VS.net 插件 http://forums.mysql.com/read.php?174,601041,601041 2,安装连接 ...
- (转)微软开放了.NET 4.5.1的源代码
微软开放了.NET 4.5.1的源代码 .NET Reference Source发布了beta版,可以在线浏览.NET Framework 4.5.1的源代码,并且可以通过配置,在Visual St ...
- js 书写规范
1.字符串用单引号 2.运算符号和变量之间用空格建立间距 3.书写插件时使用 'use strict'; 开头 4.方法如果是获取或者设置数据集合则使用动词如 getData,setData,eac ...
- 通过使用Chrome的开发者工具来学习JavaScript
本文作者是Peter Rybin,Chrome开发者工具团队成员. 本文中,我们将通过使用Chrome的开发者工具,来学习JavaScript中的两个重要概念”闭包”和”内部属性”. 闭包 首先要讲的 ...
- OOP—还原被遮掩的继承名称
1.public继承——using 声明式 class Base { private: int x; public: ; virtual void mf1(int) ; virtual void mf ...
- SQLBindCol---数组输出
SQLSetStmtAttr(hstmt,SQL_ATTR_ROW_BIND_TYPE,SQL_BIND_BY_COLUMN,0); SQLSetStmtAttr(hstmt,SQL_ATTR_ROW ...
- 分布式之高性能IO组件
因为毕业设计(实时分析大型数据流),开始对分布式并行计算做研究,第一个问题就是通讯.高性能的通讯是整个系统性能的基本保障. 方案 就目前的经验来讲,最好的通信选择是:异步非阻塞IO + 资源池. 异步 ...
- Excel加载期间出现问题 解决方案
今天在处理Excle表格的时候出现了如图所示的问题,资料比较重要,需要进行恢复: 出现问题的原因就是在制作的时候,产生了某些临时的htm文件,但是只保留了excel,将那些临时文 ...