美文网首页
【python3小白上路系列】添加开炮功能~(二)

【python3小白上路系列】添加开炮功能~(二)

作者: Charles_DT | 来源:发表于2020-08-15 00:03 被阅读0次

今天来接着更新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 循环外面创建的,这样就无需每次运行该循环时都创建一个新的子弹编组。如果在循环内部创建,会导致游戏非常卡顿,不信你可以试试。

相关文章

网友评论

      本文标题:【python3小白上路系列】添加开炮功能~(二)

      本文链接:https://www.haomeiwen.com/subject/fmfgdktx.html