当我移动 Sprite 时,它会留下重复项
Sprite leaves duplicates when I move it
一直在网上学习,利用各种教程在pygamewindow中画了一个精灵。我现在试图让它在屏幕上移动一定数量的像素(取决于从 diceroll 返回的数字)。
def diceroll():
roll = random.randint(1, 6)
print(roll)
playerCar.move_piece_hoz((WIDTH / 13) * roll)
def main():
run = True
clock = pygame.time.Clock()
while run: # a while loop to run the game out of, it sets the clock speed and also consistently checks if
# user ever quits
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
diceroll()
# checks any updates to the array of sprites
all_sprites_list.update()
# draws all our sprites in their respective positions
all_sprites_list.draw(screen)
# Refresh Screen
pygame.display.flip()
main()
有相关代码,我基本上想要它,所以只要玩家按下鼠标左键,它就会调用掷骰子函数,然后在棋盘上随机选择数量的棋子。但是,每当我按下鼠标左键时,精灵基本上都停留在它的当前位置,并在它应该去的地方绘制一个新的副本。我附上了一张图片,以防对我的意思有任何混淆 here。精灵是红色方块。
如果我在 main() 函数之外单独使用 : diceroll() 手动调用该函数。精灵被正确重绘,没有任何问题,也没有留下重复项,但是这样我只能调用它一次,这不是我需要的。
谢谢。
screen
是一个 pygame.Surface
对象。
当您在 Surface 上绘制内容时,存储在 Surface 对象中的像素数据会发生变化。整个场景在每一帧中都被重新绘制。您需要在每一帧清除显示或绘制背景:
def main():
run = True
clock = pygame.time.Clock()
while run: # a while loop to run the game out of, it sets the clock speed and also consistently checks if
# user ever quits
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
diceroll()
screen.fill(0) # <--- this is missing
# checks any updates to the array of sprites
all_sprites_list.update()
# draws all our sprites in their respective positions
all_sprites_list.draw(screen)
# Refresh Screen
pygame.display.flip()
main()
典型的 PyGame 应用程序循环必须:
- 通过调用
pygame.event.pump()
or pygame.event.get()
. 来处理事件
- 根据输入事件和时间(分别为帧)更新对象的游戏状态和位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象)
- 通过调用
pygame.display.update()
or pygame.display.flip()
更新显示
- 限制每秒帧数以限制 CPU 使用
pygame.time.Clock.tick
一直在网上学习,利用各种教程在pygamewindow中画了一个精灵。我现在试图让它在屏幕上移动一定数量的像素(取决于从 diceroll 返回的数字)。
def diceroll():
roll = random.randint(1, 6)
print(roll)
playerCar.move_piece_hoz((WIDTH / 13) * roll)
def main():
run = True
clock = pygame.time.Clock()
while run: # a while loop to run the game out of, it sets the clock speed and also consistently checks if
# user ever quits
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
diceroll()
# checks any updates to the array of sprites
all_sprites_list.update()
# draws all our sprites in their respective positions
all_sprites_list.draw(screen)
# Refresh Screen
pygame.display.flip()
main()
有相关代码,我基本上想要它,所以只要玩家按下鼠标左键,它就会调用掷骰子函数,然后在棋盘上随机选择数量的棋子。但是,每当我按下鼠标左键时,精灵基本上都停留在它的当前位置,并在它应该去的地方绘制一个新的副本。我附上了一张图片,以防对我的意思有任何混淆 here。精灵是红色方块。
如果我在 main() 函数之外单独使用 : diceroll() 手动调用该函数。精灵被正确重绘,没有任何问题,也没有留下重复项,但是这样我只能调用它一次,这不是我需要的。
谢谢。
screen
是一个 pygame.Surface
对象。
当您在 Surface 上绘制内容时,存储在 Surface 对象中的像素数据会发生变化。整个场景在每一帧中都被重新绘制。您需要在每一帧清除显示或绘制背景:
def main():
run = True
clock = pygame.time.Clock()
while run: # a while loop to run the game out of, it sets the clock speed and also consistently checks if
# user ever quits
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
diceroll()
screen.fill(0) # <--- this is missing
# checks any updates to the array of sprites
all_sprites_list.update()
# draws all our sprites in their respective positions
all_sprites_list.draw(screen)
# Refresh Screen
pygame.display.flip()
main()
典型的 PyGame 应用程序循环必须:
- 通过调用
pygame.event.pump()
orpygame.event.get()
. 来处理事件
- 根据输入事件和时间(分别为帧)更新对象的游戏状态和位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象) - 通过调用
pygame.display.update()
orpygame.display.flip()
更新显示
- 限制每秒帧数以限制 CPU 使用
pygame.time.Clock.tick