pygame开发调用Player类函数报self缺失或类未定义的解决方法
问题修复方案
错误原因
- 实例方法调用错误:
keyboard_input是Player类的实例方法,必须绑定实例对象才能调用,你直接用类名Player.keyboard_input()调用时,系统无法自动传入实例本身作为self参数,就会报缺少self的错误。 - 类定义位置错误:你把Player类定义放在了游戏主循环内部,如果尝试在类内部调用自身方法,此时类还未完成定义,就会提示Player未定义;而且类放在主循环里会导致每帧都重新定义类、生成新的玩家实例,玩家位置会一直重置在初始点,无法移动。
- 隐含逻辑错误:
- 外层主循环已经用
pygame.event.get()取出了所有事件队列的内容,keyboard_input里再调用pygame.event.poll()无法取到任何事件,按键逻辑不会生效 self.y没有在__init__中初始化,直接执行self.y += move会报属性不存在错误all_sprites精灵组和player实例放在主循环内每帧重建,没有实际意义
- 外层主循环已经用
修复步骤
- 将Player类定义、精灵组初始化、玩家实例创建的逻辑全部移到主循环外
- 在Player的
__init__方法中初始化位置属性,推荐直接操作pygame Sprite自带的self.rect.y属性 - 调整按键判断逻辑,直接通过
pygame.key.get_pressed()判断按键状态,不需要额外取事件 - 通过玩家实例
player调用keyboard_input方法,不要用类名调用
修正后代码
import pygame import os.path # 初始化pygame pygame.init() screen = pygame.display.set_mode([800, 576]) PlayerSprite = pygame.image.load(os.path.join('assets', 'sprites', 'player', '01.png')).convert_alpha() move = 2 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = PlayerSprite self.rect = self.image.get_rect() self.rect.center = 50, 50 def keyboard_input(self): keys = pygame.key.get_pressed() if keys[pygame.K_w] or keys[pygame.K_UP]: # 直接操作rect的y属性,不需要额外定义self.y,向上移动y坐标减小 self.rect.y -= move # 精灵组和玩家实例初始化放在主循环外 all_sprites = pygame.sprite.Group() player = Player() all_sprites.add(player) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill((125, 125, 125)) # 调用实例的按键处理方法 player.keyboard_input() all_sprites.draw(screen) # 增加画面刷新逻辑 pygame.display.flip() pygame.quit()
内容的提问来源于stack exchange,提问作者Techflash
相关产品推荐
相关产品推荐

