Lua 使用LOVE2D制作一个平台,垂直水平面没有经过某个点的碰撞

Lua 使用LOVE2D制作一个平台,垂直水平面没有经过某个点的碰撞,lua,2d,love2d,Lua,2d,Love2d,对于在线课程,我正在使用LÖVE2D和lua创建一个平台。级别由平铺生成-平铺垂直填充用于正常级别,水平填充用于垂直级别-这些平铺的ID对应于它们是否为实心。但是,在垂直标高中,在某个点之后,应该可碰撞的瓷砖将变为不可碰撞的瓷砖。(如图所示) 我有一种感觉,它与瓷砖贴图以及它的创建方式有关。我尝试过改变水平的宽度,这就是我如何发现我为垂直水平设置的宽度决定了碰撞被切断的位置。例如,如果标高为16瓷砖宽,则碰撞结束时向下16瓷砖,如果标高为10瓷砖宽,则碰撞结束时向下10瓷砖 我还没弄清楚是什么原

对于在线课程,我正在使用LÖVE2D和lua创建一个平台。级别由平铺生成-平铺垂直填充用于正常级别,水平填充用于垂直级别-这些平铺的ID对应于它们是否为实心。但是,在垂直标高中,在某个点之后,应该可碰撞的瓷砖将变为不可碰撞的瓷砖。(如图所示)

我有一种感觉,它与瓷砖贴图以及它的创建方式有关。我尝试过改变水平的宽度,这就是我如何发现我为垂直水平设置的宽度决定了碰撞被切断的位置。例如,如果标高为16瓷砖宽,则碰撞结束时向下16瓷砖,如果标高为10瓷砖宽,则碰撞结束时向下10瓷砖

我还没弄清楚是什么原因造成的。有人能帮我解决这个问题吗?以下是我的平铺地图代码:

TileMap = Class{}

function TileMap:init(width, height, orientation)
    self.width = width
    self.height = height
    self.tiles = {}
    self.orientation = orientation
end

--[[
    If our tiles were animated, this is potentially where we could iterate over all of them
    and update either per-tile or per-map animations for appropriately flagged tiles!
]]
function TileMap:update(dt)

end

--[[
    Returns the x, y of a tile given an x, y of coordinates in the world space.
]]
function TileMap:pointToTile(x, y)
    if self.orientation == 'horizontal' then
        if x < 0 or x > self.width * TILE_SIZE or y < 0 or y > self.height * TILE_SIZE then
            return nil
        end
    
        return self.tiles[math.floor(y / TILE_SIZE) + 1][math.floor(x / TILE_SIZE) + 1]
    elseif self.orientation == 'vertical' then
        if x < 0 or x > self.width * TILE_SIZE or y < 0 or y > self.height * TILE_SIZE then
            return nil
        end
        return self.tiles[math.floor(x / TILE_SIZE) + 1][math.floor(y / TILE_SIZE) + 1]
    end
end

function TileMap:render()
    for y = 1, self.height do
        for x = 1, self.width do
            self.tiles[y][x]:render()
        end
    end
end
(很抱歉,如果没有用最好的措辞,这是我在这里发布的第一个问题)
(另外,在你问之前,高度和宽度是故意放在平铺贴图中的,它不会以另一种方式工作)

我已经解决了!问题不在于瓷砖的状态,而在于它们的排列方式。在垂直水平生成器中更改了tiles表的结构,以便对tiles进行水平排序后,我只需要调整tile映射中的pointToTile函数以匹配它。

我已经解决了它!问题不在于瓷砖的状态,而在于它们的排列方式。在垂直标高生成器中更改了瓷砖表的结构,使瓷砖水平排序后,我只需要调整瓷砖贴图中的pointToTile函数以匹配它。

问题不是很清楚,但我对可能导致它的原因有一些估计,我认为与块的状态没有直接关系,问题似乎与碰撞系统和/或坐标有关,因此您可以尝试调试碰撞系统,看看问题的核心是否在那里嗯,好的,我可以尝试查看那里。通过查看print语句,我能记得的一件事是,在停止调用冲突的高度停止调用对可碰撞分片的检查。编辑:在运行该测试后,我发现,当瓷砖被渲染时,它们在瓷砖贴图中的值为零。问题不是很清楚,但我对可能导致它的原因有一些估计,我认为这与块的状态没有直接关系,问题似乎与碰撞系统和/或坐标有关,所以你可以试着调试碰撞系统,看看问题的核心是不是在那里嗯,好吧,我可以试着看看那里。通过查看print语句,我能记得的一件事是,在停止调用冲突的高度停止调用对可碰撞分片的检查。编辑:运行该测试后,我发现,在渲染平铺时,它们在平铺贴图中的值为零。
VertLevelMaker = Class{}

function VertLevelMaker.generate(height, width)
    local tiles = {}
    local entities = {}
    local objects = {}

    local tileID = TILE_ID_GROUND
    
    -- whether we should draw our tiles with toppers
    local topper = true
    local tileset = math.random(20)
    local topperset = math.random(20)
    
    for y = 1, width do
        table.insert(tiles, {})
    end
    
    local leftPlat = height % 8
    local rightPlat = height % 8 + 4
    -- place all the ground as you go down
    for y = 1, 10 do
        tileID = TILE_ID_EMPTY
        for x = 1, width do
            table.insert(tiles[x], 
                Tile(x, y, tileID, nil, tileset, topperset))
        end
    end
    
    tileID = TILE_ID_GROUND
    for y = 11, height - 1 do
        table.insert(tiles[1],
            Tile(1, y, tileID, y == 11 and topper or nil, tileset, topperset))
        if leftPlat >= 8 then
            leftPlat = leftPlat % 8
            for x = 2, 6 do
                table.insert(tiles[x],
                    Tile(x, y, tileID, y == y and topper or nil, tileset, topperset))
            end
            tileID = TILE_ID_EMPTY
            for x = 7, width - 1 do
                table.insert(tiles[x],
                    Tile(x, y, tileID, nil, tileset, topperset))
            end
        elseif rightPlat >= 8 then
            rightPlat = rightPlat % 8
            tileID = TILE_ID_EMPTY
            for x = 2, width - 6 do
                table.insert(tiles[x],
                    Tile(x, y, tileID, nil, tileset, topperset))
            end
            tileID = TILE_ID_GROUND
            for x = width - 5, width - 1 do
                table.insert(tiles[x],
                    Tile(x, y, tileID, y == y and topper or nil, tileset, topperset))
            end
        else
            tileID = TILE_ID_EMPTY
            for x = 2, width - 1 do
                table.insert(tiles[x],
                    Tile(x, y, tileID, nil, tileset, topperset))
            end
        end
        tileID = TILE_ID_GROUND
        table.insert(tiles[width],
            Tile(width, y, tileID, y == 11 and topper or nil, tileset, topperset))
        leftPlat = leftPlat + 1
        rightPlat = rightPlat + 1
    end
    for x = 1, width do
        table.insert(tiles[x], 
            Tile(x, height, tileID, topper, tileset, topperset))
    end
    
    local map = TileMap(height, width, 'vertical')
    map.tiles = tiles
    
    return Level(entities, objects, map, width, height)
end