0

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

地图和瓷砖碰撞

    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
4

2 回答 2

2

当它卡住时留下的原因可能是因为您iftestTile(x,y).

你写了

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

它应该是

if map[y][x - 1] ~= 1 then
    canLeft = false
end
于 2014-03-03T16:20:32.053 回答
0

原因是打字错误:

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

如果你不能移动,你就设置canRight为。这可能是复制/粘贴错误,所以如果您复制/粘贴代码,请务必小心。这是最常见的错误之一,而且这种错误很难被发现:Pfalseleft

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

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

你可以使用

else canLeft = false;

它会使代码更短,在我看来也更简洁。

于 2014-03-03T16:31:03.413 回答