You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame开发Dodger游戏 角色选择后仅加载默认玩家图片问题

问题原因

无论选哪个角色都加载默认玩家图,核心是两个逻辑错误:

  1. 你只修改了imagelink这个字符串属性,但Player类初始化时已经用默认路径生成了pygwidgets.Image实例,单纯改字符串不会替换已经加载到内存里的图片对象。
  2. 你在Inventory场景里单独创建的self.player实例,和实际游戏运行的Play场景里的Player实例完全独立,切场景时没有把选中的角色信息传递过去,Play场景自然还是用默认初始化的玩家图。

角色选择界面运行效果

修复方案

按以下三步修改代码即可:

  • 第一步:给Player类新增皮肤切换方法,替换实际加载的图片资源,同时重新计算角色移动边界
    修改Player.py代码如下:
import pygame
import pygwidgets
from Constants import *

class Player():
    def __init__(self, window):
        self.window = window
        self.imagelink = 'images/player.png'
        self.image = pygwidgets.Image(window,
                                (-100, -100), self.imagelink)
        playerRect = self.image.getRect()
        self.maxX = WINDOW_WIDTH - playerRect.width
        self.maxY = GAME_HEIGHT - playerRect.height

    # 新增皮肤切换方法
    def changeSkin(self, newImagePath):
        self.imagelink = newImagePath
        self.image.replace(newImagePath)
        # 针对不同尺寸的角色图重新计算移动边界
        playerRect = self.image.getRect()
        self.maxX = WINDOW_WIDTH - playerRect.width
        self.maxY = GAME_HEIGHT - playerRect.height

    def update(self, x, y):
        if x < 0:
            x = 0
        elif x > self.maxX:
            x = self.maxX
        if y < 0:
            y = 0
        elif y > self.maxY:
            y = self.maxY

        self.image.setLoc((x, y))
        return self.image.getRect()

    def draw(self):
        self.image.draw()
  • 第二步:修改Inventory场景逻辑,不需要在该场景内创建Player实例,选择角色后把对应皮肤路径通过场景跳转参数传递给游戏场景
    修改Inventory.py:
    1. 删除__init__方法里的self.player = Player(window)这行冗余代码
    2. 修改角色按钮的点击事件逻辑,跳转时传入选中的皮肤路径:
def handleInputs(self, eventsList, keyPressedList):
    for event in eventsList:
        if self.quitButton.handleEvent(event):
            self.quit()

        elif self.backButton.handleEvent(event):
            self.goToScene(Constants.SCENE_PLAY)

        if self.player0.handleEvent(event):
            self.goToScene(Constants.SCENE_PLAY, data='images/player.png')

        elif self.player1.handleEvent(event):
            self.goToScene(Constants.SCENE_PLAY, data='images/player1.jpg')

        elif self.player2.handleEvent(event):
            self.goToScene(Constants.SCENE_PLAY, data='images/player2.png')
  • 第三步:在游戏主场景(SCENE_PLAY对应的Scene类)的enter方法中接收传递的皮肤路径,调用切换方法更新角色外观
    参考逻辑如下(如果你Play场景里已经完成了Player实例初始化,只需要加enter方法的处理即可):
def enter(self, data):
    # 从角色选择界面传过来的皮肤路径不为空时,切换皮肤
    if data is not None:
        self.player.changeSkin(data)

注意:检查player2对应的图片路径是否正确,当前代码里角色选择按钮用的预览图是images/char1_inv.png,但跳转传的路径是images/player2.png,需要确保该路径下的图片文件真实存在,否则会触发资源加载错误。

内容的提问来源于stack exchange,提问作者lam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:18:52