2012-01-12 2 views
3

Я пытаюсь понять, как получить координаты X и Y в кадрах анимированного листа спрайтов, указав ему ширину, высоту, строчки, столбцы и frameCount. Затем я хочу, чтобы он вернул мне номер строки и столбца, в котором кадр задан как frameNumber. (считая сверху вниз справа налево)Java Game Dev: Лист спрайтов по строкам и столбцам?

Я понял, что могу получить номер столбца (если я рассмотрю строки и столбцы, которые будут представлены int[][]), просто делая frameNumber % rows, но я в тупике о том, как получите номер строки. Есть идеи?

ответ

4

Если у вас есть перевалы столбцы, вы можете просто использовать:

Использование:

row = Math.floor(frameNumber/cols); 
col = frameNumber % cols; 

так что если у вас есть 1000 COLS и хотите номер кадра 3989 это даст вам:

строку = 3; col = 989;

+0

Я думал об этом, но я не был уверен, выполняет ли операция Math.floor округление до ближайшего полного целого числа, даже если число ближе к следующему наибольшему числу? Как и 1.99999, оказывается 1? –

+0

Да, это всегда полы. вот почему вам это нужно в этом случае. (фактически только в/не в модуле) – Niko

1

Если вы знаете ширину и высоту кадров, сколько кадров в строке существуют, и какой кадр вы хотите, чем получать координаты х и у достаточно прост:

frameX = ((frameNumber - 1) % columns) * frameWidth; 

    frameY = ((frameNumber - 1)/columns) * frameHeight; 

Обратите внимание, что «/» операция должна быть INT, короткие или байт деление, как вам нужно остаток быть закруглены, чтобы получить X и Y координаты в начиная кадра, а не где-то в середине.

Эти формулы предназначены для листа спрайтов, где рамы идут слева направо, а затем сверху вниз. Если вы хотите, наоборот, чем просто переключите «%» и «/» операторов и изменения «столбцы» до «строк»:

frameX = ((frameNumber - 1)/rows) * frameWidth; 

    frameY = ((frameNumber - 1) % rows) * frameHeight; 

Это также предполагая, что вы будете ссылки ваших кадров начиная с 1, однако, если вы вместо того, чтобы индексировать их, начиная с 0, чем - часть «1» может быть удален:

frameX = (frameNumber % columns) * frameWidth; 

    frameY = (frameNumber/columns) * frameHeight; 
    //assuming that frameNumber indexes from 0; 

Кроме того, если вы просто хотите знать, какой столбец или строка кадра находится, чем просто удалите части «* frameWidth» и «* frameHeight», которые возвратят индексы строк и столбцов, начиная с 0:

frameX = (frameNumber - 1) % columns; 

    frameY = (frameNumber - 1)/columns; 

Надеюсь, это поможет.
Zistack

+0

Я не думаю, что часть для нахождения frameY правильная, я просто заканчиваю десятичной точкой. –

+0

Как я уже сказал, это должно быть int, byte или long division, так что десятичное значение усечено. Если у вас все еще есть проблема, вы можете вернуть все выражение в один из вышеперечисленных типов. – Zistack

+0

Извините, но я думаю, что этот ответ запутан, поэтому я должен его понизить. –

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