Как мне предотвратить «мерцание черепахи» при каждом обновлении цикла в этом коде?

#python #turtle-graphics #python-turtle

#python #черепаха-графика #python-turtle

Вопрос:

Вот мой код. Каждый раз, когда я выполняю цикл, он создает мерцание черепахи вместо чистого движения, на которое я надеюсь.

Я полагаю, что ошибка находится в цикле 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()
 

Ответ №1:

Основная проблема заключается в том, что вы не используете turtle.update() должным образом, т. Е. В контексте выключения turtle.tracer() . Однако есть и второстепенные проблемы: while True: не имеет никакого отношения к среде, управляемой событиями, такой как turtle; вместо того, чтобы иметь три экземпляра Sprite, манипулирующих (и постоянно изменяющих) одной pen turtle, почему бы не сделать Sprites turtles и elminate stamping, пока мы этим занимаемся.

Переработайте ваш код в соответствии с приведенными выше строками:

 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() .)