微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用LOVE2D制作平台游戏-垂直关卡在超过特定点时不会发生碰撞

如何解决使用LOVE2D制作平台游戏-垂直关卡在超过特定点时不会发生碰撞

对于在线课程,我将使用LÖVE2D和lua创建一个平台游戏。级别是由图块生成的-对于正常级别,垂直填充图块,对于垂直级别,则水平填充-那些图块的ID对应于它们是否为实心。但是,在垂直水平上,在特定点之后,应可碰撞的图块将变为不可碰撞。 (可以看到here

我觉得它与平铺图及其创建方式有关。我尝试过的操作是更改水准仪的宽度,这就是我发现为垂直水准仪设置的宽度决定了碰撞的截止位置的方式。例如,如果级别为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

这是我的垂直水平仪制造商:

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 == 11 and topper or nil,topperset))
        if leftPlat >= 8 then
            leftPlat = leftPlat % 8
            for x = 2,6 do
                table.insert(tiles[x],y == y and topper or nil,topperset))
            end
            tileID = TILE_ID_EMPTY
            for x = 7,width - 1 do
                table.insert(tiles[x],topperset))
            end
        elseif rightPlat >= 8 then
            rightPlat = rightPlat % 8
            tileID = TILE_ID_EMPTY
            for x = 2,width - 6 do
                table.insert(tiles[x],topperset))
            end
            tileID = TILE_ID_GROUND
            for x = width - 5,topperset))
            end
        else
            tileID = TILE_ID_EMPTY
            for x = 2,topperset))
            end
        end
        tileID = TILE_ID_GROUND
        table.insert(tiles[width],Tile(width,topperset))
        leftPlat = leftPlat + 1
        rightPlat = rightPlat + 1
    end
    for x = 1,width do
        table.insert(tiles[x],topper,topperset))
    end
    
    local map = TileMap(height,width,'vertical')
    map.tiles = tiles
    
    return Level(entities,objects,map,height)
end

(很抱歉,如果措辞不佳,这是我在此处发布的第一个问题) (另外,在您询问之前,高度和宽度是有意向后放入图块地图中的,反之则无效)

解决方法

我已经解决了!问题不在于瓷砖的状态,而在于瓷砖的排列方式。在垂直级别制作器中更改了图块表的结构,以便对图块进行水平排序之后,我只需要调整图块地图中的pointToTile函数以使其匹配即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。