четверг, 29 августа 2013 г.

Hello World с использованием SDL? Легко!

Начнём с того, что нам необходимо как-то получить эту библиотеку. На самом деле всё очень просто. Вот несколько простых шагов, которые должны будут помочь вам в установке и запуске первого приложения с использованием SDL.

  1. Идём на страницу загрузки на официальном сайте libsdl.org (я использую самый актуальный на момент написания статьи SDL2 )
  2. Нам понадобятся исходники (Source Code)
  3. После загрузке в архиве будут лежать дальнейшие инструкции по установке, следуйте им и у Вас всё получится. Для пользователей Visual Studio я детально опишу процесс.
Итак у нас есть исходники SDL и Visual Studio 2008 или новее.
Смело распаковываем архив в любое удобное для вас место - ищем внутри папку VisualC



Внутри, как я думаю вы уже заметили лежат файлы проектов для разных версий студий - открываем тот, который соответствует вашей.
Путём нехитрого билда всего решения мы собираем необходимые для нас либы и дллки.
SDL2.dll и SDL2.lib можно будет найти внутри дочерних директорий папки SDL

Дальше внутри дочерних директорий папки SDLmain ищем SDL2main.lib

Теперь начинается самое интересное, а именно создание и настройка проекта. Создаём проект Win32. Первым делом идём в настройки проекта и уберём использование предкомпилированных заголовков: Свойства Конфигурации -> С/С++ -> Предварительно откомпилированные заголовки - и в поле "Предварительно откомпилированный заголовок" устанавливаем "Не использовать предварительно скомпилированные заголовки". После этого смело удаляем всё лишнее, кроме %Имявашегопроекта%.cpp и %Имявашегопроекта%.h из проекта.

Теперь необходимо подключить библиотеки для этого идём в Свойства Конфигурации -> Компоновщик -> Ввод и в поле "Дополнительные зависимости" добавляем две библиотеки SDL2.lib и SDL2main.lib.

SDL2.dll можно просто положить к файлу проекта и таскать её за .exe файлом.
Теперь нам понадобятся исходники SDL. Для этого вернёмся в архив и возьмём папку include

Положить вы её можете куда заблагорассудится, лично у меня всё лежит в /source/SDL. Самое главное, если не кладёте в папку с проектом, то не забудьте указать проекту - где ему искать исходники, это можно сделать здесь:  Свойства Конфигурации -> С/С++ -> Общие - в поле "Дополнительные каталоги включаемых файлов" укажите путь к исходникам

На этом настройка закончена, теперь удалим всё из файлов %Имявашегопроекта%.cpp и %Имявашегопроекта%.h. А в файл %Имявашегопроекта%.cpp запишем следующие строки: 

#include "SDL.h"

int main( int argc, char* argv[] )
{
  SDL_Window *wnd = SDL_CreateWindow("Powered By SDL",0,0,100,100,0);
  SDL_ShowSimpleMessageBox(0,"Powered By SDL","Hello World!", wnd);
  return 0;
}

Подключаем SDL, первой строчкой создаём простейшее окно, второй - MessageBox. Если вы всё сделали правильно - увидите примерно следующее:


Искренне надеюсь, что этот тутор кому-нибудь поможет.
С наилучшими пожеланиями,
Куваев Александр.
ICQ: 472811290
e-mail: vinetorul@yandex.ru


21 комментарий:

  1. Класс!!!!!!!
    Напиши статейку по работе со звуком.

    ОтветитьУдалить
    Ответы
    1. Для SDL там нужно юзать аддон SDL_mixer, могу детально описать его установку, ну и примерчиков накидать, вы это имели ввиду? =)

      Удалить
  2. Вот у меня появилась проблема с SDL_mixer .
    Написал игрушку летает кораблик стреляет. И вот при выстреле проигрывается звук выстрела и бывает так что они накладываются друг на друга то эхо какое то появляется, то вообще нажав 1 раз на выстрел должен раз проиграть выстрел, а он раза 3 подряд проигрывает.

    ОтветитьУдалить
    Ответы
    1. Проблема возникает из-за того, что микшер звукового движка несколько раз накладывает звук сам на себя.
      Ну на первый взгляд я вижу два пути решения проблемы, простой - разовый, и сложный, но мощный:
      1) Простой: создать таймер, который не даст запускать проигрывание звука более одного раза за длину звука, т.е. таймер равный длине звука.
      2) Второй способ - глобальный: создать систему контроля аудио, в неё положить всё логику, связанную с таймерами и тд, и уже из нужных мест дёргать методы проигрывания определённого звука.

      PS проверьте, действительно ли происходит один выстрел, а не 3

      Если не сработает - напишите мне на почту, желательно с примерами кода (по небольшому описанию сложно понять, в чём проблема)

      Удалить
  3. Вот небольшой прототип, попробуй. http://yadi.sk/d/86kLnZ_l9nAPv
    Стрелять на пробел, а G что бы сменить оружее.
    При стрельбе идут искажения ((

    ОтветитьУдалить
    Ответы
    1. Угу, а можно на исходники взглянуть, точнее на то место, где вызов проигрывания звука?

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
    3. Правда там SDL 1.2 использовался.
      Я начал его изучать на нём писать и через неделю релиз SDL2 ))
      Сейчас переписываю на SDL2 и точно такой же эффект...

      Удалить
    4. В главном цикле приложения заводишь таймер, который на каждой итерации хранит в себе время, прошедшее с предыдущей итерации, это значение передаешь в update классу персонажа, а у персонажа заводишь поле - счётчик. Как только звук проигрывается - устанавливаешь счётчику некоторое неотрицательное значение, и на каждой итерации уменьшаешь его на пройденное время. Как только счётчик стал меньше нуля - можешь ещё раз проиграть звук. Если счётчик больше нуля, то звук не проигрываешь.
      В дальнейшем лучше будет вынести все счётчики в класс sound manager (т.е. у него нужно будет сделать свой update метод, в котором будут обновляться все счётчики, это будет удобнее в том плане, что из других частей кода ты просто будешь дёргать метод проигрывания звука, а уже менеджер будет разбираться - нужно проиграть или нет.

      Удалить
    5. Ну тогда получится что будет сделано больше выстрелов чем проиграно звуков для них?
      Так же вопрос в том, почему звук начинает проигрываться с небольшой задержкой?
      Получается так что нажимаешь выстрел, пуля пролетает четверть или пол экрана и только тогда проигрываться начинает. Хотя проигрывание вызывается до того как создаются пули. Поэтому я начинаю создавать пули не на конце пушек, а самом низу корабля игрока, что бы визуально звук хоть немного совпадал с видео.

      Удалить
    6. Ну звуки выстрелов обычно очень короткие, по-этому проблем особо возникнуть не должно с количеством проигранных дорожек. Что касается задержки тут может быть два варианта: 1) в самой дорожке в начала есть тишина, или 2) при каждом проигрывании дорожка читается с диска

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

      Удалить
    7. Говорите хватит несколько десятых секунды, но у меня выстрел производится раз в 250-300 миллисекунд.
      А прерывать пробовал, тогда там прерываются все звуки. А вот как реализовать прерывание нужного звука, я так и не придумал. Там надо ещё придумать какой то менеджер для каналов и уже с ним работать наверно.

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

      Удалить
    9. Так же у вас ещё хотел попросить, проверить есть или нету задержки перед проигрыванием, потому как у меня она чуть ли не 0.5-1 секунду составляет ((
      Перепробовал сотню разных звуков.

      Удалить
    10. Потестил, проблемы наложений не заметил, однако небольшая задержка есть, может таймер не скидывается?

      Удалить
  4. Провозился с SDL неделю и ничего путного не вышло со звуком. Сейчас пробую SFML там вроде со звуком все норм.

    ОтветитьУдалить
    Ответы
    1. С основами вроде разобрался. Вот результат. http://yadi.sk/d/nQMnF1UCAWhbq

      Удалить
    2. Хм, интересно, надо будет покопать, но она чисто игровая, как я понимаю.

      Удалить
    3. http://www.sfml-dev.org/ development of games and multimedia applications. На сайте написано.

      Удалить
    4. Перешел я тоже на SFML в общем :)

      Удалить