当前位置: 首页 > 知识库问答 >
问题:

如何将等轴测对象从一个平铺过渡到另一个平铺,而不与其他平铺重叠

孙风畔
2023-03-14

我已经创建了一个等轴测环境,都是Javascript和HTML5(2D画布)的,基本上可以正常工作。我面临的问题是使用不同高度的平铺,然后对平铺上对象的索引进行排序(在本例中,在两个平铺之间并排移动)。

例如,一个对象可能位于其前面的平铺后面,因为它所在的平铺高度为-1。我想到的解决方案是在绘制瓷砖后直接绘制瓷砖的每个对象,从0,0开始,然后从那里绘制每一行和每一列。

在我需要在两个平铺之间转换对象之前,这很有效。此时,要么对象必须使用中间平铺(这是在下图中实现的),要么平铺将与对象重叠,因为平铺是在对象之后绘制的。使用中间平铺还会出现一个问题,即同一“行”上的Geofence对象会被覆盖,因为立方体使用的z索引比1,3处的平铺高得多(这在图1中略微可见)。

http://i.stack.imgur.com/PQJ0H.png

http://i.stack.imgur.com/DupM7.png

我认为绘制等轴测环境的尝试和测试方法是,只有一层用于瓷砖,一层用于对象,然后对象永远不能位于瓷砖后面,但这只是我不想遵守的限制。

所以我的问题是,当从上到下绘制整个环境时(或者任何其他可能的方式),依次绘制每个磁贴和它的对象时,是否有一个聪明的方法可以推迟绘制对象或创建一个对象数组以正确的顺序绘制?其他人是否遇到过类似的问题,是否有人找到了解决方案?

非常感谢大家的帮助。

我的平铺代码示例:

// each column
for(y=0; y<totalColumns; y++){
    // each row
    for(x=0; x<totalRows; x++){
        tile = tiles[y][x];
        // draw tile
        drawTile(tile);
        objects = objects[y][x];
        // draw objects for that tile
        drawObjects(objects);
    }
}

编辑:

我想到的一个解决方案(在把问题读回给自己之后)是遍历所有的瓷砖,获取瓷砖高度数组,对其进行排序,然后进行传统绘图。像这样:

var layers = [];

for(var y=0; y<cols; y++){
    for(var x=0; x<rows; x++){
        tile = tiles[y][x];
        if(!layers.indexOf(tile.height)) layers.push(tile.height);
    }
}

// sort layers
layers.sort(/*function here to sort layers*/);

for(l=0; l<layers.length; l++){
    // draw tiles for this layer

    // draw objects for this layer

}

还有其他可能的解决方案吗?

共有1个答案

陆雅志
2023-03-14

您在解决方案中所做的事情完全正确。你想对所有没有alpha的东西都这样做。

至于其他解决方案,我建议使用插入排序,而不是一次又一次地重建列表。在您的情况下,几乎没有什么变化,所以只需更新需要的内容即可。

 类似资料:
  • 我正在编程一个小游戏,它是基于瓷砖的。但当我渲染它的时候,有时那些瓷砖之间的一个小空间是可见的,(绿色)背景是暴露的(可以在视频中看到)。 我想知道,是否有一些双缓冲技术,可以解决这个bug,但我读到,双缓冲已经实现了。

  • 将数组平铺到指定的深度。 使用递归,为每个深度级别 depth 递减 1 。 使用 Array.reduce() 和 Array.concat() 来合并元素或数组。 基本情况下,depth 等于 1 停止递归。 省略第二个参数,depth 只能平铺到 1 (单层平铺) 的深度。 const flatten = (arr, depth = 1) => depth != 1 ? arr.

  • 我知道有一个类似的问题,但答案不够具体,无法在我的案例中发挥作用。 我试图创建一个程序,可以显示在平铺中创建的平铺地图,并使用pytmx上传到Pygame中。我唯一的问题是在Pygame中将图像快速显示在屏幕上。 这就是我一直收到的错误:回溯(最近一次调用):文件“C:\Users\b\Desktop\Frozed Map Textures\test.py”,第32行,在screen.blit(i

  • 我想让我的libgdx地图滚动,但我不知道代码使地图滚动,请大家帮助我,我想让地图滚动像flappy bird游戏,这是我的代码,显示在屏幕上的地图 }

  • 深度平铺一个数组。 使用递归。 通过空数组([]) 使用 Array.concat() ,结合 展开运算符( ... ) 来平铺数组。 递归平铺每个数组元素。 const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v))); deepFlatten([1, [2], [[

  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=