PyGame中Rect对象绘制角色不移动,直接传坐标正常的原因咨询
Pygame角色移动问题原因解析
问题现象
在自制Pygame小游戏中,最初通过pygame.Rect创建character矩形对象,修改character_pos_x/character_pos_y变量后,用pygame.draw.rect(screen, character_color, character)绘制角色,屏幕上角色无移动;改用直接传入坐标元组(character_pos_y, character_pos_x, character_size_y, character_size_x)调用绘制函数后,角色移动正常。
核心原因
pygame.Rect对象是独立的实体,创建时会将传入的坐标、尺寸值复制到自身的属性中(如x、y、width、height)。后续修改character_pos_x/character_pos_y这些单独的变量,并不会自动同步到character对象的内部属性。循环中绘制的始终是最初创建时的Rect位置,因此角色不会移动。
而直接传入坐标元组时,每次调用pygame.draw.rect都会使用最新的character_pos_x/character_pos_y值生成临时的矩形参数,自然能反映坐标变化。
正确的解决方式
有两种常见的修正思路:
1. 修改坐标变量后同步更新Rect对象
在每次修改character_pos_x/character_pos_y后,更新character的位置:
# 移动逻辑后添加 character.topleft = (character_pos_y, character_pos_x)
这样后续绘制character时,就会使用更新后的位置。
2. 直接操作Rect对象的属性,摒弃单独的pos变量
直接用Rect对象的x、y属性控制移动,不需要额外的character_pos_x/character_pos_y变量:
# 初始化时 character = pygame.Rect(200, 200, 100, 100) # 注意参数顺序是x, y, width, height(原代码将y放在首位易混淆,建议修正) # 循环内移动逻辑 if keys[pygame.K_UP]: character.y -= 10 if keys[pygame.K_LEFT]: character.x -= 10 if keys[pygame.K_DOWN]: character.y += 10 if keys[pygame.K_RIGHT]: character.x += 10 # 绘制时直接用character对象 pygame.draw.rect(screen, character_color, character)
完整问题代码
import pygame import time pygame.init() #defining ground_pos_x = 0 ground_pos_y = 400 ground_size_x = 500 ground_size_y = 50 ground_color = (0, 0, 0) ground = pygame.Rect(ground_pos_x, ground_pos_y, ground_size_x, ground_size_y) character_pos_x = 200 character_pos_y = 200 character_size_y = 100 character_size_x = 100 character_color = (50, 50, 50) character = pygame.Rect(character_pos_y, character_pos_x, character_size_y, character_size_x) fps = 60 clock = pygame.time.Clock() background_colour = (111, 222, 111) screen = pygame.display.set_mode((500, 500)) pygame.display.set_caption("test") screen.fill(background_colour) pygame.draw.rect(screen, character_color, character) pygame.draw.rect(screen, ground_color, ground) pygame.display.update() running = True while running: clock.tick(fps) screen.fill(background_colour) #movement keys = pygame.key.get_pressed() if keys[pygame.K_UP]: character_pos_x -= 10 if keys[pygame.K_LEFT]: character_pos_y -= 10 if keys[pygame.K_DOWN]: character_pos_x += 10 if keys[pygame.K_RIGHT]: character_pos_y += 10 pygame.draw.rect(screen, character_color, (character_pos_y, character_pos_x, character_size_y, character_size_x)) pygame.draw.rect(screen, ground_color, ground) #if character.colliderect(ground): # print("works") #else: # print("nope") pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False
内容的提问来源于stack exchange,提问作者Kirbemo
相关产品推荐
相关产品推荐

