【发布时间】:2017-06-24 19:20:56
【问题描述】:
我刚刚使用本指南在我的等距游戏中实现了拓扑排序算法:https://mazebert.com/2013/04/18/isometric-depth-sorting/
问题
这是一个小例子(这只是一个绘图来说明我的问题,因为正如我们所说,一张图片胜过一千个单词),我是什么期望在左边,拓扑排序算法的结果在右边
所以在右图中,问题是方框是在在角色之前绘制的,我希望它在之后被绘制> 喜欢左图。
拓扑排序算法代码(Typescript)
private TopologicalSort2() {
// https://mazebert.com/2013/04/18/isometric-depth-sorting/
for(var i = 0; i < this.Stage.children.length; i++) {
var a = this.Stage.children[i];
var behindIndex = 0;
for(var j = 0; j < this.Stage.children.length; j++) {
if(i == j) {
continue;
}
var b = this.Stage.children[j];
if(!a.isoSpritesBehind) {
a.isoSpritesBehind = [];
}
if(!b.isoSpritesBehind) {
b.isoSpritesBehind = [];
}
if(b.posX < a.posX + a.sizeX && b.posY < a.posY + a.sizeY && b.posZ < a.posZ + a.sizeZ) {
a.isoSpritesBehind[behindIndex++] = b;
}
}
a.isoVisitedFlag = 0;
}
var _sortDepth = 0;
for(var i = 0; i < this.Stage.children.length; ++i) {
visitNode(this.Stage.children[i]);
}
function visitNode(n: PIXI.DisplayObject) {
if(n.isoVisitedFlag == 0) {
n.isoVisitedFlag = 1;
if(!n.isoSpritesBehind) {
return;
}
for(var i = 0; i < n.isoSpritesBehind.length; i++) {
if(n.isoSpritesBehind[i] == null) {
break;
} else {
visitNode(n.isoSpritesBehind[i]);
n.isoSpritesBehind[i] = null;
}
}
n.isoDepth = _sortDepth++;
}
}
this.Stage.children.sort((a, b) => {
if(a.isoDepth - b.isoDepth != 0) {
return a.isoDepth - b.isoDepth;
}
return 0;
});
}
信息
玩家:
posX: [the x coordinate of the player]
posY: [the y coordinate of the player]
posZ: 0
sizeX: 1
sizeY: 1
sizeZ: 1
盒子:
posX: [the x coordinate of the box]
posY: [the y coordinate of the box]
posZ: 0
sizeX: 3
sizeY: 1
sizeZ: 1
X 和 Y 轴
您知道这个问题的根源吗?也许如何解决?
【问题讨论】:
-
您能否提供两个对象的实际 x 和 y 坐标,或者定义 Y 指向的方向? Y 轴是从左上角到右下角增加,还是相反?
-
@trincot 问题已更新。它符合您的需求吗?
-
是的,这就是我想要的。这是我从未研究过的事情,但这是一个有趣的问题。我将不得不让它沉入一点,......如果没有其他人这样做,我可能会在几个小时后回答;-)
-
可以在这个答案stackoverflow.com/a/44696002/3877726找到更快的深度变换和排序
-
@Blindman67,您对其他问题的回答不能在这里使用,因为您给对象的深度与周围其他对象的位置无关。但是想象两个物体与观察者的距离大致相同,但不重叠,并在它们之间放置第三条,这样绘制顺序就变得很重要。如果您在 X-Y 平面上将该条旋转 90°,则可能还必须更改顺序才能正确渲染。所以一个物体在绘制过程中得到的顺序必须考虑到周围物体的位置,不能只依赖于自己的props
标签: javascript html canvas isometric