2015-06-09 3 views
1

Таким образом, я реализую изометрический сортировщик для своих спрайтов, и у меня возникают некоторые проблемы с сопоставлением, когда должны быть отображены плитки. Я сортирую все изометрические спрайты, которые будут реализованы, реализуя их как сопоставимые.Ошибка сравнения для изометрической сортировки

Проблема заключается в том, когда я реализует следующий метод 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; 
} 

я получаю ошибку «Метод сравнения нарушает его общий контракт!» от вызова array.sort в массиве LibGDX (который я использую для сортировки). Я не могу сказать, как я должен это решать, глядя на проблему других людей с этой ошибкой, но эти проблемы в основном тривиальны. Кто-нибудь знает, как я должен решить это в моем изометрическом сравнении?

Мой изометрический мир (для справки): enter image description here

Edit: нашел что-то интересное, когда только сортировка по 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

Но проблема в том, что мне нужно также получить границы с этими индивидуальными операторами if, я попытаюсь отредактировать его, чтобы он стал более ясным. – Deminth

+0

Хм, я, должно быть, неправильно понимаю вашу проблему. – azurefrog

+0

Как должна выглядеть изометрическая сортировка, если 'maxX> o.maxX', но' minX MaxZoom

ответ

0

Это сообщение указывает на то, что есть что-то неправильно с переходной логики компаратор, если 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 для расчета isoDepth, которые могут быть использованы для сортировки/сравнения IsoSprites.

+0

Да, хорошо, добавляя Math.signum infront и литье в int. Проблема заключается в сравнении разных переменных (см. Мое последнее редактирование) – Deminth

+0

Плохая идея. Что делать, если 'z == -2' и' o.z == Integer.MAX_VALUE'? Затем вы получаете переполнение целых чисел, а не правильный результат. Используйте 'Integer.compare (z, o.z)', если вы просто хотите сравнить два целочисленных значения. –

0

Я понял, что не смогу выполнить сравнения, необходимые в сопоставимых. Поэтому вместо этого я использую собственную реализацию Quicksort для сортировки с помощью моего собственного метода compareTo, который в основном проверяет, стоит ли спрайт за другим или наоборот.

Спасибо за помощь!

Смежные вопросы