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()

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值