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

Love2D基于瓷砖的碰撞不起作用

钱青青
2023-03-14

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

    map = { {1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {2,2,1,1,1,3,3,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        }

function testTile(x,y)
    if map[y][x + 1] == 1 then
        canRight = true
    end

    if map[y][x + 1] ~= 1 then
        canRight = false
    end

    if map[y][x - 1] == 1 then
        canLeft = true
    end

    if map[y][x - 1] ~= 1 then
        canRight = false
    end

    if map[y + 1][x] == 1 then
        canDown = true
    end

    if map[y + 1][x] ~= 1 then
        canDown = false
    end

    if map[y - 1][x] == 1 then
        canUp = true
    end

    if map[y - 1][x] ~= 1 then
        canUp = false
    end
end

function movePlayer(dt)

    if love.keyboard.isDown("right") and canRight then
        playerX = playerX + 1 * dt
    end

    if love.keyboard.isDown("left") and canLeft then
        playerX = playerX - 1 * dt
    end

    if love.keyboard.isDown("down") and canDown then
        playerY = playerY + 1 * dt
    end

    if love.keyboard.isDown("up") and canUp then
        playerY = playerY - 1 * dt
    end
end

共有2个答案

仉洲
2023-03-14

原因是输入错误:

if map[y][x - 1] ~= 1 then
    canRight = false;
end

如果您不能向左移动,您可以将canright设置为false。这可能是复制/粘贴错误,因此如果您复制/粘贴代码,请务必小心。这是最常见的错误之一,并且这种错误很难检测到:P

另一个小建议:而不是使用

if map[y][x - 1] == 1 then
    canLeft = true;
end
if map[y][x - 1] ~= 1 then
    canLeft = false;
end

你可以用

else canLeft = false;

这将使代码更短,在我看来也更干净。

干亮
2023-03-14

左边的原因是在卡住时工作可能是因为您在testTile(x, y)的第四个if语句中有一个错字。

你写的

if map[y][x - 1] ~= 1 then
    canRight = false
end

而且应该是

if map[y][x - 1] ~= 1 then
    canLeft = false
end
 类似资料:
  • 我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。 在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。 在图2中,我展示了“碰撞左侧”,这也很棒。 但是在图3中,你可以看到这个

  • 我有一个球,我可以在由大小相等的瓷砖组成的地图上移动。玩家应该不能在较暗且有黑色边框的瓷砖上行走。我有一个多维的瓷砖阵列,我用它来检查哪些瓷砖是实心的。 我希望玩家在水平和垂直移动时,可以靠墙滑动。问题是,如果他那样做,他就会固执己见。我设法使它在每个轴上都能完美工作,但是分开的。下面是我的水平碰撞检查代码: level.isBlocked() 方法检查数组的索引是否被实心磁贴占用。i 和 j 变

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

  • 几个月来,我一直在尝试各种方法来创建基于二维磁贴的游戏。我一直让每个磁贴都是“磁贴”类的一个单独对象。磁贴对象存储在一个二维对象数组中。这已被证明是非常不切实际的,主要是在同时渲染多个磁贴的性能方面。我只允许在玩家渲染的一定距离内绘制磁贴,但这也不太好。当我尝试在游戏中编辑磁贴的值时,我也遇到了对象返回空指针异常的问题。这与2D数组中的对象未正确初始化有关。 有没有其他更简单的方法可以做到这一点?

  • 我在我的自上而下的游戏中实现了一个简单的基于瓷砖的碰撞系统,但是我在跨角移动方面遇到了问题。目前,我的程序采取了玩家的中心点,并在一个20px的正方形网格(交替的灰色背景)上做出一个瓷砖。它检查上、下、左、右贴图是否有冲突,如果找到冲突,它就进入下一个阶段。 下一个阶段是检查玩家在瓷砖内的位置。为此,我有一个名为的函数(我知道有创意的名字)。这将返回从瓷砖的中心点到玩家的中心点的距离的向量2i(x

  • 我正在尝试检测我的两个精灵何时发生碰撞。我做的第一件事是在我的播放器周围创建一个矩形(称为player.img),然后在我想检测的树周围创建另一个矩形(称为背景.treesrect)。我将玩家矩形的坐标设置为等于当用户按下键移动时更新的坐标,但玩家矩形不移动。然后我使用精灵.碰撞(精灵)函数来检测它们是否碰撞并且没有检测到。有人可以向我展示为什么我的播放器矩形没有更新以及其他任何可能错误的内容吗?