Pygame开发Dodger游戏 角色选择后仅加载默认玩家图片问题
问题原因
无论选哪个角色都加载默认玩家图,核心是两个逻辑错误:
- 你只修改了
imagelink这个字符串属性,但Player类初始化时已经用默认路径生成了pygwidgets.Image实例,单纯改字符串不会替换已经加载到内存里的图片对象。 - 你在
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:- 删除
__init__方法里的self.player = Player(window)这行冗余代码 - 修改角色按钮的点击事件逻辑,跳转时传入选中的皮肤路径:
- 删除
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
相关产品推荐
相关产品推荐

