Куча вопросов по SDL - PullRequest
       15

Куча вопросов по SDL

2 голосов
/ 12 мая 2009

Я начинаю небольшую RTS-игру с SDL, и вот несколько вопросов:

  • работаю с маленькими спрайтами, есть есть способ отображения экрана х2 со сканлайнами? Я пытался увеличить это с rotozoom, но он замедляется игра, и я хотел бы избежать масштабирования моих спрайтов вручную.
  • Как я могу переключиться между полноэкранным и оконным Бег ? Я нашел SDL_WM_ToggleFullScreen функция, но это не похоже на работу в Windows в соответствии с SDL док.
  • Чтобы поставить свой курсор, я загружаю спрайт указателем и заставить его следовать за мышью. Но я бы также хотел бы снизить частоту кадров с SDL_Delay и делает это движения указателя не плавные. SDL курсор не казался под влиянием частота кадров приложения это Лучшее решение использовать его, и если да, есть ли способ использовать изображение вместо странной маски?
  • Есть ли лучший способ ограничения частоты кадров?
  • Как мне покрасить поверхность (как в случае draw_lit_sprite в Allegro)

Ответы [ 2 ]

3 голосов
/ 12 мая 2009

Как я могу переключаться между полноэкранным и оконным режимом во время работы? Я нашел функцию SDL_WM_ToggleFullScreen, но она не работает в Windows в соответствии с документацией SDL.

Да, в документации говорится, что функция 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();
    }
}

Для этих точек:

  • Я работаю с маленькими спрайтами, есть ли способ отображения экрана х2 с сканы? Я пытался увеличить его с rotozoom но это замедляет игру и я хотел бы избежать масштабирования моего спрайты от руки.

  • Как мне покрасить поверхность (как с draw_lit_sprite в Allegro)

Я бы почти порекомендовал использовать режим OpenGL с SDL. Это даст вам аппаратно-ускоренную свободу делать подобные вещи. rotozoom все сделано в программном обеспечении (насколько я знаю), и поэтому оно так медленно. Это всегда будет медленно.

Еще один вариант, который вы можете использовать при рисовании спрайтов в 2x, - это нарисовать все в текстуру размером 1x, а затем после того, как все нарисовано, масштабировать эту текстуру в 2 раза. Тогда вы обрабатываете только одну поверхность, а не много маленьких снова и снова за кадр.

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

2 голосов
/ 13 мая 2009

Размер спрайта - для любого вида масштабирования или поворота в реальном времени лучше всего использовать OpenGL, а не программный блиттер, такой как SDL. Другие библиотеки, такие как SFML , подойдут для вас.

Полноэкранный / оконный - ответ Зака ​​выглядит достаточно хорошо, просто снова вызовите SDL_SetVideoMode.

Движение курсора. Обычно ОС визуализирует мышь отдельно от базового приложения, чтобы она оставалась отзывчивой. Если вы визуализируете курсор мыши самостоятельно, единственным выходом для вас является ускорение рендеринга игры. Я не думаю, что у вас есть большой выбор над самим курсором (возможно, из-за кроссплатформенных требований).

Частота кадров - многие предлагают отделить игровое движение и физику от частоты кадров (например, см. « Fix Your Timestep »). Также имейте в виду, что SDL_Delay накладывает нижнюю границу времени ожидания, а не верхнюю границу.

Тонирование поверхности - опять же, лучше всего это сделать в OpenGL, поскольку SDL не поддерживает это напрямую.

...