飞天鸽
如果学会了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
池寒
正在学习
展开Biu

正在学习。

[查看全文]
夏初的末冬
虽然我用的
展开Biu

顶!虽然我用的C和Java

[查看全文]
Blaspheme
正在学习
展开Biu

正在学习python

[查看全文]