飞天鸽 发表于 2015-4-24 20:49:01

如果学会了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 == 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类





Blaspheme 发表于 2015-5-13 02:07:21

正在学习python

夏初的末冬 发表于 2015-9-23 20:39:58

顶!虽然我用的C和Java

池寒 发表于 2016-1-16 17:51:41

正在学习。

milkrong 发表于 2016-1-31 10:23:45

可以用py.game
页: [1]
查看完整版本: 如果学会了python,我可以做游戏吗(格斗篇1)