Lua的for循环遇到问题(Love2d)

时间:2014-10-02 22:48:22

标签: for-loop lua love2d

虽然我已经阅读了很少关于Lua的教程,但我脑子里想到了如何使用Lua的循环,我遇到了麻烦。也许是因为我已经习惯了Python的for-loops?每当玩家在我的游戏中移动时,游戏就会检查地图上的墙是否挡路,并检查NPC是否在目的地的坐标中。

虽然我进行了墙壁检查以完美运行,但这个新的NPC for-loop使得玩家永远不会移动。 checkSpace函数查看NPC列表(当前只有一个NPC),以查看玩家是否可以移动到目的地。

player = {
    grid_x = 2,
    grid_y = 2,
    act_x = 32,
    act_y = 32,
    transit = false,
    direction = {0, 0}
}

npc = {
    grid_x = 4,
    grid_y = 3,
    act_x = 64,
    act_y = 48,
}

npcs = {npc}

function checkSpace(grid_y, grid_x, direction)
    if map[grid_y + (1 + direction[2])][grid_x + (1 + direction[1])] == 0 then
        -- if checkNPCs
        for _,v in pairs(npcs) do
            if grid_x == v.grid_x and grid_y == v.grid_y then
                return true
            end
        end
    end
end

function love.keypressed(key)
    if player.transit == false then
        if key == "up" then
            player.direction = {0, -1}
            if checkSpace(player.grid_y, player.grid_x, player.direction) == true then
                player.grid_y = player.grid_y - 1
                -- move player.direction before the if statement to make the player change direction whether or no there is space to move
                player.transit = true
            end
        end 
   end
 end

编辑:我对程序进行了一些调整,并取得了一些进展。如果checkSpace返回True,则不修改按键程序,而是修改程序,以便在不是障碍的情况下返回false。

    if key == "up" then
        player.direction = {0, -1}
        if checkSpace(player.grid_y, player.grid_x, player.direction) == false then
            player.grid_y = player.grid_y - 1
            -- move player.direction before the if statement to make the player change direction whether or no there is space to move
            player.transit = true
        end

我已经得到了一个非常基本的(实际上无用的)for循环使用我的程序,但如果我尝试用它做更高级的任何事情,那么我得到错误,我的玩家角色不会移动。< / p>

    for nameCount = 1, 1 do
        if grid_x + direction[1] == npc.grid_x and grid_y + direction[2] == npc.grid_y then
            return true
        else
            return false
        end
    end

我已在此位置发布完整代码:http://pastebin.com/QNpAU6yi

1 个答案:

答案 0 :(得分:0)

我会认为你的意思是你遇到了麻烦:

for _,v in pairs(npcs) do
    if grid_x == v.grid_x and grid_y == v.grid_y then
        return true
    end
end

其中npcs是

npcs = {npc} 

这是一个包含一个项目的表,即npc,它本身就是

npc = {
    grid_x = 4,
    grid_y = 3,
    act_x = 64,
    act_y = 48,
}

因此for循环只涉及一对(一次迭代),其密钥被丢弃并且其值为npc,因此grid_x == v.grid_x and grid_y == v.grid_y将npc的网格X和Y与赋予{的值进行比较{1}},如果匹配则返回true 。带循环的npcs = {npc}是奇数,但我认为这是因为你发布了最小的例子。到目前为止这么好,没有错。

但是,checkSpace将玩家的当前位置与循环播放的npc的位置进行比较,而您应该检查的是NPC是否在建议目的地:

checkSpace

很难从你的帖子中说这是否会解决你的问题,因为我不认为你提到的症状(checkSpace总是返回true)是正确的,但循环是正确的,谓词是错的,应该像我在上面展示。