我知道这个问题在网上和这里已经被问过了,但不幸的是并非针对Python环境。在网上搜索时,我找到了这个(链接),从那里开始进行工作。由于我正在使用Pyglet,我将该函数编写为一个线程。但首先,我会向您展示我的想法和目标:
P = 精灵玩家的位置
M = 鼠标的位置
C = 一个想象中的圆,它的半径是P和M之间的距离
0、1、2、3、4、5、6、7 = 精灵可以朝向的方向
a = 一个方向与另一个方向之间的角度 = 45°
S = 对应于精灵方向的圆形部分。简单地说,如果M在S中出现,则方向等于1。
start、end = 起始角度和结束角度
因此,在函数中,我插入了一个while循环。稍后,我必须计算半径何时为:
while mpc_thread:
radius = math.hypot(mpx - cpx, mpy - cpy) + 20
mpx,mpy = 鼠标位置(X,Y)
cpx,cpy = 精灵玩家位置(X,Y)
我使用了math.hypot
,感谢这个(Link)。我添加了20,以便半径略微超过鼠标的位置。
然后,我添加了一个for循环来检查每个方向的圆形部分:
while mpc_thread:
radius = math.hypot(mpx - cpx, mpy - cpy) + 20
for ang_obj in range(0, fchar):
reference_angle = 360 // fchar * ang_obj
s_angle = reference_angle - (360 / (fchar / 2))
e_angle = reference_angle + (360 / (fchar / 2))
fchar = 精灵方向的数量,在这种情况下为8
为了找出每个方向的起始和结束角度,我将弧度角除以两倍的方向数。然后从参考角度中减去/加上结果。
从这里开始出现了问题。按照我发布第一个链接的方式编写,if函数没有检测到任何内容,如果我进入负数,则会出现错误。然后我寻找解决方法,并在用户7048690的答案中找到了这个(Link)。修改了函数之后,我遇到了一个新问题(数学域错误)。所以我用cmath.sqrt
替换了math.sqrt
,它就可以工作了。但是又出现了一个新问题。也就是说,始终遵循那个答案,if函数会将FPS大幅降低到0/1。现在我不知道该往哪里去。你能帮我解决这个问题吗?我希望我理解了我的问题。
radius = math.hypot(mpx - cpx, mpy - cpy) + 20
有关。我最初认为你想计算一个特定距离的点。 - Rabbid76