为什么新的海龟形状有奇怪的方向(不是我定义的那个)?

2024-10-04 09:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python和Turtle创建另一个Pong克隆。我的目标是让我的学生(开始用Python编程)进一步练习。你知道吗

我想创造一个海龟的形状是一个水平填充矩形,像一个风格化的桨。但是当我创建一个我认为是方便的形状时,我得到了一个旋转的(垂直的)桨,而不是我希望的水平的。你知道吗

下面的代码演示了这种奇怪的行为。你知道吗

from turtle import *

begin_poly()
fd(200)
left(90)
fd(40)
left(90)
fd(200)
left(90)
fd(40)
left(90)
end_poly()
shape = get_poly()
register_shape("drawn", shape)

polyNotOk = ( (0,0), (100, 0), (100, 20), (0, 20) ) 
register_shape("polyNotOk", polyNotOk)

polyOk = ( (0,0), (0, 100), (20, 100), (20, 0) ) 
register_shape("polyOk", polyOk)

t1 = Turtle(shape="drawn")
t2 = Turtle(shape="polyNotOk")
t3 = Turtle(shape="polyOk")

t1.color("black")
t2.color("red")
t3.color("blue")

t1.stamp()
t2.stamp()
t3.stamp()

t1.goto(100,200)
t2.goto(100,-50)
t3.goto(100,-150)

t1.forward(100)
t2.forward(100)
t3.forward(100)

mainloop()

因此,您可以看到,如果运行代码,第一个图形就可以了,具有水平形状。但是当我戳海龟时,它的形状是垂直的。你知道吗

第二个形状也有同样的问题,通过polyNotOk定义(x和y坐标的值允许获得水平桨)。我需要创建一个“垂直”多边形得到一个水平桨。你知道吗

所以我能找到解决办法。但是我仍然对这个解决方案不满意,所以我请求您做出精彩的解释;—)提前谢谢。你知道吗


Tags: registerstamp水平leftcolor形状t1t3
1条回答
网友
1楼 · 发布于 2024-10-04 09:27:53

我希望阐明这种奇怪的行为,而不是为之辩护。关于绘制的光标,要记住的第一件事是,在光标绘制中(0, 0)落在哪里,那就是光标旋转的中心点,以及光标中落在goto()任何点上的像素。你知道吗

一些细节可以在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

更多我们可能期望的,鉴于“logo”模式的默认方向是北,并且比以前更加一致。你知道吗

不管怎样,我会用另一种方式划桨。我将使用turtle的square光标,而不是自定义光标,并根据需要使用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)这样糟糕的事情。适用于太空入侵者类型的游戏,玩家面朝上,但移动侧。你知道吗

相关问题 更多 >