Вопрос

Я начинаю небольшую игру 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 раза.Тогда вы обрабатываете только одну поверхность, а не множество маленьких поверхностей снова и снова для каждого кадра.

Что касается проблемы с курсором, похоже, вы, возможно, захотите быть рисуйте как можно быстрее, но обновляйте свою игру только с постоянной скоростью.Таким образом, у вас будет плавная прокрутка, но ход игры не выйдет из-под контроля.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top