所以我正在为我的精灵实现一个等距分类器,我在比较何时应该渲染瓷砖时遇到了一些问题。我正在通过将它们实现为可比较的方式对所有等距精灵进行排序。
问题是,当我实现以下compareTo方法时:
// 1 = render this after
// 0 == render same
// -1 = render this before
@Override
public int compareTo(IsoSprite o) {
if(z >= o.z && maxY <= o.minY && maxX <= o.minX){
return 1;
}
if(z >= o.z && maxY >= o.minY && maxX >= o.minX){
return -1;
}
if(z > o.z){
return 1;
}
if(z < o.z){
return -1;
}
//z == o.z && maxY == o.maxY && minY == o.minY && minX == o.minX && maxX == o.maxX
return 0;
}
我收到错误“比较方法违反了其总合同!”来自LibGDX数组中的array.sort调用(我用它进行排序)。我不知道在看这个错误的其他人的问题时我应该如何解决这个问题,但这些问题大多是微不足道的。任何人都知道我应该如何在等长比较中解决这个问题?
我的等距世界(供参考):
编辑: 只按Z排序时发现了一些有趣的东西:
//Doesn't work
public int compareTo(IsoSprite o) {
if(maxZ > o.z){
return 1;
}
if (maxZ < o.z){
return -1;
}
return 0;
}
//Works
@Override
public int compareTo(IsoSprite o) {
if(z > o.z){
return 1;
}
if(z < o.z){
return -1;
}
return 0;
}
答案 0 :(得分:0)
此消息表明出现了问题
在比较器中使用传递逻辑,对于if A > B
,则B < A
也必须为真。编译器足够智能,可以向用户指出
代码中的问题是将不同的值相互比较。要更正它,您必须比较相同的值minY < o.minY
,而不是使用<=
和>=
运算符。
这应该有效:
public int compareTo(IsoSprite o) {
if (isoDepth > o.isoDepth) return 1;
if (isoDepth < o.isoDepth) return -1;
return 0;
}
请参阅algorithm以计算可用于对IsoSprites进行排序/比较的isoDepth。
答案 1 :(得分:0)
我意识到我无法进行比较所需的比较。因此,我使用自己的Quicksort实现来使用我自己的compareTo方法进行排序,该方法基本上检查精灵是否落后于另一个精灵。
感谢所有的帮助!