Love2d / LUA 网格锁定移动 不包括斜向移动

我以为这将是一个常见的问题,但经过几天的研究,我找不到解决方法。对编程整体和LUA尤其陌生。我正在开发CS50个人项目的SUPAPLEX克隆版: 角色沿网格地图移动,有一个代码让人们似乎都建议(附上)。在释放箭头按钮之后,移动将继续到一个平铺物的结尾,平稳地进行。但是,如果推动了2个移动按钮,它会导致短暂的对角线移动,这就是我不成功地试图解决的问题。

基本上,我要么是在尝试忽略任何输入直到精灵的移动在网格平铺结尾处完成,要么是阻止在一个方向上的移动完成前更新。看起来很简单,但我已经要放弃这个整个东西了。令人沮丧。任何输入都非常赞赏,我相信这将为很多人提供很大的帮助......

function love.load()

    love.keyboard.setKeyRepeat(true)

    player = {
        grid_x = 256,
        grid_y = 256,
        act_x = 256,
        act_y = 256,
        speed = 5,
    }

    map = {
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
        { 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
        { 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
        { 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1 },
        { 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
        { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
    }


    function testMap(x, y)
        if map[(player.grid_y / 32) + y][(player.grid_x / 32) + x] == 1 then
            return false
        end
        return true
    end

    function love.keypressed(key)
        if key == "up" then
            player.grid_y = player.grid_y - 32
        elseif key == "down" then
            player.grid_y = player.grid_y + 32
        elseif key == "left" then
            player.grid_x = player.grid_x - 32
        elseif key == "right" then
            player.grid_x = player.grid_x + 32
        end
    end

end

function love.update(dt)
    player.act_y = player.act_y - ((player.act_y - player.grid_y) * player.speed * dt)
    player.act_x = player.act_x - ((player.act_x - player.grid_x) * player.speed * dt)
end

function love.draw()
    love.graphics.rectangle("fill", player.act_x, player.act_y, 32, 32)
    for y=1, #map do
        for x=1, #map[y] do
            if map[y][x] == 1 then
                love.graphics.rectangle("line", x * 32, y * 32, 32, 32)
            end
        end
    end
end
点赞
用户3342050
用户3342050

你想让它只沿着网格线行走?

去掉 love.keyboard.setKeyRepeat(true)

不要使用 love.keypressed(key)

那个只针对逐个按键,而且与 love.keyreleased() 一起使用会很难操作其他按键的释放。

使用 isDown 代替,如果其中一个 isDown,则其他方向键都不允许输入。(还有你已经在更新中用了几行 player.act

player = {
    grid_x = 256,
    grid_y = 256,
    act_x = 256,
    act_y = 256,
    speed = 5,
    dir = ''
}

function love.update(dt)
    if love.keyboard.isDown("up", "down", "left", "right") then
        if love.keyboard.isDown("up") and ( player.dir == 'up' or player.dir == '' ) then
            player.dir = 'up'  --  只有当前按下,或没有按下其他方向键时才向上移动
            player.grid_y = player.grid_y - 32
        elseif love.keyboard.isDown("down") and ( player.dir == 'down' or player.dir == '' ) then
            player.dir = 'down'  --  只有当前按下...
            player.grid_y = player.grid_y + 32
        elseif key == "left" and ( player.dir == 'left' or player.dir == '' ) then
            player.dir = 'left'
            player.grid_x = player.grid_x - 32
        elseif key == "right" and ( player.dir == 'right' or player.dir == '' ) then
            player.dir = 'right'
            player.grid_x = player.grid_x + 32
        end
    else  --  没有按下这些键,所以玩家处于空闲状态
        player.dir = ''
    end  --  isDown()

    player.act_y = player.act_y - ((player.act_y - player.grid_y) * player.speed * dt)
    player.act_x = player.act_x - ((player.act_x - player.grid_x) * player.speed * dt)
end  --  update()
2020-10-24 05:55:55