页游开发中的python组件与模式

上传人:j****9 文档编号:55174174 上传时间:2018-09-25 格式:PPT 页数:56 大小:647KB
返回 下载 相关 举报
页游开发中的python组件与模式_第1页
第1页 / 共56页
页游开发中的python组件与模式_第2页
第2页 / 共56页
页游开发中的python组件与模式_第3页
第3页 / 共56页
页游开发中的python组件与模式_第4页
第4页 / 共56页
页游开发中的python组件与模式_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《页游开发中的python组件与模式》由会员分享,可在线阅读,更多相关《页游开发中的python组件与模式(56页珍藏版)》请在金锄头文库上搜索。

1、页游开发中的 Python 组件与模式,赖勇浩(http:/) 2012-10-21,去年我来过,回顾,幻灯:http:/ 录像(上海45分钟版):http:/ 录像(广州91分钟版):http:/ 偏向于“最佳实践”的经验分享,今天不一样,直奔主题!,class Player(object):def signin(self, usr, pwd):.self._signin = Truedef do_sth(self):if not self._signin:self.client.need_signin()return.,有什么问题?,def do_sth_1(. def do_sth_2(

2、. def do_sth_3(. def do_sth_4(. ,一般这样解决掉,ensure_signin def do_sth(self, *a, *kw):Decorator !,还有什么问题?,def do_sth_1(. def do_sth_2(. def do_sth_3(. def do_sth_4(. ,if not self._signin: . if not self._in_battle: . if not self._is_dead: . .,还是这样解决掉?,ensure_signin ensure_in_battle ensuer_is_alive def do_

3、sth(self, *a, *kw):?,好像哪里不对,戴太多“帽子”不好看 method 的数量没有减少。需要一点新思路!,python-state,stateful class Player(object):class NeedSignin(State):default = Truebehaviordef signin(self, usr, pwd):.switch(self, Player.Signin),class Signin(State):behaviordef move(self, dst): .behaviordef atk(self, other): .behaviordef

4、 ,python-state,stateful class Player(object):class NeedSignin(State):default = Truebehaviordef signin(self, usr, pwd):.switch(self, Player.Signin),class Signin(State):behaviordef move(self, dst): . behaviordef atk(self, other): .behaviordef ,python-state,stateful class Player(object):class NeedSigni

5、n(State):default = Truebehaviordef signin(self, usr, pwd):.switch(self, Player.Signin),class Signin(State):behaviordef move(self, dst): .behaviordef atk(self, x): .behaviordef ,python-state,stateful class Player(object):class NeedSignin(State):default = Truebehaviordef signin(self, usr, pwd):.switch

6、(self, Player.Signin),class Signin(State):behaviordef move(self, dst): .behaviordef atk(self, other): .behaviordef ,python-state,stateful class Player(object):class NeedSignin(State):default = Truebehaviordef signin(self, usr, pwd):.switch(self, Player.Signin),class Signin(State):behaviordef move(se

7、lf, dst): .behaviordef atk(self, other): .behaviordef ,适用场景,根据状态授权特定的 RPC API 访问权限 例如未登陆不能调用攻击 编写网络协议、文本的 parser FSM-based Game AI ? No ! 没有比协程更适合做这件事的机制了。,小结一下,跟 decorator 一样去掉了 if 语句 但是摘掉了许多帽子 而且真正地没有写 if 语句噢!,小结一下,跟 decorator 一样去掉了 if 语句 但是摘掉了许多帽子 而且真正地没有写 if 语句噢!把很多 method 分到多个 State 类中 重用 划分功能,

8、更大的好处是,更容易修正错误 因为出错信息是 AttributeError !,更容易修正错误,因为出错信息是 AttributeError !,http:/ 2010-5-30 shanghai,更容易修正错误,因为出错信息是 AttributeError !,好,继续!,什么引起状态的切换?,属性变化!,什么引起属性变化?,有事情发生!,怎么知道有事情发生?,上网、读报、看电视、听收音机,大海捞针,好莱坞原则,Dont call me, Ill call you.,一个简单的状态切换场景,建个模吧!,建个模吧!,class Lamp(object):is_on = False class

9、Swith(object):def turn(self):.,建个模吧!,class Lamp(object):is_on = False class Swith(object):def turn(self):self.line.lamp.is_on = True,class Line(object): . line = Line() lamp = Lamp(line) swith = Swith(line) liine.connect(lamp, swith) swith.turn() assert lamp.is_on,好像感觉哪里不对,现实世界中需要真实的 Line,编程中也是吗? 如果

10、一个 Switch 对应着很多 Lamp ? 循环引用?隐形的 Line?可扩展的 Line?,python-message,class Switch(object):Turn = state.examples.Switch.Trundef turn(self):message.pub(Switch.Turn, self),python-message,stateful class Lamp(object):class Off(State):default = Truebehaviordef _on_turn(self, s):switch(self, Lamp.On)class On(Sta

11、te):behaviordef _on_turn(self, s):switch(self, Lamp.Off),class Lamp(object):def bind(self, s):self._switch = smessage.sub(Switch.Turn, self.on_turn)def on_turn(self, s):self._on_turn(s),python-message,s = Switch() l = Lamp() l.bind(s) s.turn() s.turn(), begin Off state.end Off state.begin On state.e

12、nd On state.begin Off state.,解耦,应用场景,任务 获得道具时 怪物死亡时 世界状态 玩家(好友)上下线 网络编程 数据可读 ,更多功能,取消与中止,import message def hello(name):print hello, %s.%namemessage.unsub(greet, hello) message.sub(greet, hello) message.pub(greet, lai) message.pub(greet, u cannt c me.),import message def hello(name):print hello %s %

13、 namectx = message.Context()ctx.discontinued = Truereturn ctx def hi(name):print u cannt c me. message.sub(greet, hello) message.sub(greet, hi) message.pub(greet, lai),进阶,改变调用次序 在调用 sub 的时候加上 front = True sub(greet, hello, front = True) 订阅过去的消息 declare/retract declare(topic, *a, *kw) 用来向“公告栏”发布一个消息

14、把“公告栏”的消息撤消用 retract(topic) 函数 get_declarations()/has_declaration(topic),退化观察者模式,from message import observable def greet(people):print hello, %s.%people.name observable class Foo(object):def _init_(self, name):self.name = nameself.sub(greet, greet) foo = Foo(lai) foo.pub(greet, foo),现在 玩家有了状态 也能知晓世

15、事变幻,那玩家们如何交互?,网络通信,需要有个 rpc 基于 google protobuf 实现一套就不错 如果有 greenlet 实现同步编程就更好了,abu.rpc,class EchoService(echo.EchoService):abu.rpc.retdef Echo(self, controller, request):resp = echo.Packet(text = request.text)return respservice = EchoService() handler = abu.rpc.Handler(abu.rpc.Transport, service) se

16、rver = gevent.server.StreamServer(, 10086), handler) app = abu.rpc.Application(server) print serving. app.run(),abu.rpc,conn = gevent.socket.create_connection(127.0.0.1, 10086) channel = abu.rpc.Channel(abu.rpc.Transport(conn) server = abu.rpc.Proxy(echo.EchoService_Stub(channel)req = echo.Packet(text = hello*30) resp = server.Echo(req) assert resp.text = req.text,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号