Поверните налево, направо, ускоряйтесь или замедляйтесь с помощью черепахи Python - PullRequest
0 голосов
/ 07 ноября 2018

Я использую черепаху, пытающуюся переместить мой Спрайт и позволить ему поворачиваться влево или вправо или ускоряться или замедляться. Но моя кодировка не работает. Он движется только в одном направлении, а затем исчезает на экране. Не уверен, где я ошибся.

import turtle
turtle.fd(0)
turtle.speed(0)
turtle.bgcolor("black")
turtle.hideturtle()
turtle.setundobuffer(1)
turtle.tracer(1)


class Sprite(turtle.Turtle):
    def __init__(self, spriteshape, color, startx, starty):
        turtle.Turtle.__init__(self, shape=spriteshape)
        self.speed(0)
        self.penup()
        self.color(color)
        self.fd(0)
        self.goto(startx, starty)
        self.speed = 1

    def move(self):
        self.fd(self.speed)


class Player(Sprite):
    def __init__(self, spriteshape, color, startx, starty):
        Sprite.__init__(self, spriteshape, color, startx, starty)
        self.speed = 4
        self.lives = 3

    def turn_left(self):
        self.lt(45)

    def turn_right(self):
        self.rt(45)

    def accelerate(self):
        self.speed += 1

    def decelerate(self):
        self.speed -= 1


# Create my sprite
player = Player("triangle", "white", 0, 0)
turtle.onkey(player.turn_left, "Left")
turtle.onkey(player.turn_right, "Right")
turtle.onkey(player.accelerate, "Up")
turtle.onkey(player.decelerate, "Down")
turtle.listen()

# Main game loop
while True:
    player.move()

1 Ответ

0 голосов
/ 08 ноября 2018

Ваш код, по-видимому, работает - он просто запускается так быстро, что трудно получить контроль над ним, прежде чем он исчезнет с экрана. Основная проблема, которую я вижу в коде, заключается в том, что вы оба переопределили turtle.speed, пытаясь использовать как его оригинальное, так и новое определение. Вы должны придумать другое имя для вашей переменной экземпляра 'speed'.

Следующая проблема заключается в том, что вы используете while True:, которому нет места в мире, управляемом событиями, как черепаха. Вы должны использовать событие таймера вместо этого. Следующая доработка решает обе вышеуказанные проблемы и настраивает некоторые другие детали:

from turtle import Screen, Turtle

class Sprite(Turtle):
    def __init__(self, spriteshape, color, startx, starty):
        super().__init__(shape=spriteshape)
        self.my_speed = 1

        self.speed('fastest')
        self.color(color)
        self.penup()
        self.goto(startx, starty)

    def move(self):
        self.forward(self.my_speed)

class Player(Sprite):
    def __init__(self, spriteshape, color, startx, starty):
        super().__init__(spriteshape, color, startx, starty)
        self.my_speed = 4

    def turn_left(self):
        self.left(45)

    def turn_right(self):
        self.right(45)

    def accelerate(self):
        self.my_speed += 1

    def decelerate(self):
        self.my_speed -= 1

# Main game loop
def run():
    player.move()
    screen.ontimer(run, 50)

screen = Screen()
screen.bgcolor("black")

# Create my sprite
player = Player("triangle", "white", 0, 0)

screen.onkey(player.turn_left, "Left")
screen.onkey(player.turn_right, "Right")
screen.onkey(player.accelerate, "Up")
screen.onkey(player.decelerate, "Down")
screen.listen()

run()

screen.mainloop()
...