1、源码来源:
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_x
和 dir_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.left
和 rect.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_x
和 dir_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.strong
为 True
),则可以摧毁铁块。
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),则可以摧毁铁块。
'''