【Pygame小游戏(4)——Bullet类的作用】

 1、源码来源:

wangxingyao/TankWar: 小游戏坦克大战(python + pygame) (github.com)icon-default.png?t=N7T8https://github.com/wangxingyao/TankWar?tab=readme-ov-file

2、Bullet 类的主要作用是定义和管理游戏中的子弹对象。它处理子弹的图像、方向、移动、碰撞检测以及生命周期控制。这个类可以用于在游戏中发射子弹,并处理子弹在屏幕上的行为和与其他物体的交互。

具体来说,Bullet 类实现了以下功能:

  1. 子弹的图像加载与管理

    • 加载子弹在不同方向上的图像,并根据子弹的方向动态切换图像。
  2. 子弹的方向控制

    • 根据给定的方向设置子弹的移动方向,并切换子弹的图像,使子弹在正确的方向上显示和移动。
  3. 子弹的移动

    • 根据当前的方向和速度移动子弹,更新子弹在屏幕上的位置。
  4. 子弹的生命周期管理

    • 通过检测子弹是否碰到屏幕边缘,决定子弹是否继续存在。如果子弹超出屏幕边界,就将其标记为“死亡”(即将self.life设为False),从而在游戏中移除这个子弹。
  5. 碰撞检测(在注释代码中)

    • 虽然被注释掉了,但这部分代码展示了如何检测子弹与其他游戏对象(如砖块、铁块)的碰撞,并决定子弹的行为,例如摧毁障碍物或让子弹消失。

主要应用场景:

  • 在游戏中,每当玩家或敌人发射子弹时,可以创建一个 Bullet 对象,并使用它来管理子弹的行为。
  • 通过这个类,可以很方便地实现子弹的发射、移动、方向控制以及与其他游戏对象的交互,如击中敌人、障碍物等。

简而言之,这个类是用来控制游戏中子弹的生成、移动和消亡的一个核心组件,是实现射击类游戏的基础部分。


3、这个代码定义了一个使用Pygame模块的Bullet类,继承自pygame.sprite.Sprite类,用于表示一个可以在屏幕上移动和进行碰撞检测的子弹对象。下面对代码进行详细解释。

1. 引入Pygame模块并定义子弹类

import pygame

class Bullet(pygame.sprite.Sprite):
  • import pygame: 引入Pygame模块,它是Python中用于开发2D游戏的库。
  • class Bullet(pygame.sprite.Sprite): 定义一个Bullet类,并继承自pygame.sprite.Spritepygame.sprite.Sprite是Pygame中用于处理精灵(游戏对象)的基类,提供了管理游戏对象的功能,如绘制、移动、碰撞检测等。

2. 构造函数__init__

def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    
    self.bullet_up = pygame.image.load(r"..\image\bullet_up.png")
    self.bullet_down = pygame.image.load(r"..\image\bullet_down.png")
    self.bullet_left = pygame.image.load(r"..\image\bullet_left.png")
    self.bullet_right = pygame.image.load(r"..\image\bullet_right.png")

    self.dir_x, self.dir_y = 0, 0
    self.speed  = 6
    self.life   = False
    self.strong = False

    self.bullet = self.bullet_up
    self.rect = self.bullet.get_rect()
    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
  • pygame.sprite.Sprite.__init__(self): 调用父类pygame.sprite.Sprite的构造函数,初始化精灵对象的基础属性。
  • self.bullet_up, self.bullet_down, self.bullet_left, self.bullet_right: 这些属性分别加载了子弹向上、向下、向左、向右时的图像文件。这些图像会根据子弹的方向进行切换。
  • self.dir_x, self.dir_y: 表示子弹的移动方向,分别对应于X轴和Y轴上的方向。(0, -1)表示向上移动,(0, 1)表示向下,(-1, 0)表示向左,(1, 0)表示向右。
  • self.speed: 子弹的移动速度。
  • self.life: 表示子弹是否存活。如果为False,则子弹消失。
  • self.strong: 表示子弹是否为强力子弹。如果为True,子弹能摧毁更坚固的障碍物。
  • self.bullet: 保存当前方向的子弹图像,初始值为self.bullet_up
  • self.rect: 获取当前子弹图像的矩形区域,用于确定子弹在屏幕上的位置和检测碰撞。
  • self.rect.left, self.rect.right: 设置子弹的初始位置。这些位置计算是相对于屏幕或游戏区域的大小和布局。

3. changeImage 方法

def changeImage(self, dir_x, dir_y):
    self.dir_x, self.dir_y = dir_x, dir_y
    if self.dir_x == 0 and self.dir_y == -1:
        self.bullet = self.bullet_up
    elif self.dir_x == 0 and self.dir_y == 1:
        self.bullet = self.bullet_down
    elif self.dir_x == -1 and self.dir_y == 0:
        self.bullet = self.bullet_left
    elif self.dir_x == 1 and self.dir_y == 0:
        self.bullet = self.bullet_right
  • self.dir_x, self.dir_y = dir_x, dir_y: 更新子弹的移动方向。
  • 根据dir_xdir_y的值,确定子弹当前的移动方向,并切换到对应的子弹图像。比如,如果方向是向上移动 (0, -1),则使用self.bullet_up图像。

4. move 方法

def move(self):
    self.rect = self.rect.move(self.speed * self.dir_x,
                               self.speed * self.dir_y)
            
    if self.rect.top < 3:
        self.life = False
    if self.rect.bottom > 630 - 3:
        self.life = False
    if self.rect.left < 3:
        self.life = False
    if self.rect.right > 630 - 3:
        self.life = False
  • self.rect = self.rect.move(self.speed * self.dir_x, self.speed * self.dir_y): 根据当前的移动方向和速度,更新子弹的位置。
  • 检查子弹是否碰到屏幕的边缘。如果子弹超出了屏幕的边界(即rect的顶部、底部、左侧或右侧超出了指定范围),则将self.life设为False,表示子弹消失。

5. 碰撞检测(注释部分)

# 碰撞 brickGroup
#if pygame.sprite.spritecollide(self, brickGroup, True, None):
#    self.life = False
#    moving = 0
# 碰撞 ironGroup
#if self.strong:
#    if pygame.sprite.spritecollide(self, ironGroup, True, None):
#        self.life = False
#else:    
#    if pygame.sprite.spritecollide(self, ironGroup, False, None):
#        self.life = False
#    moving = 0
#return moving

这些代码被注释掉了,但它们展示了如何检测子弹与其他物体的碰撞。

  • pygame.sprite.spritecollide(self, brickGroup, True, None): 检查子弹是否与brickGroup(表示一组砖块)的任何成员发生碰撞。如果发生碰撞,删除碰撞的砖块,并将子弹的self.life设为False
  • if self.strong::检查子弹是否为强力子弹。如果是,子弹可以摧毁ironGroup中的障碍物,否则只是停止子弹的移动并将self.life设为False

总结

这个Bullet类实现了一个简单的子弹对象,可以在游戏中使用。它能够在不同方向上移动,根据碰撞检测决定其生命状态,并在移动中与游戏世界中的其他对象进行交互。


源代码:

import pygame
# 引入Pygame模块,它是Python中用于开发2D游戏的库。


class Bullet(pygame.sprite.Sprite):
    '''
    定义一个Bullet类,并继承自pygame.sprite.Sprite。
    pygame.sprite.Sprite是Pygame中用于处理精灵(游戏对象)的基类,
    提供了管理游戏对象的功能,如绘制、移动、碰撞检测等。
    '''
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        #  调用父类pygame.sprite.Sprite的构造函数,初始化精灵对象的基础属性。

        self.bullet_up = pygame.image.load(r"..\image\bullet_up.png")
        self.bullet_down = pygame.image.load(r"..\image\bullet_down.png")
        self.bullet_left = pygame.image.load(r"..\image\bullet_left.png")
        self.bullet_right = pygame.image.load(r"..\image\bullet_right.png")
        '''
        self.bullet_up, self.bullet_down, self.bullet_left, self.bullet_right: 
            这些属性分别加载了子弹向上、向下、向左、向右时的图像文件。
        这些图像会根据子弹的方向进行切换。
        '''




        # 子弹方向   速度   生命   碎石
        self.dir_x, self.dir_y = 0, 0
        '''
        表示子弹的移动方向,
        分别对应于
        X轴和Y轴上的方向。(0, -1)表示向上移动,
        (0, 1)表示向下,(-1, 0)表示向左,(1, 0)表示向右。
        '''
        self.speed  = 6  # 子弹的移动速度。
        self.life   = False  # 表示子弹是否存活。如果为False,则子弹消失。
        self.strong = False  # : 表示子弹是否为强力子弹。如果为True,子弹能摧毁更坚固的障碍物。

        self.bullet = self.bullet_up # 保存当前方向的子弹图像,初始值为self.bullet_up。
        self.rect = self.bullet.get_rect()  #   获取当前子弹图像的矩形区域,用于确定子弹在屏幕上的位置和检测碰撞。
        self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
        #设置子弹的初始位置。这些位置计算是相对于屏幕或游戏区域的大小和布局。
    
    def changeImage(self, dir_x, dir_y):
        self.dir_x, self.dir_y = dir_x, dir_y   #更新子弹的移动方向。
        if self.dir_x == 0 and self.dir_y == -1:
            self.bullet = self.bullet_up
        elif self.dir_x == 0 and self.dir_y == 1:
            self.bullet = self.bullet_down
        elif self.dir_x == -1 and self.dir_y == 0:
            self.bullet = self.bullet_left
        elif self.dir_x == 1 and self.dir_y == 0:
            self.bullet = self.bullet_right

         #  根据dir_x和dir_y的值,确定子弹当前的移动方向,并切换到对应的子弹图像。比如,如果方向是向上移动 (0, -1),则使用self.bullet_up图像。

        

    #   move 方法
    def move(self):
        self.rect = self.rect.move(self.speed * self.dir_x,
                                   self.speed * self.dir_y)
         # 根据当前的移动方向和速度,更新子弹的位置。

        # 碰撞地图边缘
        if self.rect.top < 3:
            self.life = False
        #    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
        if self.rect.bottom > 630 - 3:
            self.life = False
        #    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
        if self.rect.left < 3:
            self.life = False
        #    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
        if self.rect.right > 630 - 3:
            self.life = False
        #    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24
        '''
        以上代码检查子弹是否碰到屏幕的边缘。
        如果子弹超出了屏幕的边界(即rect的顶部、底部、左侧或右侧超出了指定范围),
        则将self.life设为False,表示子弹消失。
        '''



        #
        # #碰撞 brickGroup
        # if pygame.sprite.spritecollide(self, brickGroup, True, None):
        #    self.life = False
        #    moving = 0
        # #碰撞 ironGroup
        # if self.strong:
        #    if pygame.sprite.spritecollide(self, ironGroup, True, None):
        #        self.life = False
        # else:
        #    if pygame.sprite.spritecollide(self, ironGroup, False, None):
        #        self.life = False
        #    moving = 0
        # return moving
        #

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值