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

开发类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()

额外优化提示

  1. 我把按键控制的数值从50改成了5,原数值会让角色瞬间飞出屏幕,调整后更符合平台跳跃游戏的正常手感。
  2. 补充了 active_sprite_list.update() 调用——pygame的sprite组需要主动调用update方法,才能执行每个sprite的update逻辑,不然即使修改了change_x/change_y,角色也不会移动。
  3. 补上了缺失的BLACK颜色定义,避免执行DISPLAYSURF.fill(BLACK)时触发NameError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:08:20