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

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()

关键修改点

  1. 初始化Player时,用get_rect(center=(...))把方块初始位置设为屏幕中央,替代原来默认的左上角。
  2. 把screen.blit的位置参数从固定坐标改成player.rect,这样方块会跟着rect的移动而移动。
  3. 可选添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:45:39