今天来接着更新bullet中的内容,移动和在屏幕上绘制子弹。
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,ai_settings,screen,ship):
# 在飞船所处位置创建一个子弹对象
super(Bullet,self).__init__()
self.screen = screen
# 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
self.rect = pygame.Rect(0,0,ai_settings.bullet_width,
ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 存储用小数表示的子弹位置
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
# 向上移动子弹
# 更新表示子弹位置的小数值
self.y -= self.speed_factor
# 更新表示子弹的rect位置
self.rect.y = self.y
def draw_bullet(self):
# 在屏幕上绘制子弹
pygame.draw.rect(self.screen,self.color,self.rect)
方法update() 管理子弹的位置。发射出去后,子弹在屏幕中向上移动,这意味着y 坐标将不断减小,因此为更新子弹的位置,我们从self.y 中减去self.speed_factor 的值。self.rect.y 设置为self.y 的值。属性speed_factor 让我们能够随着游戏的进行或根据需要提高子弹的速度,以调整游戏的行为。子弹发射后,其 x 坐标始终不变,因此子弹将沿直线垂直地往上穿行。
需要绘制子弹时,我们调用draw_bullet() 。函数draw.rect() 使用存储在self.color 中的颜色填充表示子弹的rect 占据的屏幕部分。
1.5.3 将子弹存储到编组中
定义Bullet 类和必要的设置后,就可以编写代码了,在玩家每次按空格键时都射出一发子弹。
首先,我们需要在alien_invasion.py中创建一个编组(group),用于存储所有有效的子弹,以便能够管理发射出去的所有子弹。这个编组将是pygame.sprite.Group 类的一个实例;pygame.sprite.Group 类类似于列表,但提供了有助于开发游戏的额外功能。在主循环中,我们将使用这个编组在屏幕上绘制子弹,以及更新每颗子弹的位置:
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(ship)
ship.update()
bullets.update()
gf.update_screen(ai_settings,screen,ship)
rungame()
我们导入了pygame.sprite 中的Group 类。创建了一个Group 实例,并将其命名为bullets 。这个编组是在while 循环外面创建的,这样就无需每次运行该循环时都创建一个新的子弹编组。如果在循环内部创建,会导致游戏非常卡顿,不信你可以试试。
网友评论