如何在玩家与精灵碰撞后改变玩家的图像

42 阅读2分钟

1.用户想在玩家与精灵发生碰撞时改变玩家的图像,并希望新图像的控制与玩家相同。用户已创建了玩家和汽车的类,但不知道如何继续。

  1. 解决方案: 接下来,我们可以使用 pygame.sprite.spritecollide() 函数来检测玩家和汽车的碰撞,并在碰撞发生时改变玩家的图像和控制。下面是一个代码段,展示了如何实现碰撞检测和图像/控制的改变:
import pygame
import sys

# 初始化 Pygame
pygame.init()

# 设置窗口属性
windowWidth = 1000
windowHeight = 500
windowTitle = "改变玩家图像"
screen = pygame.display.set_mode((windowWidth, windowHeight))
pygame.display.set_caption(windowTitle)
clock = pygame.time.Clock()

# 定义颜色
white = (255, 255, 255)
black = (0, 0, 0)
aqua = (0, 255, 255)

# 定义玩家类
class Player(pygame.sprite.Sprite):
    # 设定初始速度
    change_x = 0
    change_y = 0

    # 设置跳跃标志
    jump_ok = True

    # 设置移动平台列表
    movingPlatform_list = None

    # 定义帧计数器
    frame = 0

    # 定义碰撞后计数器
    frame_since_collision = 0

    # 初始化玩家类
    def __init__(self, x, y):
        # 调用父类初始化方法
        super().__init__()

        # 加载玩家图像
        self.images = []
        for i in range(1, 9):
            img = pygame.image.load(f"cat{i}.png").convert()
            img.set_colorkey(white)
            self.images.append(img)

        # 设置默认图像
        self.image = self.images[0]

        # 获取图像矩形对象
        self.rect = self.image.get_rect()

        # 设置玩家初始位置
        self.rect.x = x
        self.rect.y = y

    # 改变玩家速度
    def changespeed(self, x, y):
        self.change_x += x
        self.change_y += y

    # 更新玩家位置
    def update(self, blocks, tables, chairLeft, chairRight, carMode):
        # 移动玩家
        self.rect.x += self.change_x
        self.rect.y += self.change_y

        # 处理动画
        if self.change_x < 0:
            self.frame += 1
            if self.frame > 3 * 4:
                self.frame = 0
            self.image = self.images[self.frame // 4]
        elif self.change_x > 0:
            self.frame += 1
            if self.frame > 3 * 4:
                self.frame = 0
            self.image = self.images[self.frame // 4 + 4]

        # 检测碰撞
        block_hit_list = pygame.sprite.spritecollide(self, blocks, False)
        movingPlatform_hit_list = pygame.sprite.spritecollide(self, movingPlatform_list, False)
        table_hit_list = pygame.sprite.spritecollide(self, tables, False)
        chairLeft_hit_list = pygame.sprite.spritecollide(self, chairLeft, False)
        chairRight_hit_list = pygame.sprite.spritecollide(self, chairRight, False)

        # 处理碰撞
        for block in block_hit_list:
            if self.change_x > 0:
                self.rect.right = block.rect.left
            elif self.change_x < 0:
                self.rect.left = block.rect.right

        for movingPlatform in movingPlatform_hit_list:
            if self.change_x > 0:
                self.rect.right = movingPlatform.rect.left
            elif self.change_x < 0:
                self.rect.left = movingPlatform.rect.right

        for table in table_hit_list:
            if self.change_x > 0:
                self.rect.right = table.rect.left
            elif self.change_x < 0:
                self.rect.left = table.rect.right

        for chairLeft in chairLeft_hit_list:
            if self.change_x > 0:
                self.rect.right = chairLeft.rect.left
            elif self.change_x < 0:
                self.rect.left = chairLeft.rect.right

        for chairRight in chairRight_hit_list:
            if self.change_x > 0:
                self.rect.right = chairRight.rect.left
            elif self.change_x < 0:
                self.rect.left = chairRight.rect.right

        # 处理重力
        self.calc_grav()

    # 计算重力
    def calc_grav(self):
        self.change_y += 0.35

        if self.rect.y >= 460 and self.change_y >= 0:
            self.change_y = 0
            self.rect.y = 460
            self.frame_since_collision = 0
            self.jump_ok = True

    # 玩家跳跃
    def jump(self, blocks):
        if self.jump_ok:
            self.change_y = -8


# 定义汽车类
class Car(pygame.sprite.Sprite):
    # 设定初始速度
    change_x = 0
    change_y = 0

    # 设置移动平台列表
    movingPlatform_list = None

    # 定义帧计数器
    frame_since_collision = 0

    # 初始化汽车类
    def __init__(self, color, width, height):
        # 调用父类初始化方法
        super().__init__()

        # 设置汽车图像
        self.image = pygame.Surface([width, height])
        self.image.fill(aqua)

        # 获取图像矩形对象
        self.rect = self.image.get_rect()

    # 更新汽车位置
    def update(self, player, block_list, movingPlatform_list):
        # 移动汽车
        self.rect.x += self.change_x
        self.rect.y += self.change_y

        # 检测碰撞
        block_hit_list = pygame.sprite.spritecollide(self, block_list, False)
        movingPlatform_hit_list = pygame.sprite.spritecollide(self, movingPlatform_list, False)

        # 处理碰撞
        for block in block_hit_list:
            if self.change_x > 0:
                self.rect.right = block.rect.left
            elif self.change_x < 0:
                self.rect.left = block.rect.right

        for movingPlatform in movingPlatform_hit_list:
            if self.change_x > 0:
                self.rect.right = movingPlatform.rect.left
            elif self.change_x < 0:
                self.rect.left = movingPlatform.rect.right

        # 处理重力
        self.calc_grav()

    # 计算重力
    def calc_grav(self):
        self.change_y += 0.35

        if self.rect.y >= 460 and self.change_y >= 0:
            self.change_y = 0
            self.rect.y = 460
            self.frame_since_collision = 0


# 创建玩家和汽车精灵
player = Player(100, 100)
car = Car(aqua, 50, 50)

# 组建精灵组
blocks = pygame.sprite.Group()
tables = pygame.sprite.Group()
chairLeft = pygame.sprite.Group()
chairRight = pygame.sprite.Group()
movingPlatform_list = pygame.sprite.Group()

# 添加精灵到精灵组
blocks.add(block1, block2, block3)
tables.add(table1, table2)
chairLeft.add(chairLeft1, chairLeft2)
chairRight.add(chairRight1, chairRight2)
movingPlatform_list.add(movingPlatform1, movingPlatform2)

# 设置背景色
background_color = (255, 255, 255)

# 游戏主循环
while True:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()