Масштабирование спрайтов в SDL
-
20-09-2019 - |
Вопрос
Как я могу масштабировать спрайты в SDL?
Решение
SDL не обеспечивает функции масштабирования напрямую, но есть дополнительная библиотека под названием SDL_gfx который обеспечивает возможности вращения и масштабирования.Есть также еще одна библиотека под названием Sprig который обеспечивает аналогичные функции.
Другие советы
Вы можете масштабировать, если получаете спрайты из текстуры с помощью SDL_RenderCopy(), но я не могу гарантировать вам сглаживание.
С помощью функции SDL_RenderCopy() вы передаете 4 параметра:
- указатель на средство рендеринга (где вы собираетесь визуализировать).
- указатель на текстуру (где вы собираетесь получить спрайт).
- указатель на исходный прямоугольник (область и положение, где вы получаете спрайт на текстуре).
- и указатель на dest rect (область и положение в средстве визуализации, которое вы собираетесь нарисовать).
Вам следует изменить только целевой прямоугольник, например, если вы собираетесь визуализировать изображение размером 300 x 300 и хотите его масштабировать, ваш целевой прямоугольник должен иметь размер 150 x 150 или 72 x 72 или любое другое значение, которое вы хотите масштабировать.
Решение от Ibrahim CS работает.
Позвольте мне рассказать об этом решении и предоставить код.Еще одна вещь, на которую следует обратить внимание, — это вычисление новой позиции (x,y) с использованием верхнего левого угла начала координат для рендеринга масштабированной текстуры.
я делаю это вот так
// calculate new x and y
int new_x = (x + texture->w/2) - (texture->w/2 * new_scale);
int new_y = (y + texture->h/2) - (texture->h/2 * new_scale);
// form new destination rect
SDL_Rect dest_rect = { new_x, new_y, texture->w * scale, texture->h * scale };
// render
SDL_RenderCopy(renderer, texture, NULL, &dest_rect);
Предположим, что texture
является SDL_Texture
, и renderer
является SDL_Renderer
, и вы выполняете полный рендеринг от входной текстуры до места назначения.
Вы не предоставили никакого кода, поэтому я предполагаю, что вы используете текстуры и SDL_Renderer:
При использовании SDL_RenderCopy() текстура будет растянута в соответствии с целевым SDL_Rect, поэтому, если вы увеличите или уменьшите целевой SDL_Rect, вы сможете выполнить простое масштабирование текстуры.
Если вы используете СФМЛ вместо этого вы получаете очень похожий набор кроссплатформенных возможностей, но графика имеет аппаратное ускорение, а такие функции, как масштабирование и вращение, предоставляются бесплатно, как с точки зрения отсутствия дополнительных зависимостей, так и с точки зрения отсутствия заметного использования процессорного времени для работы.