当前位置:   article > 正文

python 外星人大战 之子弹类_bullets.sprite

bullets.sprite

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

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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

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

    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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

    def bullet_add(self):
        """
        添加子弹到编组
        """
        bullet = Bullet(self.screen, self.air_ship)
        self.bullets.add(bullet)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

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

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

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

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

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

 while True:
      ....
      # 更新子弹
      self.bullets.update()
  • 1
  • 2
  • 3
  • 4

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/123201
推荐阅读
相关标签
  

闽ICP备14008679号