火柴人🚶‍♂️

这个也是和弹球游戏一样的环境,python3+tkinter,所以环境配置可以参考前一篇。火柴人比前一篇就是多了个一个动画效果,已经更加麻烦的体积碰撞,还有上升下落的物理模拟,还有一个就是游戏成功的检测。

github连接在这:https://github.com/finalObject/stickman

动画效果

不像之前的弹球游戏,只有长方形和圆心,直接在程序中绘制就行,这个火柴人里的一些元素图片都需要自己提前准备的。然后image里就是自己绘制的元素,有点简陋。

承载小人的平台是设定之后就不会变更了的,但是小人和门是存在一个动画效果的。不过门的动画比较特殊,只有在游戏结束的时候才会触发一次,所以比较简单。而小人是需要不断变换图像,从而显示出奔跑状态的。

下面就是小人的动画函数

游戏中一个对应的元素(Sprite对象),在画布中创建图像时,会返回一个对象,然后就这个对象储存在self.image中。

如果需要更改图像,需要

如果直接重新创建,会导致原画和新画都出现在屏幕上,而使用itemconfig函数,可以抹出原画,只留下新画。

体积碰撞

体积碰撞基础函数写在coords.py里,包含左右上下坐标是否重叠的检测,在class StickSprite的move()函数里,就基于简单的检测,实现了和画布边缘以及其他Sprite的碰撞检测。

物理模拟

主要就是一个小人跳跃过程中的模拟,这里其实很简单地对跳跃进行计时,到达一定时间后就将速度朝小。比较机械,只是很离散的模拟。

然后在检测到碰撞后(上下左右的碰撞),会把对应方向速度置0。

另外,当小人没有产生向下的碰撞时,小人会产生朝下的速度。这样就解决了小人漂浮在空中的bug。

成功检测

在游戏初始化的时候,部分sprite的endgame属性为True,也就意味它有能力结束游戏,这个游戏里只有顶端的门有这个True。

如果小人和门发生了碰撞,就会将running设置位False,然后执行门的结束游戏图像修改的函数,其实就是把门的图像由关变成开。running在Game类的mainloop()函数里控制着整个游戏的进行,如果变成False,小人就不能移动。

之前尝试直接把while 1里面所有的东西放放入判断语句中,也就意味着如果running为False,连update和sleep函数都不会执行,但是这样做会导致程序卡死。

另外还有一个不足之处时,我的游戏检测只会在向左碰撞的函数里触发,因为这个场景下小人只可能从右往左抵达门,更加合理的方式,是应该保证发生碰撞一定会执行这个成功检测。

以上基本就是代码的全部内容了,代码已经贴的差不多了,再把全部代码贴上来会显得有点冗长,需要的请移步github

发表回复