昨天我们已经实现了开炮功能,但是随着子弹越来越多,我们需要把已经消失的子弹删除。这里肯定有疑问,既然已经消失了不就删除了吗?其实并没有,只是超过窗口大小的子弹我们看不见而已,所以我们要通过代码删除这些子弹。
1.5.5 删除已消失的子弹
import pygame
from pygame.sprite import Group
from setting import Settings
from ship import Ship
import game_functions as gf
def rungame():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化设置对象
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#创建一只飞船
ship = Ship(ai_settings,screen)
#创建一个用于存储子弹的编组
bullets = Group()
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
bullets.update()
# 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
print(len(bullets))
gf.update_screen(ai_settings,screen,ship,bullets)
rungame()
在for 循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。我们使用了方法copy() 来设置for 循环,这让我们能够在循环中修改bullets 。我们检查每颗子弹,看看它是否已从屏幕顶端消失。如果是这样,就将其从bullets 中删除。最后我们使用了一条print 语句,以显示当前还有多少颗子弹, 从而核实已消失的子弹确实删除了。
如果这些代码没有问题,我们发射子弹后查看终端窗口时,将发现随着子弹一颗颗地在屏幕顶端消失,子弹数将逐渐降为零。运行这个游戏并确认子弹已被删除后,将这条print语句删除。如果你留下这条语句,游戏的速度将大大降低,因为将输出写入到终端而花费的时间比将图形绘制到游戏窗口花费的时间还多。
网友评论