当前位置: 首页 > 知识库问答 >
问题:

瓷砖碰撞与沿墙滑动

朱修德
2023-03-14

我有一个球,我可以在由大小相等的瓷砖组成的地图上移动。玩家应该不能在较暗且有黑色边框的瓷砖上行走。我有一个多维的瓷砖阵列,我用它来检查哪些瓷砖是实心的。

我希望玩家在水平和垂直移动时,可以靠墙滑动。问题是,如果他那样做,他就会固执己见。我设法使它在每个轴上都能完美工作,但是分开的。下面是我的水平碰撞检查代码:

if (vx < 0) {
    // checks for solid tiles left of the player
    if (level.isBlocked(i, j) || level.isBlocked(i, jj)) {
        x = side * (i + 1); // moves player to left side of tile
        vx = 0;
    }
} else if (vx > 0) {
    // checks for solid tiles right of the player
    if (level.isBlocked(ii, j) || level.isBlocked(ii, jj)) {
        x = (ii * side) - getWidth(); // moves player to right side of tile
        vx = 0;
    }
}

level.isBlocked() 方法检查数组的索引是否被实心磁贴占用。i 和 j 变量是数组中玩家右上角所在的索引。ii 和 jj 变量是玩家右下角所在的数组中的哪个索引。

这很好,但是如果我在下面添加相同的代码块,但用y替换x,用vy替换vx,那么问题就会出现。所以我可以添加水平或垂直碰撞处理,它可以工作,但不能同时工作。我看过一些文章解释我必须把它们分开,但我不太理解。如何检查两个轴上的碰撞并保持滑动效果?

共有2个答案

戚默
2023-03-14

顶部路径将与左侧墙壁发生碰撞,并且需要< code > VX = 0;(水平运动停止),而底部路径与底壁碰撞,将需要< code > vy = 0;,或者停止垂直运动。

我认为为了做你想要的那种碰撞检测,你需要计算玩家路径和方块壁的交集,而不仅仅是检查玩家是否与方块重叠。您可以通过计算玩家矩形和块矩形的重叠矩形来破解所需的行为。请考虑以下情况:

红色方块代表你的玩家。重叠矩形(玩家位于方块顶部的小矩形)宽于高的事实表明,发生的是垂直碰撞,而不是水平碰撞。然而,这并非万无一失。它仍然要求你能够访问块的形状,而不仅仅是测试玩家矩形的一部分是否与块重叠。

姚骁
2023-03-14

我终于让它起作用了。Angelatsize的回答有助于理解这个问题,但我决定从头开始。我最终首先计算了新的x和y位置,并将它们存储在单独的变量中。然后我检查了播放器左中间下方的图块和右中间的图块。然后如果玩家因为水平速度而站在图块上,我将布尔值设置为true。如果没有碰撞,我将实x变量设置为我之前计算的新变量。然后我对垂直碰撞重复同样的事情。

这用于水平检查:

float newX = x + vx * delta;
boolean xCollision = false;
if (vx < 0) {
    int i = level.toIndex(x);
    int j = level.toIndex(y + getHeight() / 2);
    xCollision = level.isBlocked(i, j);
} else if (vx > 0) {
    int i = level.toIndex(x + getWidth());
    int j = level.toIndex(y + getHeight() / 2);
    xCollision = level.isBlocked(i, j);
}
if (!xCollision) x = newX;
 类似资料:
  • 我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。 在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。 在图2中,我展示了“碰撞左侧”,这也很棒。 但是在图3中,你可以看到这个

  • 我已经尝试解决了平滑的玩家-墙壁碰撞的问题,这样玩家可以沿着墙壁滑动。 我尝试了以下内容: 但是如果玩家碰到了墙,他不会滑动...他只是停下来了。(我对W,A,S,D也是分开做的。) 只有当我将玩家位置设置回他正在触摸的墙壁位置时,它才有效。如下: 但是它不起作用,因为对于与另一面墙相连的墙,玩家会接触更多的边,玩家会跳到角落...所以它只适用于一面墙... 我的问题是:如何以另一种方式使玩家与墙

  • 我在我的瓷砖碰撞方法中遇到了一个问题。由于某种原因,玩家可以在不应该通过的时候通过一些瓷砖。此外,我不完全确定为什么,但当它卡住时,它可以通过对象向左移动,但只能向左移动。我在下面发布了一些代码,如果有人能给我指出正确的方向就好了。(或者如果有人能找到一个快速的解决方案就更好了!)我的玩家移动方法和瓷砖碰撞方法都在更新方法中调用。

  • 我已经尝试了好几天,花了几个小时在网上搜索,但无济于事。我在碰撞时遇到问题,我可以检测到碰撞,但我的问题是阻止玩家进入图块。我已经尝试了所有我能想到的。我正在检测我的瓷砖贴图的冲突,使用1表示实体,0表示被动 这工作正常,我的文本播放器变成红色,一旦与瓷砖碰撞,但我不知道如何防止玩家进入那个瓷砖开始,我目前的设置我试图禁用移动,但所有发生的是玩家进入碰撞设置为true和控件禁用,导致玩家完全卡住。

  • 所以我目前正在尝试做一个几乎像迷宫一样的游戏。问题是墙壁碰撞,一旦角色撞到墙上,我就不能再把他弄出来了,不管碰撞后我试图带他去哪个方向,他都会被“卡住”。我想的一个解决方案是,每当角色撞到墙上时,“支持他”,这样就不会再检测到碰撞。然而,当我这样做的时候,他以一种奇怪的方式穿墙。这是我的代码,所以你们可以知道我在做什么: 这段代码的很大一部分实际上是从另一个问同样问题的人那里得到的。即使按照另一个

  • 我一直在尝试在Libgdx中找到/创建矩形的碰撞检测,但似乎什么都做不到。我有一个叫bucket的矩形,宽度和高度为64,还有一个叫wall的矩形,宽度和高度为64。我试着让玩家不穿过矩形,可以在粘墙的同时继续移动,而不需要通过相位或随机传送。我的方法在有1个块的情况下有效,但当有多个块的时候,它就会中断,不起作用。 我知道这种方法很难看但这只是实验 如果有人能给我指出正确的方向或分享一些对我有帮