6

我正在使用 Pygame 用 Python 编写游戏。
(我的显示窗口的)坐标
( 0 , 0 )位于左上角和
(640,480)右下角。

角度是
指向上方,
90°指向右侧。

我有一个居中位置的玩家精灵,我希望枪上的炮塔指向玩家。我该怎么做?
说,,
x1y1炮塔坐标
x2y2是玩家坐标,
a是角度的度量

4

4 回答 4

27

首先,math具有得心应手的atan2(denominator, numerator)功能。通常,您会使用atan2(dy,dx),但因为 Pygame 相对于笛卡尔坐标翻转 y 轴(如您所知),您需要制作dy负角,然后避免负角。(“dy”仅表示“y 的变化”。)

from math import atan2, degrees, pi
dx = x2 - x1
dy = y2 - y1
rads = atan2(-dy,dx)
rads %= 2*pi
degs = degrees(rads)

degs应该是你要找的。

于 2012-05-06T21:11:13.193 回答
2

考虑三角形

sin(angle)=opposed side / hypotenuse
于 2012-05-06T20:23:31.937 回答
1

你可能会想要这样的东西——你可能需要摆弄一下——我可能会偏离 180 度。您还需要对 dy==0 的情况进行特殊处理,而我没有为您这样做。

import math
# Compute x/y distance
(dx, dy) = (x2-x1, y2-y1)
# Compute the angle
angle = math.atan(float(dx)/float(dy))
# The angle is in radians (-pi/2 to +pi/2).  If you want degrees, you need the following line
angle *= 180/math.pi
# Now you have an angle from -90 to +90.  But if the player is below the turret,
# you want to flip it
if dy < 0:
   angle += 180
于 2012-05-06T20:37:39.830 回答
-4

好的,结合您的答案和其他一些网站,我找到了工作代码:

dx,dy = x2-x1,y2-y1

rads = math.atan2(dx/dy)
degs = math.degrees(rads)

我的其余代码对degs的负值并不挑剔。无论如何,它现在可以工作了,我想说谢谢你的帮助。

于 2012-05-19T11:37:58.923 回答