为什么我的pygame代码运行报'builtin_function_or_method'不可下标TypeError?
错误根源
你遇到的'builtin_function_or_method' object is not subscriptable报错,直接原因是将pygame.key.get_pressed方法当成数组用方括号[]索引了,该方法需要先加圆括号调用,返回按键状态数组后才能读取对应按键的状态。
需要修正的所有问题
- 语法错误:
pygame.key.get_pressed是可调用方法,必须写成pygame.key.get_pressed()才能获得按键状态序列,再用[]读取对应按键的状态 - 代码位置错误:按键检测逻辑必须放在游戏主循环(
main函数内的while True代码块)中,才能每帧检测按键状态;放在main函数外的代码只会在程序启动时执行一次,且执行时pygame还未完成初始化 - 操作对象错误:你修改的是
Player类本身的属性,应该修改你实例化出来的player对象的坐标;且Player类没有自定义y属性,角色坐标存储在player.rect.y中 - 逻辑缺失:主循环中没有添加退出事件检测,窗口会触发无响应报错;
pygame.QUIT是事件常量不是函数,不需要加括号调用 - 冗余代码:全局作用域下创建的
screen = pygame.display.set_mode ((600, 400))没有实际作用,main函数中会重新创建窗口,可以直接删除 - 逻辑错误:原有移动逻辑的坐标修改方向写反了,W对应向上移动应该减少y坐标,S对应向下移动应该增加y坐标
修正后完整代码
import pygame WIDTH = 800 HEIGHT = 600 BACKGROUND = (0, 0, 0) class Player: def __init__(self): self.image = pygame.image.load("Player.png") self.rect = self.image.get_rect() def main(): pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() player = Player() while True: # 退出事件检测 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 按键检测与移动逻辑 key_state = pygame.key.get_pressed() if key_state[pygame.K_w]: player.rect.y -= 5 if key_state[pygame.K_s]: player.rect.y += 5 # 画面渲染 screen.fill(BACKGROUND) screen.blit(player.image, player.rect) pygame.display.flip() clock.tick(60) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Chainz Games
相关产品推荐
相关产品推荐

