如何防止代码中每次循环更新时出现“海龟闪烁”?

2024-10-03 11:23:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码。每次我循环,它都会产生乌龟的闪烁,而不是我所希望的干净的动作

我相信错误在底部的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()

Tags: selfupdatescreencolorplayershapespritedy
1条回答
网友
1楼 · 发布于 2024-10-03 11:23:54

主要问题是您没有正确地使用turtle.update(),即在关闭turtle.tracer()的上下文中。然而,还有一些次要的问题:while True:不应该处于像turtle这样的事件驱动环境中;与其让三个精灵实例操纵(并不断改变)一只pen海龟,不如让精灵海龟和elminate在我们工作时跺脚

按照上述思路重新编写代码:

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()之间存在冲突。)

相关问题 更多 >