在Love2D / Lua中遇到基于网格的移动问题

时间:2014-08-18 00:25:16

标签: lua game-physics love2d

使用Love2D Lua框架,我正在尝试编写一个非常基本的游戏,就像任天堂时代的角色扮演游戏一样,英雄'和NPC'运动仅限于平铺网格。到目前为止,我已经找到了我的过去的任何问题,直到我遇到这个棘手的错误,其中玩家的动作没有正常运作。

function love.load()
    love.graphics.setDefaultFilter('nearest', 'nearest', 1)
    love.keyboard.setKeyRepeat(true)
    font = love.graphics.newFont(14) -- the number denotes the font size

    win_size = 6
    love.window.setMode(160 * win_size, 144 * win_size)

    true_sfc = love.graphics.newCanvas(160,144)
    view_sfc = love.graphics.newCanvas(160 * win_size, 144 * win_size)

    player = {
        grid_x = 3,
        grid_y = 3,
        act_x = 48,
        act_y = 48,
        transit = false,
        direction = {0, 0}
    }
end

function love.update(dt)
    if player.transit == true then

        -- The idea is that if the player selects a direction, the player will walk in that direction until it stops on the grid. 
        -- When I press left or right, the movements works as intended- the player square walks until it stops on the grid.
        -- However, when I press up or down, the player only moves a single pixel, despite having the same instructions


        player.act_x = player.act_x + player.direction[1]
        player.act_y = player.act_y + player.direction[2]

        if player.act_x == player.grid_x * 16  then
            player.direction[1] = 0
            player.transit = false
        end

        if player.act_y == player.grid_y * 16  then
            player.direction[2] = 0
            player.transit = false
        end

        -- Now in this if-statement, if I have the program compare the player's y-coordinates before comparing the x coordinates,
        -- the program will move the player on the y-axis correctly, with it locking to the 16 pixel grid, while the x coordinates
        -- will starts to have the single-pixel movement issue.

    end
end

function love.draw()
    love.graphics.setCanvas(true_sfc)
        love.graphics.setColor( 0, 0, 0)
        love.graphics.rectangle("fill", 0, 0, 256, 224)
        love.graphics.setColor(255,255,255)
        love.graphics.rectangle("fill", player.act_x, player.act_y, 16, 16)
        love.graphics.print(player.direction[1], 100, 100)
        love.graphics.print(player.direction[2], 100, 120)
    love.graphics.setCanvas()

    love.graphics.draw(true_sfc, 0, 0, 0, win_size, win_size)
end

function love.keypressed(key)
    if player.transit == false then
        if key == "up" then
            player.grid_y = player.grid_y - 1
            player.direction = {0, -1}
            player.transit = true
        elseif key == "down" then
            player.grid_y = player.grid_y + 1
            -- press down, the player's map position goes down one tile
            player.direction = {0, 1}
            player.transit = true
        elseif key == "left" then
            player.grid_x = player.grid_x - 1
            player.direction = {-1, 0}
            player.transit = true
        elseif key == "right" then
            player.grid_x = player.grid_x + 1
            player.direction = {1, 0}
            player.transit = true
        end
    end
end

不可否认,我对Lua很陌生,所以我不太了解它如何使用变量。我意识到我的代码并不是非常有效,但无论如何,这是我计划改进的东西。

1 个答案:

答案 0 :(得分:1)

这里的问题是你检查垂直移动是否排成一行,看到它是否正确,然后你将self.transit设置为false,以防止将来的任何检查。

在检查你是否排队之前,你还想检查你是否正朝着那个方向前进:

    if player.direction[1] ~= 0 and player.act_x == player.grid_x * 16  then
        player.direction[1] = 0
        player.transit = false
    end

    if player.direction[2] ~= 0 and player.act_y == player.grid_y * 16  then
        player.direction[2] = 0
        player.transit = false
    end