Pygame中Player.update无法响应按键,角色无法移动求助
Pygame方块无法移动问题解决及self含义解释
一、方块无法移动的原因及修复
你的代码核心问题是每次绘制方块时都固定在屏幕中央,忽略了player.rect的位置更新。另外代码里重复调用了pygame.init(),虽然不影响运行,但属于冗余操作。
修复后的完整代码
import pygame from pygame.locals import ( K_UP, K_DOWN, K_LEFT, K_RIGHT, K_ESCAPE, KEYDOWN, QUIT, ) pygame.init() SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) #Define a player object by extending pygame.sprite.Sprite # The surface drawn on the screen is now an attribute of Player class Player(pygame.sprite.Sprite): def __init__(self): super(Player,self).__init__() self.surf = pygame.Surface((75,25)) self.surf.fill((255,255,255)) # 初始化时把方块放到屏幕中央 self.rect = self.surf.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)) def update(self, pressed_keys): if pressed_keys[K_UP]: self.rect.move_ip(0,-5) if pressed_keys[K_DOWN]: self.rect.move_ip(0,5) if pressed_keys[K_LEFT]: self.rect.move_ip(-5,0) if pressed_keys[K_RIGHT]: self.rect.move_ip(5,0) # 可选:限制方块不超出屏幕 self.rect.clamp_ip(screen.get_rect()) #Instantiate player player = Player() #keeps main loop running running = True #main loop while running: for event in pygame.event.get(): if event.type == KEYDOWN: if event.key == K_ESCAPE: running = False elif event.type == QUIT: running = False pressed_keys = pygame.key.get_pressed() player.update(pressed_keys) screen.fill((0,0,0)) # 用player.rect的位置绘制方块 screen.blit(player.surf, player.rect) pygame.display.flip()
关键修改点
- 初始化
Player时,用get_rect(center=(...))把方块初始位置设为屏幕中央,替代原来默认的左上角。 - 把
screen.blit的位置参数从固定坐标改成player.rect,这样方块会跟着rect的移动而移动。 - 可选添加
self.rect.clamp_ip(screen.get_rect()),防止方块移出屏幕范围。
二、类和函数中的self是什么
self是类实例对象的自身引用,在定义类的方法时必须作为第一个参数传入。- 通过
self可以访问当前实例的属性和方法:比如self.rect、self.surf都是属于这个Player实例的独有属性,每个Player对象都有自己独立的这些属性。 - 举个实际例子:如果创建两个玩家
player_a = Player()和player_b = Player(),调用player_a.update()时,self就代表player_a,修改的是player_a的rect;调用player_b.update()时,self代表player_b,修改的是player_b的rect,这样两个方块的移动互不影响。
内容的提问来源于stack exchange,提问作者jarvic1207
相关产品推荐
相关产品推荐

