Pygame中正方形无法移动反而横向拉长的问题咨询
问题原因与解决方案
你的问题核心是每次循环都在创建新的正方形对象并添加到精灵组中,导致精灵组里的正方形越来越多——虽然你调用了screen.fill("cyan")清屏,但随后draw()会把组里所有历史创建的正方形都渲染出来,看起来就像一个正方形被横向拉长,而非单个正方形移动。
正确实现方式
不需要每次循环创建新正方形,只需初始化单个正方形实例,在循环中更新它的位置即可:
import pygame pygame.init() screen = pygame.display.set_mode((500,500)) class Square(pygame.sprite.Sprite): def __init__(self,col,x,y): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((50,50)) self.image.fill(col) self.rect = self.image.get_rect() self.rect.center = (x,y) # 初始化单个正方形并加入精灵组 x = 200 square = Square("crimson", x, 200) squares = pygame.sprite.Group() squares.add(square) run = True while run: # 处理窗口退出事件(必须添加,否则窗口无法正常关闭) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.time.delay(500) # 直接更新已有正方形的位置 x += 50 square.rect.center = (x, 200) screen.fill("cyan") squares.update() squares.draw(screen) pygame.display.flip() pygame.quit()
关键修改说明
- 把正方形的创建逻辑移到循环外,只初始化一次实例
- 循环内仅通过修改已有正方形的
rect.center属性来改变位置 - 补充了事件处理逻辑,确保窗口可以正常关闭
另外补充:如果你的需求是保留移动轨迹(显示多个正方形),那原代码逻辑是正确的;但如果要实现单个正方形移动,就必须只维护一个实例并更新它的位置。
内容的提问来源于stack exchange,提问作者Reese Moralde
相关产品推荐
相关产品推荐

