2010-01-17 4 views
4

Я пишу класс 2D-анимации, и у меня есть TGA картинки, в которых хранится анимация игрока. Эти изображения имеют 8x8 плиток (поэтому на каждой строке есть 8 кадров движущегося символа)Каков наилучший способ сделать 2D-анимацию?

Однако у меня нет подсказки о том, как оживить это в коде.

Я думал об обновлении, перемещая координаты u-v каждого кадра и возвращая только текущий кадр. Как я могу это сделать?

ответ

3

Sup dawg.

Увидев, что вы используете UV-координаты текстуры, которая содержит все ваши состояния анимации, вам нужно будет преобразовать из координат пикселей в UV-координаты.

Если ваш спрайт шириной 32 пикселя, а ваша текстура имеет ширину 256 пикселей (таким образом, она содержит 8 кадров), вы захотите разделить ширину спрайта по ширине текстуры, указав число между ними. 0 и 1! Это ваше смещение. Чтобы получить раму из вашей полосы, просто выполните:

float step_size_x = (float)(width)/(float)(texture_width); 
float step_size_y = (float)(height)/(float)(texture_height); 

float begin_u = step_size_x * step_current_x; 
float begin_v = step_size_y * step_current_y; 
float end_u = begin_x + step_size_x; // basically, if you want sprite 0, you go from 0 to the x of sprite 1 
float end_v = begin_y + step_size_y; 

И все! Теперь, если вы хотите скопировать часть текстуры, которая будет следующим в OpenGL:

glBindTexture(GL_TEXTURE_2D, texture_id); 
glBegin(GL_TRIANGLE_STRIP); 
    glTexCoord2f(begin_u, begin_v); glVertex3f(x - (width/2), y - (height/2), 0); 
    glTexCoord2f(end_u, begin_v);  glVertex3f(x + (width/2), y - (height/2), 0); 
    glTexCoord2f(begin_u, end_u);  glVertex3f(x - (width/2), y + (height/2), 0); 
    glTexCoord2f(end_u, end_u);  glVertex3f(x + (width/2), y + (height/2), 0); 
glEnd(); 

Теперь, когда я дал вам полный пример кода, вы пожалуйста, прекратите беспокоить меня о вашей игре? : P

2

В эти дни, если вы находитесь на Windows Direct2D, это путь.

+0

Я не всегда использую окна. В конце концов, это должна быть кросс-платформенная игра. – MrFronk

+1

:) отсюда моя квалификация. – Rick

0

То, что вы описываете, ближе к видео, чем 2D-анимация, и вам может быть лучше смотреть на некоторые видеокодеки.

Но в качестве альтернативы OpenGL было бы хорошим местом для начала.

2

Вы не дали достаточно информации об окружающей среде, запланированном дизайн игры, и текущей структуре двигателя, чтобы предложить что-либо конкретное, так вот общий совет:

Там не одно оптимальное решение. Получите что-то рисунок, а затем используйте его, пока он не начнет ломаться, а затем повторите попытку; это очень связанная с игрой проблема, и игровой дизайн основан на итерации, поэтому доведение итерации до уровня двигателя (а не раздражение и попытка придумать «идеальное решение» из ворот) заканчивается тем, что лучший способ изучить этот аспект геймплея. Некоторые примеры того, насколько ваше решение может быть различным:

Если у вас есть анимация, основанная на простом цикле кадров, в то время как «субъект игрока» находится в определенном состоянии (например, ходить, прыгать, простаивать), тогда вы сохраняете рамку счетчик, увеличивайте его с помощью timestep игры и рисуйте кадры по счетчику.

Если у вас есть анимация, для которой требуется много контекстуальной информации для правильной отображения, например, поворот на разные облицовки, захват на уступы и т. Д., То вы добавляете дополнительные проверки состояния вместе с счетчиком кадров, и если есть достаточно форм состояния, которые вы, возможно, захотите формализовать, как конечный конечный автомат, запускают каждый кадр. У вас также может быть какой-то процедурный эффект, связанный с состоянием сущности: вращение, мигание, масштабирование, шейдеры ...

Если анимация запускает события геймплея (например, бросает удар), вам придется решить, следует ли размещать эту информацию непосредственно в коде анимации или ввести механизм, управляемый данными для «пожара этого события сейчас, создать этот объект, включить этот столкновение ...»

Тогда есть такие детали, как точки происхождения, размер изображения (размер может изменение времени для некоторых анимаций), переменные скорости воспроизведения ....

Как я уже сказал, не пытайтесь найти идеальное решение. Это зависит от того, что нужно игре.

+0

Ну, игра - простой платформер 2d, в котором у вас есть состояния с разными анимациями (бег, прыжок, простоя и т. Д.). В настоящее время я использую openGL для этого, однако моя команда знает намного больше о openGL, чем мне. Поскольку я просто отвечал за анимацию, я подумал о подходящем алгоритме, но я думаю, что я просто попробую и перейду через него с помощью framecounter (как вы сказали). – MrFronk

3

Ваш вопрос достаточно широк, так что здесь широкий резонанс;)

С Qt4.6 (один месяц) есть основа анимации. Кажется очень интересным (не успел по-настоящему закодировать его).

Как и в случае с Qt, это означает хороший API, многогранный формат, хорошую документацию и, возможно, достойные характеристики.

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtanimationframework

Конечно, может быть, вы не хотите зависеть от Qt.

+1

Wauw, ну, на самом деле я использую QT, поэтому я посмотрю на него. Я думаю, что использовали более старую версию, хотя – MrFronk

1

С точки зрения фактического рисования на экране, если это то, о чем вы просите в вопросах, SDL относительно прост в использовании и достаточно мощный для загрузки.
Также, Lazy Foo's учебники очень хорошие, с точки зрения документации.

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