Лучший способ повернуть изображение с помощью SDL?

Я создаю игру, и рука главного героя будет следовать за курсором мыши, поэтому она будет вращаться довольно часто. Как лучше всего его повернуть?


person Justen    schedule 26.07.2009    source источник


Ответы (3)


С SDL у вас есть несколько вариантов.


  1. Заранее поверните все свои спрайты (предварительно отрендерив все возможные вращения) и визуализируйте их, как любой другой спрайт. Этот подход быстрый, но требует больше памяти и больше спрайтов. Как отметил @Nick Wiggle, RotSprite - отличный инструмент для создания преобразований спрайтов.

  2. Используйте что-то вроде SDL_gfx для вращения / масштабирования в реальном времени. (Не рекомендуется, очень медленно)

  3. Используйте SDL в режиме OpenGL и визуализируйте свои спрайты в примитивы, применяя вращение к примитивам.


Вариант 3, вероятно, ваш лучший выбор, потому что вы получаете все преимущества использования OpenGL. Вам действительно решать, как это сделать. Также возможно, что вы можете загрузить свои спрайты, выполнить все вычисления вращения с помощью SDL_gfx, а затем сохранить повернутые версии на SDL_Surface в памяти.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий я бы порекомендовал ознакомиться с руководствами Lazyfoo по SDL. В частности, о вращении. Также имеется функция OpenGl, glRotatef , что может быть полезно в вашем случае. Быстрый поиск вернул этот лакомый кусочек что тоже может быть полезно.

person Zack The Human    schedule 26.07.2009
comment
Думаю, мне бы хотелось изучить маршрут OpenGL, однако я никогда с ним не работал. Есть ли у вас какие-либо рекомендации на веб-сайте, чтобы начать обучение по ротации? - person Justen; 26.07.2009
comment
Я просмотрел код из NeHe, и это кажется невероятно утомительным, чтобы настроить вращение изображения ... Я вообще не могу этого понять, есть ли помощь по этой теме? - person Justen; 26.07.2009
comment
Я давно не работал / не работал с OpenGL. Ваш вопрос о ротации, связанный с OpenGL, может стать хорошей темой для нового вопроса. Вы обязательно получите ответ намного лучше, чем я могу дать. - person Zack The Human; 26.07.2009
comment
Просто хотел добавить, что для вашего варианта 1 (который является наиболее распространенным подходом) RotSprite - отличное решение - погуглите, это бесплатный инструмент. Также следует отметить, что есть вариант 4: Напишите это самостоятельно, используя матрицы; см. ответ Марка Рэнсома здесь. - person Engineer; 13.07.2011
comment
@Nick Wiggill Спасибо за обновление. Я добавил ссылку на некоторую информацию о RotSprite (сайт автора RotSprite у меня сейчас не работает, но я могу обновить его позже). Я не включил четвертый вариант, потому что он не относится к SDL (полагаю, мой ответ №1 тоже не относится, ну да ладно), и вы уже предоставили ссылку. Еще раз спасибо! - person Zack The Human; 13.07.2011
comment
Лучший способ поблагодарить кого-то - проголосовать за его комментарий :) - person Engineer; 17.07.2011
comment
@ZackTheHuman Ни одна из приведенных выше ссылок в ответе не кажется полезной. Я не понимаю 3. вариант. Я понимаю, что вы имеете в виду, но как мне это сделать? У вас есть пример кода? - person Silidrone; 18.06.2017
comment
@MuhamedCicak К сожалению, похоже, что некоторые ссылки мертвы. Совет здесь заключался в том, чтобы использовать API OpenGL, который поддерживает вращение, и вы можете довольно легко сделать это с помощью SDL. Я рекомендую взглянуть на руководства Lazyfoo: lazyfoo.net/tutorials/SDL/15_rotation_and_fli .php - person Zack The Human; 29.06.2017
comment
Это решение устарело. Решение Джулиана Годдарда - самый простой способ сделать это сейчас: использовать функцию SDL_RenderCopyEx (). - person cmc; 27.07.2020

SDL_RenderCopyEx()

имеет дополнительные аргументы для вращения, переворота и центра вращения.

person Julian Goddard    schedule 15.01.2017

Вы можете использовать такую ​​библиотеку, как SDL_gfx

person Artur Soler    schedule 26.07.2009
comment
Да, правильно. Используйте rotozoomSurface(...) из SDL1 или SDL2: ferzkopp.net/Software/SDL_rotozoom или rotateSurface90Degrees(...) - person Alexander Lubyagin; 22.06.2021