Я надеюсь пролить свет на это странное поведение, а не защищать его.Первое, что нужно помнить о нарисованных курсорах, это то, что когда (0, 0)
попадает в ваш курсор, это центральная точка, вокруг которой вращается ваш курсор, и пиксель в вашем курсоре, который попадает в любую точку, которую вы goto()
.
* 1004.* Некоторое понимание может быть найдено в документации
shapesize()
метода:
shapesize(stretch_wid=None, stretch_len=None, outline=None)
stretch_wid is stretchfactor perpendicular to orientation
stretch_len is stretchfactor in direction of turtles orientation.
То есть, если курсор находится в ориентации по умолчанию (восток), это меняет смысл X и Y. Я считаю, что эточто вы видите на своем рисунке.Плоскость X перпендикулярна ориентации (по вертикали), а плоскость Y - по направлению ориентации (по горизонтали).Противоположность того, что мы обычно ожидаем.
Это не ошибка класса Shape()
, но оно скрыто в логике курсора.Это может быть исторический артефакт - если мы изменим на mode("logo")
и запустим ваш код, мы получим:
![enter image description here](https://i.stack.imgur.com/KH3nG.png)
Больше, чем мы могли бы ожидать,учитывая, что ориентация по умолчанию в режиме «логотип» - северная, и более последовательная, чем раньше.
В любом случае, я бы сделал весла по-другому.Вместо пользовательского курсора я бы использовал квадрат курсора черепахи и изменил бы его по мере необходимости, используя shapesize()
:
from turtle import Screen, Turtle
CURSOR_SIZE = 20
screen = Screen()
t0 = Turtle("square")
t0.shapesize(20 / CURSOR_SIZE, 100 / CURSOR_SIZE)
t0.color("green")
screen.exitonclick()
Все еще повернутую логику (не графическую) из того, что вы могли ожидать, но, по крайней мере, в документации нам это сказано.Но то, что я на самом деле склонен делать, это сделать весло в неправильной ориентации и использовать settiltangle()
, но не в качестве обходного пути, как вы, а для того, чтобы заставить весло повернуться лицом в одном направлении, но двигатьсяв другом:
from turtle import Screen, Turtle
CURSOR_SIZE = 20
screen = Screen()
t0 = Turtle("triangle")
t0.shapesize(100 / CURSOR_SIZE, 20 / CURSOR_SIZE)
t0.settiltangle(90)
t0.penup()
t0.color("green")
t0.speed("slowest") # for demonstration purposes
t0.forward(300)
t0.backward(600)
t0.forward(300)
screen.exitonclick()
Обратите внимание, что я могу использовать forward(10)
и backward(10)
для перемещения своего весла и не делать ужасных вещей, таких как t0.setx(t0.xcor() + 10)
.Отлично работает в играх типа Space Invader, где игрок направлен вверх, но движется вбок.