Вопрос
Я начинаю небольшую игру RTS с SDL, и вот несколько вопросов:
- Я работаю с маленькими спрайтами, есть ли способ отображения экрана x2 с помощью линий сканирования?Я пробовал масштабировать это с помощью rotozoom, но это замедляет работу игра, и я бы не хотел масштабировать свои спрайты вручную.
- Как я могу переключаться
между полноэкранным режимом и оконным во время
работы?Я нашел тот самый
SDL_WM_ToggleFullScreen
функция, но похоже, она не работает в Windows согласно SDL doc. - Чтобы поместить свой собственный курсор, я загружаю спрайт своим указателем и
заставляю его следовать за мышью.Но я бы
также хотел снизить частоту кадров с помощью
SDL_Delay
и это делает движения указателя не плавными.SDL На курсор, похоже, не влияет частота кадров приложения является ли это лучшим решением для его использования, и если да, есть ли способ использовать изображение вместо странной маски? - Есть ли лучший способ ограничить частоту кадров?
- Как я могу подкрасить поверхность (например, с помощью
draw_lit_sprite
в Allegro)
Решение
Размер спрайта - для любого масштабирования или поворота в реальном времени вам лучше всего использовать OpenGL, а не программный блиттер вроде SDL.Другие библиотеки, такие как SFML заверни это для себя.
Полноэкранный / Оконный - ответ Зака выглядит достаточно хорошо, просто снова вызовите SDL_SetVideoMode.
Перемещение курсора - Обычно операционная система отображает мышь отдельно от базового приложения, чтобы она оставалась отзывчивой.Если вы сами отрисовываете курсор мыши, то ваш единственный выход - ускорить отрисовку вашей игры.Я не думаю, что у вас есть большой выбор в отношении самого курсора (возможно, из-за кросс-платформенных требований).
Частота кадров - многие предлагают отделить внутриигровое движение и физику от вашей частоты кадров (например.видишь 'Зафиксируйте Свой Временной интервал').Кроме того, имейте в виду, что SDL_Delay накладывает нижнюю границу на время ожидания, а не верхнюю.
Тонирование поверхности - опять же, это лучше всего выполняется OpenGL, поскольку SDL не поддерживает это напрямую.
Другие советы
Как я могу переключаться между полноэкранным режимом и оконным во время работы?Я нашел тот самый
SDL_WM_ToggleFullScreen
функция, но, похоже, она не работает в Windows в соответствии с SDL doc.
Да, в документации указано, что SDL_WM_ToggleFullScreen
функция в настоящее время работает только для X.
То, как я это делаю, выглядит примерно так:
void SdlGraphics::setupScreenSurface() {
Uint32 flags = 0;
flags |= SDL_HWSURFACE;
flags |= SDL_DOUBLEBUF;
if(isFullScreen) {
flags |= SDL_FULLSCREEN;
}
screenSurface = boost::shared_ptr<SDL_Surface>(
SDL_SetVideoMode(width, height, depth, flags),
utility::NullDeleter()
);
}
void SdlGraphics::setFullScreen(bool fullScreen) {
if(isFullScreen != fullScreen) {
isFullScreen = fullScreen;
setupScreenSurface();
}
}
Для этих точек:
Я работаю с маленькими спрайтами, есть ли способ отображения экрана x2 с помощью линий сканирования?Я пробовал масштабировать его с помощью rotozoom, но это замедляет игру и я бы не хотел масштабировать свои спрайты вручную.
Как я могу подкрасить поверхность (например, с помощью
draw_lit_sprite
в Allegro)
Я бы почти рекомендовал использовать режим OpenGL с SDL.Это даст вам свободу делать подобные вещи с аппаратным ускорением. rotozoom
все это делается программным обеспечением (насколько мне известно), и именно поэтому это так медленно.Это всегда будет медленно.
Еще один вариант, который у вас может возникнуть при рисовании спрайтов в 2 раза, - это нарисовать все в текстуре размером в 1 раз, а затем, после того как все отрисовано, масштабировать эту текстуру в 2 раза.Тогда вы обрабатываете только одну поверхность, а не множество маленьких поверхностей снова и снова для каждого кадра.
Что касается проблемы с курсором, похоже, вы, возможно, захотите быть рисуйте как можно быстрее, но обновляйте свою игру только с постоянной скоростью.Таким образом, у вас будет плавная прокрутка, но ход игры не выйдет из-под контроля.