1

我认为标题是不言自明的,但只是为了澄清我试图弄清楚如何判断碰撞发生在哪一侧。

对于更多细节,我正在尝试制作一个类似迷宫的游戏,所以我不能简单地在碰撞时停止所有运动。相反,我需要能够判断碰撞发生在哪一侧,这样我才能阻止那个方向。

任何帮助表示赞赏,如果有更好的方法来解决这个问题,我全力以赴。

我希望这是足够的详细信息,但如果您需要更多信息,请询问,我会进行编辑。提前致谢。

[编辑] @viggity - 不,我没有使用任何特定的游戏引擎,我会发布当前的“检测”代码,但它有点,荒谬,强大。

@Streklin - 我正在使用 this.Paint 事件来绘制表单本身,因为建议我首先这样做以更好地实时绘制。我还使用了一个位置,每次计时器根据我按下的内容(左、右、上、下)滴答作响时都会更新。是的,迷宫是基于瓷砖的。目前它甚至只包含 3 种颜色。我不是一个非常高级的程序员。

@Eric - 绝对是一维游戏。同样,我只有 3 种颜色,线条为黑色,背景为白色,正方形(用户)为绿色。我正在使用带有位图的 DrawImage() 在屏幕上绘图。

[编辑伪代码摘要]

foreach(Wall _wall in wall) if(player.intersectsWith(_wall)) 停止移动;

@JeffH - 我不太确定你在问什么,因为除了我用来尝试让它工作的测试代码之外,这几乎就是所有东西。我唯一遗漏的是 if 语句来检查它是否是 x 轴,以便 x 和 y 可以彼此独立移动。因此,您可以靠着墙壁滑动,而不是因为您碰到墙壁而“卡住”。我没有看到包含这一点的意义,因为问题发生在此之前。

4

2 回答 2

4

假设您在这里谈论的是 3D 游戏。

您可以看到的脸部法线指向您,因此您的方向向量与脸部法线的点积将为负数。如果它是积极的,那么你是从后面来的。

如果它为零,则您将与脸部成直角行驶。

|              <---------- your direction of travel
|
|----------> <- face normal
|
| <- face

如果您不在 3D 中,那么您可以存储墙壁所面对的方向(作为 2D 矢量)并使用您的 2D 移动方向进行相同的点积。

于 2009-09-30T20:07:28.077 回答
0

根据您的编辑,您一次只能去一个方向?或者你可以沿对角线方向走吗?如果是后者,ChrisF 已经为您提供了 3D 的答案以及 2D 的相应信息。如果没有,您应该只需要停止沿行进方向行进 - 因为只有四种可能性,所以对于简单的入门游戏来说,检查它们应该很容易。

于 2009-09-30T20:56:19.793 回答