喵宅苑 MewoGarden × 技术宅社区II | Z站 Z Station 棒棒哒纯文字二次元技术社区

正文

如果学会了python,我可以做游戏吗(格斗篇1)

作者:飞天鸽
大家好,首先自我介绍一下,我叫小飞,是一名互联网公司的底层码农,从事着与游戏并不相关的职业。 所以,在制作游戏方面,我也是摸着石头过河,菜鸟一只。所以内容中有哪些错误,欢迎大家指出 本系列的目的是什么? 在我最开始学习游戏编程的时候,通常按照教程来学习引擎的使用方法,可是, 当一篇看完以后,我兴致勃勃的打算动手写一个游戏出来。。。却不知道怎样堆砌那些函数,能够正常的运作 好不容易乱七八糟拼凑了几屏代码,运行时改动一处,好好的demo变得面目全非 代码的耦合性太强,聚合度太低,毫无拓展性可言,健壮性更是无从谈起。 亲呀,这样的代码真的不是累赘吗? 有这样烦恼的童鞋们,这篇文章简直是为了你们量身定做的 2333 这个系列比起教学更像是一篇手记,面向的是对读完pygame教程后对使用方法有基本了解的童鞋们。 所以说,比起交给使用方法,我更倾向于记录下自己对于游戏框架的设计与思考。 那么,正片开始 ======================================================================================== 考虑格斗游戏的输入,大概如下 [上,下,左,右,轻拳,轻脚,重拳,重脚] 这是最基本的情况,事实上为了丰富游戏的可玩性,还会有各种手搓的招式 例如 [下下轻拳,左右左右轻拳]等等 前者,可以直接用event.get()对keydown事件进行监控 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: p1state = 'left' if event.key == pygame.K_d: p1state = 'right' 这里基本没什么可说的了,可是接下来,像下下轻拳这种东西,并不是一个键,而是一串指令,怎么办 首先,需要一个指令表,用于存储指令对应的状态 字典可以轻松的完成这个工作 CMDLIST = { "ssj":"fight1", "swj":"fight2", "adadj":"fight3" } 同时,还需要一个队列来 保存缓冲区输入的字符 cmdquery = "" 这个队列应该被send_charter(char)这个方法调用 def send_charter(char): global cmdquery cmdquery += char for i in CMDLIST: if cmdquery[0-len(i):] == i: #这里的操作,是只将缓冲区最后的序列与字典的key进行比较,成功则命中 return CMDLIST return 这样的操作会带来二义性,例如key中包含了‘左右左右’与‘左右’解决办法就是设计指令的时候别包含子集呗 修改 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: p1state = 'left' if event.key == pygame.K_d: p1state = 'right' result = command.controller.send_charter(chr(event.key)) #关于指令和队列,均被我分到了command.controller包里,归类 if not result: p1state = result ok,在考虑情况,如果我们输入的指令速度很慢,那么是不会触发这些招式的,所以 def clear(): global cmdquery cmdquery = "" 在主循环前 pygame.time.set_timer(userevent.CLEARCOMMANDQUERY,1000) userevent.CLEARCOMMANDQUERY是自己定义的事件,目的是为了触发清空缓冲区操作 最后: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: p1state = 'left' if event.key == pygame.K_d: p1state = 'right' result = command.controller.send_charter(chr(event.key)) #关于指令和队列,均被我分到了command.controller包里,归类 if not result: p1state = result if event.type == userevent.CLEARCOMMANDQUERY: command.controller.clear() 今天就先提到这里,下一篇我会结合代码提供一个拓展很方便的精灵动画类的实现,也就是player类

回复

milkrong回复给帖子:15920037

作者:milkrong
可以用py.game
查看回复

正在学习

作者:池寒
正在学习。
查看回复

虽然我用的

作者:夏初的末冬
顶!虽然我用的C和Java
查看回复

正在学习

作者:Blaspheme
正在学习python
查看回复
上一页
下一页
0%
闽ICP备2022013136号闽公网安备35092202000188号
站点地图友情链接:
喵宅苑
喵空间社区程序
喵宅苑 静态版
宅喵RPG地图编辑器
络合兔
Lanzainc
技术宅
小五四博客
莉可POI
Mithril.js
枫の主题社
Project1
午后少年
机智库
七濑胡桃
xiuno
幻想の日常
魂研社
Nothentai
0xffff
欲望之花
泽泽社长
淀粉月刊
HAYOU