作为一个有良心的游戏,我们不能让玩家沉迷下去,所以子弹的数量我们要限制一下,变相增加游戏难度。
1.5.6 限制子弹数量
首先,在settings.py中存储所允许的最大子弹数:这里我们设置为3发。
class Settings():
#存储游戏设置
def __init__(self):
#初始化游戏设置
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
#飞船设置
self.ship_speed_factor = 1.5
#子弹设置
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullets_allowed = 3
下面我们需要在game_functions.py的check_keydown_events() 中,创建新子弹前检查未消失的子弹数是否小于该设置:
def check_keydown_events(event,ai_settings,screen,ship,bullets):
# 响应按键
if event.key == pygame.K_RIGHT:
#向右移动飞船
ship.moving_right = True
elif event.key == pygame.K_LEFT:
#向左移动飞船
ship.moving_left = True
elif event.key == pygame.K_SPACE:
#创建一颗子弹,并将其加入编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
玩家按空格键时,我们检查bullets 的长度。如果len(bullets) 小于3,我们就创建一个新子弹;但如果已有3颗未消失的子弹,则玩家按空格键时什么都不会发生。如果你 现在运行这个游戏,屏幕上最多只能有3颗子弹。
1.5.7 创建函数update_bullets()
编写并检查子弹管理代码后,可将其移到模块game_functions 中,以让主程序文件alien_invasion.py尽可能简单。我们创建一个名为update_bullets() 的新函数,并将其添加到game_functions.py的末尾:
def update_bullets(bullets):
# 更新子弹的位置
bullets.update() # 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
#print(len(bullets))
现在我们主程序的代码就更加简洁了:
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()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,bullets)
rungame()
1.5.8 创建函数fire_bullet()
下面将发射子弹的代码移到一个独立的函数中,这样,在check_keydown_events() 中只需使用一行代码来发射子弹,让elif 代码块变得非常简单:
def fire_bullet(ai_settings,screen,ship,bullets):
#创建一颗子弹,并将其加入编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
函数fire_bullet() 只包含玩家按空格键时用于发射子弹的代码;在check_keydown_events() 中,我们在玩家按空格键时调用fire_bullet() 。
网友评论