【Pygame小游戏(2)——坦克大战_子弹属性】

 1、源码来源:

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

2、Bullet 类的定义

class Bullet(pygame.sprite.Sprite):

Bullet 类继承自 pygame.sprite.Sprite,这是 Pygame 中用于管理和操作精灵的基础类。子弹被设计成一个精灵对象,可以与其他精灵交互(如碰撞检测等)。

3、初始化方法 __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

这里定义了子弹的方向(dir_xdir_y),速度(speed),生命状态(life),以及是否为强力子弹(strong)。

    self.bullet = self.bullet_up
    self.rect = self.bullet.get_rect()
    self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24

默认情况下,子弹图像为向上的子弹(bullet_up),并且根据子弹图像获取其矩形区域(rect),用于定位和碰撞检测。rect.leftrect.right 被初始化为指定位置。

4、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

这个方法根据传入的方向参数(dir_xdir_y)来更改子弹的图像,以对应子弹的飞行方向。

5、move 方法

def move(self):
    self.rect = self.rect.move(self.speed * self.dir_x,
                               self.speed * self.dir_y)

这个方法负责移动子弹。根据当前方向和速度更新子弹的 rect,使其向相应方向移动。

    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

这几行代码检测子弹是否超出了屏幕的边界(假设屏幕的尺寸为 630x630 像素)。如果超出边界,子弹的生命状态(self.life)被设置为 False,表示子弹应该消失。

6碰撞检测(注释掉的代码)

# 碰撞 brickGroup
#if pygame.sprite.spritecollide(self, brickGroup, True, None):
#    self.life = False
# 碰撞 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

这些注释掉的代码是为了检测子弹与砖块(brickGroup)和铁块(ironGroup)的碰撞。如果子弹碰撞到砖块或铁块,子弹的生命状态会被设置为 False。如果子弹是强力子弹(self.strongTrue),则可以摧毁铁块。

7. 总结

这个 Bullet 类主要管理子弹的初始化、方向改变、移动以及边界和碰撞检测。它利用 Pygame 提供的 sprite 模块,简化了精灵对象的管理和交互,适用于简单的2D射击游戏。


完整代码:

import pygame

# 1. Bullet 类的定义
class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        # 初始化精灵
        pygame.sprite.Sprite.__init__(self)
        # Bullet 类继承自 pygame.sprite.Sprite,这是 Pygame 中用于管理和操作精灵的基础类。
        # 子弹被设计成一个精灵对象,可以与其他精灵交互(如碰撞检测等)。
        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") # 右
        # 在初始化方法中,子弹的四个方向图像被加载到内存中,分别对应上、下、左、右方向。


        # 子弹方向   速度   生命   碎石
        # 这里定义了子弹的方向(dir_x 和 dir_y),速度(speed),生命状态(life),以及是否为强力子弹(strong)。
        self.dir_x, self.dir_y = 0, 0
        self.speed  = 6
        self.life   = False
        self.strong = False

        # 默认情况下,子弹图像为向上的子弹(bullet_up),并且根据子弹图像获取其矩形区域(rect),用于定位和碰撞检测。
        # rect.left 和 rect.right 被初始化为指定位置。
        self.bullet = 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)来更改子弹的图像,以对应子弹的飞行方向


    # 这个方法负责移动子弹。根据当前方向和速度更新子弹的 rect,使其向相应方向移动。
    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
        '''
        这几行代码检测子弹是否超出了屏幕的边界(假设屏幕的尺寸为 630x630 像素)。
        如果超出边界,子弹的生命状态(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

        '''
        这些注释掉的代码是为了检测子弹与砖块(brickGroup)和铁块(ironGroup)的碰撞。
        如果子弹碰撞到砖块或铁块,子弹的生命状态会被设置为 False。
        如果子弹是强力子弹(self.strong 为 True),则可以摧毁铁块。
        '''


  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值