
大家好,首先自我介绍一下,我叫小飞,是一名互联网公司的底层码农,从事着与游戏并不相关的职业。
所以,在制作游戏方面,我也是摸着石头过河,菜鸟一只。所以内容中有哪些错误,欢迎大家指出
本系列的目的是什么?
在我最开始学习游戏编程的时候,通常按照教程来学习引擎的使用方法,可是,
当一篇看完以后,我兴致勃勃的打算动手写一个游戏出来。。。却不知道怎样堆砌那些函数,能够正常的运作
好不容易乱七八糟拼凑了几屏代码,运行时改动一处,好好的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类