【问题标题】:How do I prevent "turtle flicker" with each loop update in this code?如何在此代码中的每个循环更新中防止“乌龟闪烁”?
【发布时间】:2021-03-27 09:35:23
【问题描述】:

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

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

【问题讨论】:

    标签: python turtle-graphics python-turtle


    【解决方案1】:

    主要问题是您没有正确使用turtle.update(),即在关闭turtle.tracer() 的情况下。但是,也有次要问题:while True: 在像海龟这样的事件驱动环境中没有业务;与其让三个 Sprite 实例操纵(并不断改变)一个 pen 乌龟,不如在我们处理它的时候制作 Sprites 乌龟并消除冲压。

    按照以上几行对您的代码进行修改:

    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() 发生冲突。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2018-03-29
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多