Pygame 外星人入侵(7)外星人压境

Pygame 外星人入侵(7)外星人压境


在之前的博文中,实现了在屏幕上绘制一大群外星人,现在我们想让这群外星人动起来,它们的移动遵循着一定的规律。

一、外星人单向移动

我们首先要实现的是,如何让一群外星人一起向屏幕右侧移动。

1、设置外星人移动速度

游戏参数性质的变量统一存放在 设置模块中的设置类中

# 6、外星人的属性
# 6。1 外星人移动的速度
self.alien_speed = 1

2、更新外星人的位置

在 Alien 类中定义修改外星人位置的方法

# 更新外星人位置的方法
    def update(self):
        self.x += self.settings.alien_speed * self.settings.fleet_direction
        self.rect.x = self.x

3、修改主模块

之前我们是通过 update_aliens() 方法来绘制外星人群到屏幕上的,现在我们不仅要在这个方法中绘制初始外星人,还要移动它们的位置,因此,需要调用刚才定义的修改位置的方法

# 更新外星人位置的方法
def update_aliens(aliens, settings):
    aliens.update()

此时,我们就实现了整群的外星人向屏幕外移动,它们会逐渐飞离屏幕,直到看不见为止。

二、更加合理地移动

像刚才那样单向移动直到飞出屏幕外的移动方式显然需要改进,我们尝试定义外星人移动的规则:
1、初始时,向右移动,直到屏幕边缘
2、当外星人到达屏幕边缘时,向下移动一段距离,然后向左移动
3、与1、2同理,但方向相反
这样就可以实现让外星人群不断左右来回移动,且慢慢逼近飞船的效果。

1、碰撞检测

这个规则中很重要的一点就是,需要检测外星人和屏幕之间的碰撞,因此单独定义一个方法来检测外星人和屏幕是否发生碰撞

class Alien(self):
...
# 检查外星人是否达到屏幕边界的方法
def check_edges(self):
    screen_rect = self.screen.get_rect()
    if self.rect.x >= screen_rect.width:
        return True
    elif self.rect.x <= 0:
        return True

当飞船的横坐标超过屏幕右边界或者超过左边界时,视为碰撞到了。

2、碰撞后的业务

当外星人碰撞到边界后,需要的事有:
1、马上向下移动一段距离
2、改变原来的移动方向

这里我们可以设置下移的速度,并且将移动方向作为设置保存起来

# 6.2 外星人下移的速度
self.alien_drop_speed = 10
# 6.3 外星人移动方向的标志    1为右移 -1为左移
self.fleet_direction = 1

有了这些设置,就可以定义碰撞后的业务了

# 当外星人群触碰到边界时,向下移动外星人群并改变移动方向的方法
def change_direction(aliens, settings):
    for alien in aliens.sprites():
        alien.rect.y += settings.alien_drop_speed
    settings.fleet_direction *= -1

下移:遍历外星人,将其纵坐标加上下移的速度
转向:让设置的方向标志取相反数

同时,根据方向标志我们可以实现外星人的左移或右移,需要修改Alien类中的 update() 方法

# 更新外星人位置的方法
def update(self):
    self.x += self.settings.alien_speed * self.settings.fleet_direction
    self.rect.x = self.x

3、整群外星人的碰撞检测

现在,我们可以对单个外星人进行碰撞检测,并且实现了碰撞后的业务
那么接下来就是实现对整群外星人进行碰撞检测了

我们遍历整组外星人群,如果有任何一个到达了边界,那么整组外星人都要下移并转向

# 判断外星人群是否碰到边界,如果碰到了,则改变移动方向
def check_fleet_edges(aliens, settings):
    for alien in aliens:
        if alien.check_edges():
            change_direction(aliens, settings)
            # 只要有一个外星人到达边界,就不用再判断后续的外星人了
            break

4、修改主模块方法

鉴于我们之前修改外星人位置都是在 update_aliens() 方法中实现的,所以此时我们也要修改这个方法,用于检测整组外星人,并作出相应的动作

# 更新外星人位置的方法
def update_aliens(aliens, settings):
    check_fleet_edges(aliens, settings)
    aliens.update()

三、小结

此时,我们运行游戏,就可以看到外星人群在不断左右来回移动,并在每次撞到边界后都向下移动的场景了,这里模拟了游戏里外星人入侵的功能。
由于编写代码时,就已经拆分了每个函数将要实现的功能,因此这里不太需要回头重构代码。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值