2014-09-22 35 views
-1

我正在开发基于图块的游戏。但是,由于家具等因素,我的地图有多个图层。我(暂时)创建了一个广场来代表我的球员。为了阻止我的玩家在家具上行走,我需要制作一个检查图层的功能。我怎么做? (假如我需要在平铺层检查到我的球员立即右) 伪代码的想法:如何阻止玩家穿越图层?

function checkLayers() 
    for every layer in map 
     if layer == "furniturelayer" then 
      stop player 
     end 
    end 
end 

编辑:我发现了一个可能的方式做到这一点,但它不工作。我有一个数组,其中包含可碰撞的所有图块的GID。然后,我遍历所有图层并检查该图块是否具有该GID。代码:

function gCheckGID(gMap, gLayer, tileX, tileY) 

    tilex = gMap.layers[gLayer]:get(tileX, tileY) 
    return tilex.id 

end 

function gCheckMovement(gMap, gArray, gTileX, gTileY) 

    local retVal = true 
    local layerArray = gMap.layers 
    local layers = table.getn(layerArray) 

    for layerCounter = 1, layers, 1 do 
     currGID = gCheckGID(gMap, layerArray[layerCounter], gTileX, gTileY) 
     for gidCounter = 1, table.getn(gArray), 1 do 
      if currGID == gArray[gidCounter] then 
       retVal = false 
       break 
      end 
     end 
    end 

    return retVal 

end 

if语句然后我就可以使用得到的结果,并决定是否将我的角色或没有。

回答

3

我假设你正在使用平铺库“Simple Tiled Implementation”?如果是这样,我是作者。我最近刚刚使用love.physics(Box2D)向STI添加了完全碰撞支持。如果你想创建一个完全可碰撞的图层(比如家具层),那么你需要做的就是在Tiled中为你的图层添加一个名为“collidable”的自定义属性,并将其值设置为“true”。

Tiled现在有一个碰撞编辑器,可用于将碰撞数据添加到拼图中的各个拼贴。 STI也支持这种开箱即用,无需自定义属性。

欲了解更多有关STI的信息,请查看LOVE论坛主题here

+0

我没有使用STI,我使用的是Advanced Tiled Loader。 https://github.com/Kadoba/Advanced-Tiled-Loader – Forrest4096 2014-09-24 07:25:52

+2

ATL不再被维护并已被弃用。 STI以各种方式取代ATL。我强烈建议切换。 https://love2d.org/forums/viewtopic.php?f=5&t=2567&hilit=advanced&start=240#p159482 – Karai17 2014-09-24 15:50:01

+0

试过,没有工作 – 2017-01-04 10:25:03