Python Turtle Mouse не следует непосредственно - PullRequest
0 голосов
/ 01 февраля 2019

Как заставить черепаху двигаться без использования turtle.goto(x,y), но turtle.speed(speed) и turtle.heading(angle)?Мне нужно это для игры, которую я делаю.Где мышь, я хочу заставить ее двигаться в этом направлении.Но когда я изменяю его, он переходит к тому месту, к которому потом приходит моя мышь:

import turtle

screen = turtle.Screen()
screen.title("Test")
screen.bgcolor("white")
screen.setup(width=600, height=600)

ship = turtle.Turtle()
ship.speed(1)
ship.shape("triangle")
ship.penup()
ship.goto(0,0)
ship.direction = "stop"
ship.turtlesize(3)
turtle.hideturtle()
def onmove(self, fun, add=None):
        if fun is None:
            self.cv.unbind('<Motion>')
        else:
            def eventfun(event):
                fun(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale)
            self.cv.bind('<Motion>', eventfun, add)
def goto_handler(x, y):
    onmove(turtle.Screen(), None)
    ship.setheading(ship.towards(x, y)) #this is where you use the x,y cordinates and I have seat them to got to x,y and set heading
    ship.goto(x,y)
    onmove(turtle.Screen(), goto_handler)

onmove(screen, goto_handler)

Если вы только setheading и speed, он просто поворачивается в этом направлении и не двигается.Если вы попробуете этот код, он сработает - просто я использую ship.goto(x, y), что заставляет его перейти на (x, y).Но когда вы меняете мышь, когда она движется, она сначала переходит к (x, y), а затем к вашей новой позиции мыши.Я просто хочу, чтобы она просто следовала за мышью, но я не могу этого сделать.

1 Ответ

0 голосов
/ 01 февраля 2019

Я полагаю, что код ниже дает вам движение, которое вы хотите.Он использует onmove(), чтобы скрыть позицию цели, и использует ontimer(), чтобы целиться и перемещать черепаху.Он также останавливается, когда цель была охвачена:

from turtle import Screen, Turtle, Vec2D

def onmove(self, fun, add=None):
    if fun is None:
        self.cv.unbind('<Motion>')
    else:
        def eventfun(event):
            fun(Vec2D(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale))

        self.cv.bind('<Motion>', eventfun, add)

def goto_handler(position):
    global target

    onmove(screen, None)
    target = position
    onmove(screen, goto_handler)

def move():
    if ship.distance(target) > 5:
        ship.setheading(ship.towards(target))
        ship.forward(5)

    screen.ontimer(move, 50)

screen = Screen()
screen.title("Test")
screen.setup(width=600, height=600)

ship = Turtle("triangle")
ship.turtlesize(3)
ship.speed('fast')
ship.penup()

target = (0, 0)

onmove(screen, goto_handler)

move()

screen.mainloop()
...