搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 677|回复: 4
收起左侧

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

[复制链接]

该用户从未签到

4

主题

3

好友

479

积分

New Game

积分
479
发表于 2015-4-24 20:49:01 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
大家好,首先自我介绍一下,我叫小飞,是一名互联网公司的底层码农,从事着与游戏并不相关的职业。
所以,在制作游戏方面,我也是摸着石头过河,菜鸟一只。所以内容中有哪些错误,欢迎大家指出

本系列的目的是什么?
在我最开始学习游戏编程的时候,通常按照教程来学习引擎的使用方法,可是,
当一篇看完以后,我兴致勃勃的打算动手写一个游戏出来。。。却不知道怎样堆砌那些函数,能够正常的运作
好不容易乱七八糟拼凑了几屏代码,运行时改动一处,好好的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[i]
    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类





签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

8

主题

36

好友

8436

积分

小透明

积分
8436
发表于 2015-5-13 02:07:21 | 显示全部楼层
正在学习python
荒。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

5

好友

2684

积分

Continue

积分
2684
发表于 2015-9-23 20:39:58 | 显示全部楼层
顶!虽然我用的C和Java
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

9

好友

2236

积分

Continue

积分
2236
发表于 2016-1-16 17:51:41 | 显示全部楼层
正在学习。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

8

好友

2005

积分

Continue

积分
2005
发表于 2016-1-31 10:23:45 | 显示全部楼层
可以用py.game
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-7-2 02:00 , Processed in 0.100079 second(s), 25 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表