SDL и OpenGL

Уроки по OpenGL. Во всех уроках используется Cone3D. Среди уроков “Установка SDL и OpenGL библиотек в Linux”, “Загрузка моделей Quake 2 и PCX текстур”, “OCTREES”, “Рендеринг в текстуру”, “Динамические карты освещённости”.
Данные уроки достаточно давно не обновлялись. В “отмазке” написано – “использовать на свой страх и риск” ;)

NeonHelium – 48 уроков по OpenGL. Этот набор уроков гораздо полнее предыдущего.

Code::Blocks для Mac OS X и SDL

Пришлось немного повозиться, что бы заставить работать данную связку. Итак, приступим:

  1. Из списка “Link libraries” удаляем все библиотеки. Надеюсь, в будущих версиях Code::Blocks это поправят.
  2. В “Other linker options” нужно прописать “-framework SDL -framework Cocoa -framework SDL_image -framework SDL_mixer -framework OpenGL”. Ну или те библиотеки, которые вам нужны.
  3. Добавляем к проекту два файла SDLMain.h и SDLMain.m. В свойствах файла SDLMain.m указываем “Compile file” и “Link file”.
  4. В опциях проекта снимаем галку “Strip all symbols from binary” Это параметр -s компилятора. Если этого не сделать, то при попытке запуска приложения получим ошибку:
    dyld: lazy symbol binding failed: lazy pointer not found
    dyld: lazy pointer not found
    Trace/BPT trap
  5. После компиляции можно вручную выполнить strip.
  6. Думаю, что стоит написать скрипт, который будет после компиляции автоматически делать бандл.

Полезные ссылки:

Open Tyrian

Со времен DOS наверняка многим известна игра Tyrian – отличная аркада. Сейчас найти игру с таким захватывающим геймплеем очень сложно. Разработчики открыли исходные коды (не знал, что Tyrian был написан на Turbo Pascal) и появился кроссплатформенный порт Open Tyrian. На данный момент доступны сорцы только из репозитория и архив с ресурсами из оригинальной игры.
Порт написан на C и использует SDL. Работает игра под Windows, Mac OS X, Linux, а так же на консолях PSP, GP2X, Gizmondo, GameCube, Amiga, и Nokia Internet Tablets. Лицензия GNU GPL v2.

SDL_KEYUP и xneur

Несколько дней бился над проблемой, почему событие SDL_KEYDOWN приходит, а SDL_KEYUP нет. Ведь раньше все работало. Начал грешить на кривизну нового проекта (читай, моих рук), но этот же проект скомпилированный в Windows работал без проблем. Грешил на проблемы libsdl в Linux – перекомпилировал библиотеку – не помогает.
Совершенно случайно вспомнил о том, что недавно я установил новый билд xneur (переключатель раскладки, на подобии Punto Switcher) – в нем то и оказалась проблема. Выгрузил его из памяти – все работает!

glSDL

Вышла новая версия врапера glSDL. Работает весьма стабильно и в Windows. Использовать эту библиотеку очень просто. Вместо SDL.h подключается glSDL.h. Для испольиспользования OpenGL нужно добавить флаг SDL_GLSDL в SDL_SetVideoMode(). При этом сам код программы не меняется – используются стандартные вызовы SDL_*

sdl_picofont

Библиотека предназначена для вывода текста в SDL-приложениях. Отличается от прочих подобных библиотек тем, что использует вкомпиленный фонт. На данный момент не поддерживается utf-8. Используется фонт с размером матрицы символа 8x8px 1-bit. Лицензия GPLv2.

SDL_Surface* FNT_Render(const char* text, unsigned int len, SDL_Color color);
SDL_Surface* FNT_RenderD(const char* text, SDL_Color color);
  • text – указатель на текст
  • len – длина строки
  • color – цвет текста

Ссылка на библиотеку sdl_picofont.

Joystick + Linux

На радостях от того, что мне вернули GamePad было решено внести поддержку джойстика в “Arkanoid: Space Ball”. Написать поддержку джойстика в игре оказалось для меня проще, чем подключить сам джойстик. На самом деле, джойстик подключается очень просто. Но я не заметил, что одна опция в конфиге кернела не была установлена. Но теперь все в порядке ;)

UPD: Что то я погорячился – под Windows функция SDL_NumJoysticks() возвращает “0”, хотя сама Windows его видит и адекватно определяет нажатия на кнопки.

SDL_PollEvent()

По своей глупости нарвался на ошибку. Есть обработчик ивентов (клавиатура, мышь, джойстик), у мыши кроме состояния кнопок есть еще координаты и смещение относительно последней выборки. Код выглядит приблизительно так:


SDL_Event	evt;
g_nMouseDX	= 0;
g_nMouseDY	= 0;
while(SDL_PollEvent(&evt)) {
  switch(evt.type) {
  case SDL_MOUSEMOTION:
    g_nMouseDX	+= evt.motion.xrel;
    g_nMouseDY	+= evt.motion.yrel;
    break;
  }
}

Так вот, моя ошибка была тут:


    g_nMouseDX	+= evt.motion.xrel;
    g_nMouseDY	+= evt.motion.yrel;

Я просто не учитывал, что при выполнении этого кода на медленном компьютере, ивентов за каждый фрейм может приходить более одного. И по этой причине я терял данные о смещении мыши. Простая замена присвоения “=” на добавление “+=” решило проблему.

1 2