前言

我们初步了解了pygame的控制流程,但这对于一个游戏而言是远远不够的。所以在这一篇中,我们的任务是添加一架飞机(玩家),并且能够控制它进行移动,这样我们就又离目标进了一步了~

这里解释一下,在网上又重新找了一个新的背景图片,后面的代码会有所修改。

正片开始!

1. 把我们的战斗机搬上屏幕

在正式上代码以前,有一点需要说明的,我们可以看到,所有屏幕上出现的元素都在资源(image/shoot.png)中,那我们要怎么做才能把一只飞机给裁剪出来呢?在pygame中,所有在屏幕上显示的元素都可以视为一个surface,利用这个特点,我们可以把资源文件导入(load()函数),然后用surface.subsurface()函数把shoot.png中我们想要的元素裁剪出来,这样问题就解决了~(tips:怎样才知道shoot.png中飞机的准确坐标呢?在image/shoot.pack文件中已经详细记录了每个屏幕元素的左上角坐标以及它的宽和高了)

新代码我会框起来,作为标记。

飞机大战论文python 飞机大战python报告_控制流

飞机大战论文python 飞机大战python报告_飞机大战论文python_02

我们在游戏的主循环中,不断地绘制背景图片、刷新界面。由于中间没有休息,所以游戏很耗CPU资源。

实际上,游戏一般每秒有60帧就非常棒了,所以应该在游戏主循环中加入休息机制。

在Java中,游戏主循环一般放在线程中,线程可以休眠一段时间。

而在pygame中,主要采用时钟来控制游戏节奏:

1.clock = pygame.time.Clock()

2.clock.tick(60)

添加了两处代码

运行一下代码看看吧!

飞机大战论文python 飞机大战python报告_消息循环_03

可以看到,我们的飞机动了,究竟是怎样实现动画效果的呢?在代码中,新加入的代码一共有三处,显示玩家飞机的那一段已经解释过了,现在我们来解释其余的两段新加入的代码。首先增加了一个计数变量ticks,在消息循环中,每循环一次就累加一次,可以理解为每一个周期就是1 tick,我们可以利用周期数来分隔不同的显示效果;我们读入了两张不同的玩家飞机图片,利用周期数实现每50个周期,前25个周期显示hero1,后25个周期显示hero2,这样就有了缓慢变化的动态效果。不过值得注意的是,这样每一次循环就计算并判断一次ticks的做法明显不是好方法。还有Python是木有自增表达式的,我试图++ticks结果报错了。

战斗机已经准备就绪,该教会飞行员怎样操作了,下篇继续码起来!!!