- 帖子
- 3232
- 精华
- 6
- 积分
- 118320
- 阅读权限
- 200
- 注册时间
- 2013-7-21
- 最后登录
- 2024-11-23
|
上节课中,我们的飞机已经可以发射子弹了,尽管只有一颗。为什么我只加了一颗?试着多加几颗你就会发现,你得用好几个变量去分别记录它们的xy坐标,在主循环中判断每一颗子弹的状态。你可以用list把程序写得稍稍不那么复杂,但这还没完。别忘了你打飞机的对手--敌机还没有加入到游戏。到时候你又需要更多的变量去记录它们的坐标,去判断它们的状态,去处理敌机、子弹、玩家飞机之间的关系。想想都觉得头大。
于是乎,我之前煞费苦心讲解的面向对象就该派上用场了。我要把子弹相关的东西都封装在一起。
先看看目前子弹相关的有哪些东西:x、y坐标,一张图片,好像就这么多。然后,还有一段处理子弹运动状态的代码。来建一个Bullet类,把x、y、image作为成员变量,再提供一个叫做move的成员函数,处理子弹的运动。
#定义一个Bullet类,封装子弹相关的数据和方法- class Bullet:
- def __init__(self):
- #初始化成员变量,x,y,image
- self.x = 0
- self.y = -1
- self.image = pygame.image.load('bullet.png').convert_alpha()
- def move(self):
- #处理子弹的运动
- if self.y < 0:
- mouseX, mouseY = pygame.mouse.get_pos()
- self.x = mouseX - self.image.get_width() / 2
- self.y = mouseY - self.image.get_height() / 2
- else:
- self.y -= 5
复制代码 代码的内容基本和之前一样,只是改为了面向对象的写法。如果你对__init__,self这些字眼感到陌生的话,请发送数字47到50,回顾一下关于python面向对象的课程。
接下来,程序主体就可以瘦身了。在原本加载子弹图片、初始化位置的地方,直接创建一个Bullet的实例。在主循环中处理子弹运动的地方,调用Bullet的move方法。绘制子弹的时候,从bullet实例中取数据。- screen.blit(bullet.image, (bullet.x, bullet.y))
复制代码 就这么简单。
运行程序看看效果是否正常。相比昨天,游戏的功能没有任何进展,但在结构上清晰了许多。之后,可以放心地添加更多子弹和敌机,而不会导致代码变成一坨。
#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:312723402
面向零基础初学者的编程课
每天5分钟,轻松学编程
|
|