如何消除Pygame代码中使用Vector时的Rect拖尾移动问题
问题:Pygame中Vector实现移动出现拖尾(类似贪吃蛇效果)
我正在探索Pygame中的Vector,尝试用它实现基础移动功能。目前已能控制Rect,但存在拖尾问题(类似贪吃蛇效果),希望仅保留初始单个Rect移动且无拖尾。我尝试过多种修复方法均无效,恳请帮忙指出错误并解决。
以下是我的代码:
import pygame, sys from pygame.math import Vector2 class PLAYER: def __init__(self): self.x = cell_size self.y = cell_size self.pos = Vector2(self.x, self.y) self.direction = Vector2(0, 0) def draw_player(self): player_rect = pygame.Rect(int(self.pos.x * cell_size), int(self.pos.y * cell_size), cell_size, cell_size) pygame.draw.rect(win, colors["GREEN"], player_rect) def move_player(self): self.pos += self.direction class MAIN: def __init__(self): self.player = PLAYER() def update(self): self.player.draw_player() self.player.move_player() def collision(self): pass def gameover(self): pass pygame.init() pygame.font.init() # SCREEN SETUP cell_size = 20 cell_number = 40 win = pygame.display.set_mode((cell_size * cell_number, cell_size * cell_number)) pygame.display.set_caption("Catch me") icon = pygame.image.load("football.png") pygame.display.set_icon(icon) colors = { "RED":(255, 0, 0), "BLUE":(0, 0, 255), "GREEN":(0, 255, 0), } SCREEN_UPDATE = pygame.USEREVENT pygame.time.set_timer(SCREEN_UPDATE, 150) game = MAIN() run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == SCREEN_UPDATE: game.update() if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: game.player.direction = Vector2(0, -1) if event.key == pygame.K_DOWN: game.player.direction = Vector2(0, 1) if event.key == pygame.K_RIGHT: game.player.direction = Vector2(1, 0) if event.key == pygame.K_LEFT: game.player.direction = Vector2(-1, 0) pygame.display.update()
问题原因与修复方案
拖尾问题的核心是每次绘制新玩家Rect前未清空屏幕,旧的Rect会残留在画面中,叠加后形成类似贪吃蛇的拖尾效果。
修复步骤:
- 新增背景色(比如黑色),在每次绘制前用背景色填充整个窗口,覆盖之前的所有绘制内容。
- 调整
MAIN.update方法的执行顺序:先移动玩家更新位置,再绘制玩家,逻辑更合理。
修改后的完整代码:
import pygame, sys from pygame.math import Vector2 class PLAYER: def __init__(self): self.x = cell_size self.y = cell_size self.pos = Vector2(self.x, self.y) self.direction = Vector2(0, 0) def draw_player(self): player_rect = pygame.Rect(int(self.pos.x * cell_size), int(self.pos.y * cell_size), cell_size, cell_size) pygame.draw.rect(win, colors["GREEN"], player_rect) def move_player(self): self.pos += self.direction class MAIN: def __init__(self): self.player = PLAYER() def update(self): # 先移动更新位置,再绘制 self.player.move_player() self.player.draw_player() def collision(self): pass def gameover(self): pass pygame.init() pygame.font.init() # SCREEN SETUP cell_size = 20 cell_number = 40 win = pygame.display.set_mode((cell_size * cell_number, cell_size * cell_number)) pygame.display.set_caption("Catch me") icon = pygame.image.load("football.png") pygame.display.set_icon(icon) colors = { "RED":(255, 0, 0), "BLUE":(0, 0, 255), "GREEN":(0, 255, 0), "BLACK":(0, 0, 0) # 新增背景色 } SCREEN_UPDATE = pygame.USEREVENT pygame.time.set_timer(SCREEN_UPDATE, 150) game = MAIN() run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == SCREEN_UPDATE: # 每次更新前先清空屏幕 win.fill(colors["BLACK"]) game.update() if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: game.player.direction = Vector2(0, -1) if event.key == pygame.K_DOWN: game.player.direction = Vector2(0, 1) if event.key == pygame.K_RIGHT: game.player.direction = Vector2(1, 0) if event.key == pygame.K_LEFT: game.player.direction = Vector2(-1, 0) pygame.display.update()
内容的提问来源于stack exchange,提问作者Adley Lafleur
相关产品推荐
相关产品推荐

