Какой лучший способ сделать 2D-анимацию? - PullRequest
4 голосов
/ 17 января 2010

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

Тем не менее, я понятия не имею, как анимировать это в коде.

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

Ответы [ 6 ]

3 голосов
/ 17 января 2010

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

3 голосов
/ 17 января 2010

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

Начиная с Qt4.6 (ему исполнился месяц), существует фреймворк анимации. Это кажется очень интересным (пока нет времени по-настоящему кодировать его).

Поскольку это Qt, это означает хороший API, мультиплатформенность, хорошую документацию и, вероятно, достойную производительность.

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

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

2 голосов
/ 17 января 2010

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

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

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

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

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

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

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

2 голосов
/ 17 января 2010

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

1 голос
/ 17 января 2010

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

0 голосов
/ 17 января 2010

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

Но в качестве альтернативы было бы неплохо начать с OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...