开发类Sonic平台跳跃游戏时出现‘str对象无get_image属性’错误求助
问题分析与修复方案
错误原因
你遇到的 'str' object has no attribute 'get_image' 错误,核心问题出在 Player 类的初始化代码里:
sprite_sheet = 'spritesheet.png' self.image = sprite_sheet.get_image(x, y, width, height, self.color_key)
这里的 sprite_sheet 只是一个字符串(图片路径),而不是你定义的 SpriteSheet 类的实例。只有 SpriteSheet 类的对象才拥有 get_image 方法,字符串类型自然没有这个属性,所以触发了报错。
修复后的完整代码
我已经帮你修正了核心问题,同时补充了代码里缺失的细节,比如BLACK颜色定义、sprite组的update调用等:
import pygame import random import sys WINDOWWIDTH = 800 WINDOWHEIGHT = 600 WINDOWSIZE = [WINDOWWIDTH,WINDOWHEIGHT] WHITE = (255,255,255) RED = (255,0,0) GREEN = (0,255,0) BLUE = (0,0,255) BLACK = (0,0,0) # 补充缺失的BLACK颜色定义 COLORS = [WHITE,RED,GREEN,BLUE] FPS = 30 #Classes Go Here class SpriteSheet(object): def __init__(self, file_name): self.sprite_sheet = pygame.image.load(file_name).convert() def get_image(self, x, y, width, height, colorkey): image = pygame.Surface([width, height]).convert() image.blit(self.sprite_sheet, (0,0), (x,y, width, height)) image.set_colorkey(colorkey) return image class Player(pygame.sprite.Sprite): def __init__(self, x, y, width, height): super().__init__() #Sprite self.color_key = (72, 98, 78) # 修复:创建SpriteSheet类的实例,而非直接使用字符串路径 sprite_sheet = SpriteSheet('spritesheet.png') self.image = sprite_sheet.get_image(x, y, width, height, self.color_key) self.rect = self.image.get_rect() # Location self.rect.x = 10 self.rect.y = 100 # Velocity self.change_x = 0 self.change_y = 0 def update(self): self.rect.x += self.change_x self.rect.y += self.change_y def main(): global COLORS, WINDOWSIZE, DISPLAYSURF, FPSCLOCK pygame.init() DISPLAYSURF = pygame.display.set_mode(WINDOWSIZE) FPSCLOCK = pygame.time.Clock() #Initializations go here playerOne = Player(3, 20, 29, 39) active_sprite_list = pygame.sprite.Group() active_sprite_list.add(playerOne) while True: #Controls go here for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: playerOne.change_x += 5 # 调整数值,避免角色瞬间移出屏幕 if event.key == pygame.K_LEFT: playerOne.change_x -= 5 if event.key == pygame.K_UP: playerOne.change_y -= 5 if event.key == pygame.K_DOWN: playerOne.change_y += 5 if event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT: playerOne.change_x = 0 if event.key == pygame.K_LEFT: playerOne.change_x = 0 if event.key == pygame.K_UP: playerOne.change_y = 0 if event.key == pygame.K_DOWN: playerOne.change_y = 0 if event.type == pygame.QUIT: quit() DISPLAYSURF.fill(BLACK) #Game Logic goes here active_sprite_list.update() # 必须调用update,否则角色不会移动 #Drawing new objects go here active_sprite_list.draw(DISPLAYSURF) FPSCLOCK.tick(FPS) pygame.display.flip() #Additional Modules go here def quit(): pygame.quit() sys.exit() if __name__ == '__main__': main()
额外优化提示
- 我把按键控制的数值从50改成了5,原数值会让角色瞬间飞出屏幕,调整后更符合平台跳跃游戏的正常手感。
- 补充了
active_sprite_list.update()调用——pygame的sprite组需要主动调用update方法,才能执行每个sprite的update逻辑,不然即使修改了change_x/change_y,角色也不会移动。 - 补上了缺失的BLACK颜色定义,避免执行
DISPLAYSURF.fill(BLACK)时触发NameError。
内容的提问来源于stack exchange,提问作者eeK csgo
相关产品推荐
相关产品推荐

