无缺陷的矩形鼠标碰撞检测与运动

2024-09-29 06:34:12 发布

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

我之前发了一篇关于我正在做的这个项目的帖子,但是我收到的信息还不够,所以我只是把这些都放在盘子里。我正在做的项目是一个非常类似于http://cursors.io的游戏。玩家控制游戏中的光标,光标跟随鼠标。但是,光标不能移动到墙和块等对象之外。 enter image description here

第三种方法,光标卡在交叉口

Terminology:

Cursor - The ingame object
Mouse  - The player's actual cursor

我试过几种方法。你知道吗

方法1

我试着在每一帧移动鼠标顶部的光标,如果它在可碰撞的形状对象内,它就不会移动该帧。然而,这 如果用户暂停游戏,将鼠标移到屏幕上的另一个位置并取消暂停,则会导致问题。或者,即使用户移动鼠标的速度足够快,能够在一帧内穿过一个物体的距离,他们也能够“故障”通过它。你知道吗

方法2

我尝试的下一种方法是在播放器鼠标的方向上每帧移动一组像素,应用与方法1相同的检查方法。这导致了抖动,缓慢的运动,担心如果设置的像素运动太高,它仍然会跳过非常薄的障碍。你知道吗

方法3

我尝试的最后一种方法是使用线段交点。我将定义一条从光标到鼠标的主线,然后是每个可碰撞对象的边界线。当鼠标移动时,我会检查主线段是否与任何边界线相交,如果是,则记录它。检查完所有边界线后,最接近的交点将保持不变。我会把光标移到那个交叉点,然后就完成了。如果没有交叉点,我就把光标移到鼠标上。但问题是,一旦光标移动到交叉点,它就会被卡住。交点停留在光标的新位置,因为它仍然位于边界线的正上方。同样,我想不出一种方法来让光标在边界线上滑动,跟随鼠标的x或y移动而不通过。你知道吗


一些示例代码:


# ============
#  Approach 1
# ============
# Game loop {
if not any([i.contains(mousepos) for i in collideables]):
    cursorpos = mousepos
# }

# ============
#  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]
# }

# ============
#  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]
# }

Tags: 对象方法in游戏forif鼠标intersect
2条回答

我认为方法3的代码实际上很好,但是游戏循环中的intersect测试应该过滤掉与鼠标位置一致的伪交点。 即测试if intersect and mouse_position != xy_from_intersect而不是if intersect。你知道吗

方法3是正确的,但有一个额外的: 我想你必须考虑这里的法线。如果边法线和光标移动方向的点积不为负,则可以安全地移动光标。 这里我们假设,形状的法线朝外。你知道吗

编辑: 关于交叉点-我想你可以通过检查至少一个交叉点的边与光标方向的法向点积是否为负来解决这个问题

相关问题 更多 >