Изометрия не получается

103
02 апреля 2021, 14:00

Понимаю, что таких тем уже множество, но не одна из них не дала четкое понятие и примера, я пытался сделать его сам из кусков в описаниях этих множества тем:

final int[][] world = {
   {0, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0}
};
float width = 128, 
height = 64,
Xo = 0, Yo = 0, Xc = 0, 
C = (float) Math.floor(canvas.getWidth() / 2);
for (int i = 0; i < world.length; i++) {
    Yo = (height / 2) * i;
    Xc = C - (width / 2 * i);
    for (int j = 0; j < world[0].length; j++) {
        Xo = Xc + (j * (width / 2));
        Yo += height / 2;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.floor);
        canvas.drawBitmap(bitmap, Xo-width/2, Yo-height/2, null);
    }
}

Получается фигня, какая-то:

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

Answer 1

Мне категорически не нравится вариант использовать текстурки в форме ромбовидных клеток. На разных экранах вы будете получать немного разную картинку при правильном размещении, или наложение одной текстурки на другу в пиксель при неправильном

Я просчитал координаты для первой ячейки в canvas.drawBitmap(bitmap, Xo-width/2, Yo-height/2, null) для нее уходят координаты (0:C/2). Соответственно рисуется первая ячейка с C/2 по С/2+width/2, что явно не соответствует тому, что вы хотите получить.

Плюс точно проблема с вычислениями. Никогда не используйте конструкции Yo += height / 2; когда речь про координаты. И прям бейте себя по рукам, если еще и Yo и height - целые числа. В таком случае постоянно работает округление, и у вас копится ошибка. Canvas отлично справляется с дробными координатами в большинстве случаев.

Исправьте алгоритм, вычисляете Y не приращением, а вычисление, и вполне вероятно решится проблема с растянутыми клетками

READ ALSO
Передача параметра через ссылку в подключаемый JS

Передача параметра через ссылку в подключаемый JS

Есть скрипт, который подключается к двум страницам, но выполнение должно отличаться в зависимости от страницыВозможно ли при подключение,...

138
Как доработать регулярное выражение?

Как доработать регулярное выражение?

нуждаюсь в небольшой помощи с регуляркамиУ меня есть регулярное выражение, которое осталось доделать, а сам не справлюсь

131
megatimer настройка таймера в коде

megatimer настройка таймера в коде

Есть сайт https://megatimerru/ на котором я настраиваю дату окончания таймера и сам таймер, и есть файл megatimer

113