如何防止此代码中的每个循环更新"turtle flicker"?



这是我的代码。每次我循环通过时,它都会产生海龟的闪烁,而不是像我希望的那样干净的运动。

我相信错误在底部的While True循环中,我尝试了各种方法来消除闪烁,但都没有成功。使用PyCharm和最新版本的Python。

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
wn = turtle.Screen()
wn.setup(SCREEN_WIDTH, SCREEN_HEIGHT)
wn.title("Space Arena:")
wn.bgcolor("black")
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
class Sprite():
def __init__(self, x, y, shape, color):
self.x = x
self.y = y
self.shape = shape
self.color = color
dx =0
dy =0
def update(self):
self.x += self.dy
self.y += self.dy
def render(self, pen):
pen.goto(self.x, self.y)
pen.shape(self.shape)
pen.color(self.color)
pen.stamp()
player = Sprite(0, 0, "triangle", "white")
player.dx = -1
player.dy = 0.5
enemy = Sprite(0, 100, "square", "red")
enemy.dx = -1
enemy.dy = 0.3
powerup = Sprite(0, -100, "circle", "blue")
powerup.dx = -1
powerup.dy = 0.1
#sprites list
sprites = []
sprites.append(player)
sprites.append(enemy)
sprites.append(powerup)
#main loop
while True:
#clear screen
pen.clear()
#do game stuff
#uptate sprites
for sprite in sprites:
sprite.update()
#render sprite
for sprite in sprites:
sprite.render(pen)
#update the screen
turtle.update()
wn.mainloop()

主要问题是您没有正确使用turtle.update(),即在关闭turtle.tracer()的情况下。然而,也存在次要问题:while True:不需要像turtle那样处于事件驱动的环境中;与其让三个精灵实例操纵(并不断更改(一只pen海龟,为什么不让精灵海龟和elmate在我们工作的时候盖章呢?

按照以上几行重新编写代码:

from turtle import Screen, Turtle, Vec2D
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
class Sprite(Turtle):
def __init__(self, position, delta, shape, color):
super().__init__(shape)
self.penup()
self.color(color)
self.setposition(position)
self.speed('fastest')
self.delta = Vec2D(*delta)
def update(self):
self.setposition(self.position() + self.delta)
screen = Screen()
screen.setup(SCREEN_WIDTH, SCREEN_HEIGHT)
screen.title("Space Arena:")
screen.bgcolor('black')
screen.tracer(False)
# sprites list
sprites = []
sprites.append(Sprite((0, 0), (-1, 0.5), 'triangle', 'white'))  # player
sprites.append(Sprite((0, 100), (-1, 0.3), 'square', 'red'))  # enemy
sprites.append(Sprite((0, -100), (-1, 0.1), 'circle', 'blue'))  # powerup
def move():
# update sprites
for sprite in sprites:
sprite.update()
screen.update()
screen.ontimer(move)
move()
screen.mainloop()

你应该得到你想要的流畅动作。(除非PyCharm和mainloop()之间发生冲突。(

最新更新