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