<p>如果你还想解决这个问题,你应该解决直角三角形(见图):</p>
<pre><code> px
-| x |
| | | |
| | x |
y |-[e]y y
| |/ | |
py -*py py
| /px | |
| / | | |
| / | | |
| / | | |
| -v | x |
y2=-280
x2=?
</code></pre>
<p>设<code>[e]</code>为敌,<code>*</code>为玩家,<code>x</code>和<code>y</code>为敌坐标,<code>px</code>和<code>py</code>为玩家坐标。对于所示的情况,应该从关系中获取<code>x2</code>坐标:<br/>
<code>(x-px)/(y-py) = (x-x2)/(y-(-280)) => (x-x2) = (y-(-280))*(x-px)/(y-py) =></code><br/>
<code>=> x2 = x-(y-(-280))*(x-px)/(y-py)</code>,<br/>
其中已知<code>x</code>、<code>y</code>、<code>px</code>、<code>py</code>和<code>y2</code>。你知道吗</p>
<p>你必须考虑玩家和敌人的相对位置,例如:</p>
<pre><code> px
-| x |
| | | |
| | | |
| | x |
y | . [e]y y
py -*py | -py
| . px | |
| . | | |
y2=? <. | | |
x2=-280| | | |
| | x |
</code></pre>
<p><code>(x-px)/(y-py) = (x-(-280))/(y-y2) => (y-y2) = (x-(-280))*(y-py)/(x-px) =></code><br/>
<code>=> y2 = y-(x-(-280))*(y-py)/(x-px)</code>,<br/>
以及坐标差异的符号。<br/>
在您的情况下,这将引导我们找到以下代码(我建议您将其设计为一个单独的函数):</p>
<pre><code>MAX_COOR=330
def bullet_calc(player,x,y):
diff_x=x-player.xcor()
diff_y=y-player.ycor()
if diff_y==0:
goal_y=y
if diff_x>0:
goal_x=-MAX_COOR
elif diff_x<=0:
goal_x=MAX_COOR
elif diff_x==0:
goal_x=x
if diff_y>0:
goal_y=-MAX_COOR
elif diff_y<=0:
goal_y=MAX_COOR
elif diff_x>0 and diff_y>0 and abs(diff_x)<abs(diff_y): # |- - enemy
goal_x=x-(y-(-MAX_COOR))*diff_x/diff_y # -* - * player
goal_y=-MAX_COOR # |
elif diff_x>0 and diff_y>0 and abs(diff_x)>abs(diff_y): # | _
goal_x=-MAX_COOR # -* -
goal_y=y-(x-(-MAX_COOR))*diff_y/diff_x # |
elif diff_x<0 and diff_y>0 and abs(diff_x)<abs(diff_y): # -|
goal_x=(y-MAX_COOR)*diff_x/diff_y-x # -* -
goal_y=-MAX_COOR # |
elif diff_x<0 and diff_y>0 and abs(diff_x)>abs(diff_y): # _ |
goal_x=MAX_COOR # -* -
goal_y=(x-(-MAX_COOR))*diff_y/diff_x-y # |
elif diff_x>0 and diff_y<0 and abs(diff_x)<abs(diff_y): # |
goal_x=(y-(-MAX_COOR))*diff_x/diff_y-x # -* -
goal_y=MAX_COOR # |_
elif diff_x>0 and diff_y<0 and abs(diff_x)>abs(diff_y): # |
goal_x=-MAX_COOR # -* _
goal_y=(x-MAX_COOR)*diff_y/diff_x-y # |
elif diff_x<0 and diff_y<0 and abs(diff_x)<abs(diff_y): # |
goal_x=x-(y-MAX_COOR)*diff_x/diff_y # -* -
goal_y=MAX_COOR # _|
elif diff_x<0 and diff_y<0 and abs(diff_x)>abs(diff_y): # |
goal_x=MAX_COOR # _ * -
goal_y=y-(x-MAX_COOR)*diff_y/diff_x # |
return (goal_x,goal_y)
</code></pre>
<p>在触发项目符号的函数中调用此代码似乎更容易:</p>
<pre><code>def enemy1_fire():
#the bullet will travel up from the player's position
global bulletstate1 # enable modifying global var from inside of function
if bulletstate1 == "ready":
bulletstate1 = "fired"
x = enemy1.xcor() # get the coordinates at the time of firing
y = enemy1.ycor()
bullet1.speed = 6
bullet1.setposition(x,y) # bullet will appear just above the player
bullet1.showturtle() # move <showturtle()> here
bullet1.goto(bullet_calc(player,x,y))
#bullet1.goto(player.xcor(), player.ycor()) # your old code
</code></pre>
<p>如果球员在场地中央,这一切就容易多了。你知道吗</p>