python拍7游戏_Python《外星人入侵》游戏<七>

在Python《外星人入侵》游戏中,我们已经成功的在屏幕上创建了外星人群。但目前,都只是静态的展示,并没有动起来。

这一次,我们要实现的功能是,让外星人群左右和向下移动。

首先让外星人群向右移动,当碰到右边屏幕边缘的时候,向下移动一定距离,然后再向左移动,碰到左边屏幕边缘的时候,向下移动一定距离,再向相反方向移动。重复这个过程,直到所有外星人被消灭,或者有外星人碰到了飞船,或者是触碰到了屏幕的底部边缘。

向右移动外星人群

首先在settings.py中添加一个控制外星人速度的设置。

class Settings:

def __init__(self):

"""窗口的宽高,背景颜色"""

......

"""外星人速度的设置"""

self.alien_speed_factor = 1

在alien.py中创建一个update()函数,来更新外星人的位置。

"""更新外星人的位置"""

def update(self):

"""向右移动外星人"""

self.x += self.ai_settings.alien_speed_factor

self.rect.x = self.x

每次更新外星人的位置,都是将外星人向右移动,每次外星人移动的量都是ai_settings.alien_speed_factor的值。

不过每次都是使用self.x来记录每个外星人的准确位置,因为这个属性是可以存储小数值的。

最后使用self.x的值来更新外星人的rect的位置。

在game_functions.py中定义函数update_aliens(aliens),用来更新外星人群中每个外星人的位置。

"""更新外星人的位置"""

def update_aliens(aliens):

"""更新外星人群中所有外星人的位置"""

aliens.update()

这里是对编组aliens调用update()方法,将会自动对编组中的每个外星人调用update()方法。

最后我们需要在alien_invasion.py的while循环中调用update_aliens()。

"""游戏循环体"""

while True:

.....

"""更新外星人群的位置"""

gf.update_aliens(aliens)

判断外星人是否撞到了屏幕边缘

现在我们发现,外星人向右移动的时候,是可以穿过屏幕的右边缘的。

我们需要设置下,当外星人群到达屏幕右边缘或左边缘的时候,怎么办?

在alien.py模块中定义一个函数,当外星人群到达屏幕边缘的时候,就返回True。

alien.py

def check_edges(self):

"""如果外星人位于屏幕边缘就返回True"""

self.screen_rect = self.screen.get_rect()

if self.rect.right >= self.screen_rect.right:

return True

elif self.rect.left <= 0:

return True

在settings.py中为外星人添加一个方向设置:

self.fleet_drop_speed = 10

self.fleet_direction = 1 # 1表示向右,-1表示向左

我们使用fleet_direction表示外星人运动的方向,1表示外星人群向右,-1表示外星人群向左。

定义了一个变量fleet_drop_speed,表示有外星人撞到边缘时,外星人群向下移动的速度。

还要修改update()方法,让外星人的速度乘以方向。速度为正,表示外星人群向右运动,速度为负,表示外星人群向左运动。

"""更新外星人的位置"""

def update(self):

"""向右或向左移动外星人"""

self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)

self.rect.x = self.x

向下移动外星人群并改变移动方向:

当有外星人碰到屏幕边缘的时候,需要将外星人群下移,并改变他们的移动方向。我们在game_functions.py模块中,定义一个函数change_fleet_direction()来实现这个功能。

def change_fleet_direction(ai_settrings,aliens):

"""将整群外星人下移,并改变方向"""

for alien in aliens.sprites():

alien.rect.y += ai_settrings.fleet_drop_speed

ai_settrings.fleet_direction *= -1

我们还需要检测有没有外星人到达左边缘或右边缘,如果有的话,就需要调用change_fleet_direction()函数,然后使用break终止程序。

def check_fleet_edges(ai_settings,aliens):

"""有外星人到达边缘时采取的措施"""

for alien in aliens.sprites():

if alien.check_edges():

change_fleet_direction(ai_settings,aliens)

break

我们使用for循环遍历外星人编组中的所有外星人,只要有一个外星人满足条件alien.check_edges(),即有外星人触碰到屏幕左边缘或者右边缘,就会调用change_fleet_direction()函数,将外星人群下移,并改变运动方向。然后使用break,跳出循环。

def check_fleet_edges(ai_settings,aliens):

"""有外星人到达边缘时采取的措施"""

for alien in aliens.sprites():

if alien.check_edges():

change_fleet_direction(ai_settings,aliens)

break

最后在update_aliens()中调用check_fleet_edges()方法,每次更新显示外星人群的时候,就需要判断是否有外星人触碰到屏幕边缘。

"""更新外星人的位置"""

def update_aliens(ai_settings,aliens):

"""检查是否有外星人位于屏幕边缘,并更新正群外星人的位置"""

check_fleet_edges(ai_settings,aliens)

aliens.update()

最后,我们还需要在alien_invasion.py的while循环中将ai_settings作为实参传递给update_aliens()函数。

"""游戏循环体"""

while True:

"""事件"""

......

"""更新外星人群的位置"""

gf.update_aliens(ai_settings,aliens)文章参考书籍《Python编程:从入门到实践》

尝试一下,外星人群就开始移动起来了。

下一次,我们将实现飞船对外星人的射击功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值