关于精灵组

来源:3-6 飞机大战项目我方飞机发射子弹

慕田峪1127688

2020-02-12 11:12:54

关于精灵组 我有如下理解。

Bullet.py 中 class Bullet(pygame.sprite.Sprite): 中定义了方法update(self, *args):

plane.py 中class Plane(pygame.sprite.Sprite): 中定义了属性

 bullets = pygame.sprite.Group()

 以及方法

def shoot(self):
   """ 飞机发射子弹 """
   bullet = Bullet(self.screen, self, 15)
   self.bullets.add(bullet)

当 键盘按键为空格时,调用shoot 方法,实例化一个Bullet类的实例:bullet, 并且利用 add 方法把这个实例装入到精灵组中,在main.py 中 status=1 是 使用our_plane.bullets.update(),对精灵组中的实例实现 Bullet类中的update 方法

问题如下: 为什么要定义bullets= pygame.sprite.Group(),为什么一定要定义在飞机类之下,为什么再main.py 的主循环之外实例化一个 pygame.sprite.Group() : b= pygame.sprite.Group() ,然后 在主循环内使用 b.update 不能实现子弹发射的功能?,为换言之,为什么调用pygame.sprite.Group()中的方法 必须使用 pygame.sprite.Sprite 子类的属性作为实例对象?为什么也不可以直接 pygame.sprite.Group.update() 来调用类方法?


写回答

1回答

慕之熠_灿烈

2020-02-12

同学,你好。

首先需要明确一个概念:飞机类和子弹类都属于精灵组的子类,那么要依靠pygame库来实现飞机大战功能,就要在自定义的类中继承该父类,定义在Plane类中,是为了按照面向对象的方式来方便控制飞机移动和子弹发射功能实现。

其次主循环之外设置精灵组,在主循环之内调用update( ) 的方法不符合面向对象开发的规则,飞机的功能就应该定义在飞机类中,子弹的功能就应该定义在子弹类中,在main中就应该是控制游戏运行的相关的逻辑代码。

最后,按照视频中的开发方式,除了满足面向对象开发原则之外,也是为了后续的可维护性更好。

如果我的回答解决了您的疑惑,请采纳!祝~学习愉快~


0

0 学习 · 8160 问题

查看课程