python 外星人大战 之子弹类

本篇我们实现我们小游戏外星人大战的子弹相关实现。

首先,我们创建一个子弹类:

import pygame
from pygame.sprite import Sprite


# 子弹类
class Bullet(Sprite):
    def __init__(self, screen, ship):
        super().__init__()

        # 要绘制到的屏幕
        self.screen = screen

        # 子弹宽度
        self.bullet_width = 4

        # 子弹高度
        self.bullet_height = 8

        # 子弹移动速度
        self.bullet_speed_factor = 1

        # 子弹背景色
        self.bullet_background = (60, 60, 62)

        # 子弹外接矩形
        self.bullet_rect = pygame.Rect(0, 0, self.bullet_width, self.bullet_height)

        # 子弹横轴坐标
        self.bullet_rect.centerx = ship.air_ship_rect.centerx

        # 子弹纵轴坐标--和飞船top一样,这样看起来就是从飞船射击出去的
        self.bullet_rect.top = ship.air_ship_rect.top

        # 小数存储y坐标
        self.bullet_y = float(self.bullet_rect.y)

    def update(self):
        """
        更新子弹位置,向屏幕上方移动
        """
        # 更新纵轴坐标
        self.bullet_y -= self.bullet_speed_factor

        # 更新子弹rect
        self.bullet_rect.y = self.bullet_y

    def blitme(self):
        """
        在指定屏幕绘制子弹
        """
        # 绘制子弹
        pygame.draw.rect(self.screen, self.bullet_background, self.bullet_rect)

其中只有两个方法,一个是绘制子弹的方法,一个是更新子弹位置的方法。每行代码都有注释,就不给大家一一说明了。

类创建完成后,我们需要在我们的控制类中添加对应的按键处理,这里我们选择使用空格键作为子弹发射的按键:

    def listening_key_down(self, event):
        """
        监听key_down事件
        :param event:
        """
        if event.key == pygame.K_RIGHT:
            self.air_ship.move_right = True
        elif event.key == pygame.K_LEFT:
            self.air_ship.move_left = True
        # 按下空格时创建一颗子弹,并添加之编组中去
        elif event.key == pygame.K_SPACE:
            self.bullet_add()

bullet_add方法生成一颗子弹,并且添加到子弹编组中去:

    def bullet_add(self):
        """
        添加子弹到编组
        """
        bullet = Bullet(self.screen, self.air_ship)
        self.bullets.add(bullet)

在控制类中我们声明这个编组:

# 声明子弹编组
self.bullets = Group()

这里面有一个新的概念:Group和Sprite

详细的介绍可以参考官方文档:
https://www.pygame.org/docs/ref/sprite.html

简单来说我们可以将我们游戏中的每一个元素看做是一个Sprite也就是精灵,这个可以当做是游戏对象的基类。至于Group则类似于一个列表,只不过这个列表给我们提供了一些很便捷的方法,可以方便的控制我们的精灵元素。比如,我们要更新子弹时,最开始想到的是用一个循环来做,依次调用子弹的update方法,而放入这个编组后,我们可以直接通过group的update方法更新所有的子弹。

最方便的是,我们可以通过pygame方便的对编组进行边缘碰撞的检测,这也是我们为什么会使用group的原因。

就像上面说的,我们最后一个步骤当然是要更新子弹后创建子弹了:

 while True:
      ....
      # 更新子弹
      self.bullets.update()

在我们的update_game_screen方法中增加子弹绘制:

# 绘制子弹
for bullet in self.bullets.sprites():
    bullet.blitme()

运行效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qingyulove/article/details/81568343