<p>我之前发了一篇关于我正在做的这个项目的帖子,但是我收到的信息还不够,所以我只是把这些都放在盘子里。我正在做的项目是一个非常类似于<a href="http://cursors.io" rel="nofollow noreferrer">http://cursors.io</a>的游戏。玩家控制游戏中的光标,光标跟随鼠标。但是,光标不能移动到墙和块等对象之外。
<a href="https://i.stack.imgur.com/j142Y.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/j142Y.png" alt="enter image description here"/></a></p>
<p><em>第三种方法,光标卡在交叉口</em></p>
<pre><code>Terminology:
Cursor - The ingame object
Mouse - The player's actual cursor
</code></pre>
<p>我试过几种方法。你知道吗</p>
<h2>方法1</h2>
<p>我试着在每一帧移动鼠标顶部的光标,如果它在可碰撞的形状对象内,它就不会移动该帧。然而,这
如果用户暂停游戏,将鼠标移到屏幕上的另一个位置并取消暂停,则会导致问题。或者,即使用户移动鼠标的速度足够快,能够在一帧内穿过一个物体的距离,他们也能够“故障”通过它。你知道吗</p>
<h2>方法2</h2>
<p>我尝试的下一种方法是在播放器鼠标的方向上每帧移动一组像素,应用与方法1相同的检查方法。这导致了抖动,缓慢的运动,担心如果设置的像素运动太高,它仍然会跳过非常薄的障碍。你知道吗</p>
<h2>方法3</h2>
<p>我尝试的最后一种方法是使用线段交点。我将定义一条从光标到鼠标的主线,然后是每个可碰撞对象的边界线。当鼠标移动时,我会检查主线段是否与任何边界线相交,如果是,则记录它。检查完所有边界线后,最接近的交点将保持不变。我会把光标移到那个交叉点,然后就完成了。如果没有交叉点,我就把光标移到鼠标上。但问题是,一旦光标移动到交叉点,它就会被卡住。交点停留在光标的新位置,因为它仍然位于边界线的正上方。同样,我想不出一种方法来让光标在边界线上滑动,跟随鼠标的x或y移动而不通过。你知道吗</p>
<hr/>
<p>一些示例代码:</p>
<hr/>
<pre><code># ============
# Approach 1
# ============
# Game loop {
if not any([i.contains(mousepos) for i in collideables]):
cursorpos = mousepos
# }
</code></pre>
<hr/>
<pre><code># ============
# Approach 2
# ============
speed = 5
# Game loop {
dx = copysign(1, mousepos[0]-cursorpos[0])
dy = copysign(1, mousepos[1]-cursorpos[1])
destx = dx*speed
desty = dy*speed
if not any([i.contains([destx, desty]) for i in collideables]):
cursorpos = [destx, desty]
# }
</code></pre>
<hr/>
<pre><code># ============
# Approach 3
# ============
def lineIntersection(line1, line2):
# intersection code to determine x and y of intersection, as well
# as the distance across line1 to the intersection
if intersection:
return [x, y, distance]
return None
# Game loop {
closestIntersect = None
for collideable in collideables:
for boundaryline in collideable:
intersect = lineIntersection(mainline, boundaryline)
if intersect:
if not closestIntersect or intersect[2] < closestIntersect[2]:
closestIntersect = intersect
if closestIntersect:
cursorpos = intersect[0], intersect[1]
# }
</code></pre>