|
|
(не показаны 5 промежуточных версий 2 участников) |
Строка 1: |
Строка 1: |
− | == Ogre: Лазеры и звук ==
| + | #REDIRECT [[LXF86:Ogre]] |
− | | + | |
− | ''ЧАСТЬ 5: Последний урок в данной серии – музыка для ушей '''Пола Хадсона''': под такую сподручно убивать роботов.''
| + | |
− | | + | |
− | На данном этапе наша игра содержит все базовые элементы стрелялки от первого лица, но имеет легкий недостаток: п
| + | |
− | одстрелить-то вы никого и не можете. Пожалуй, это скорее тяжелый недостаток, если учесть, что Висельник Чед для стрельбы и задуман. Не хватает также звука и музыки, да и прицела оружия, чтоб видеть, куда мы стреляем. А фанаты С++, наверно, заметили, что отсутствует какое-либо высвобождение памяти.
| + | |
− | | + | |
− | Изящно завершим Висельника Чеда: реализуем все эти элементы на следующих четырех страницах, и притом запросто – обещаю!
| + | |
− | | + | |
− | === Включаем громкость ===
| + | |
− | | + | |
− | Имя Ogre не дает забыть о сильных сторонах программы: это акроним, означающий Объектно-ориентированный Графический Движок Рендеринга [Object-Oriented Graphics Rendering Engine]. Звук – как для эффектов, так и фоновый – не принимается в расчет и, согласно разработчикам Ogre, приниматься не будет. Но это не проблема, благодаря библиотеке SDL и ее расширению SDL_Mixer: вместе они позаботились о поддержке аудио. Если вы следили за нашими уроками с LXF82, то уже установили библиотеки libsdl-devel и libsdl-mixer-devel; а те, кто этот номер пропустил, пусть начнут с их установки, иначе код данного урока работать не будет. Прежде всего, надо изменить файл chad.h, объявив в нем звуковые файлы стрельбы (я использую laser1.wav) и музыкального фона (tipperary.mp3). В SDL-терминах это Mix_Chunk и Mix_Music соответственно, поэтому добавьте две строки в конец класса CChadGame:
| + | |
− | Mix_Chunk* m_MixFire;
| + | |
− | Mix_Music* m_Music;
| + | |
− | | + | |
− | Загрузка нашего аудиоматериала осуществляется в файле chad. cpp, в методе initialise(). В конец этого метода (т
| + | |
− | .е. после установки m_SceneMgr в NULL), добавьте следующие четыре строки:
| + | |
− | SDL_Init(SDL_INIT_AUDIO);
| + | |
− | Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048);
| + | |
− | m_MixFire = Mix_LoadWAV(“laser1.wav”);
| + | |
− | m_Music = Mix_LoadMUS(“tipperary.mp3”);
| + | |
− | | + | |
− | Первая строка инициирует поддержку звука, потому она и идет первой. Функция SDL_Init() сообщает SDL, какие части вы хотите использовать – графику, звук, ввод, таймеры и т.д., обычно через передачу списка констант, объединенных оператором ИЛИ – например, SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_CDROM. Для инициализации всех доступных в библиотеке подсистем (это изрядная расточительность, если вы не намерены все их использовать!), просто укажите SDL_INIT_EVERYTHING. Инициализировав звуковую подсистему SDL, можно открывать звуковое устройство. Это делает функция Mix_OpenAudio(): у нее четыре параметра, определяющих свойства звука. Первый параметр – частота дискретизации: 44100 соответствует CD-качеству; чтобы игра лучше работала на старых компьютерах, попробуйте уменьшить ее до 22050. Второй параметр – формат сэмпла (AUDIO_S16SYS означает 16 бит, какой байт старший – определяется системой), третий – количество каналов (1 для моно, 2 для стерео), а четвертый определяет размер буфера для проигрывания звука. Вам эти параметры ни о чем не говорят? Можете их проигнорировать. Просто скопируйте и вставьте приведенную мной строку кода и больше о ней не вспоминайте. Магия!
| + | |
− | | + | |
− | === Запускаем звуковые файлы ===
| + | |
− | | + | |
− | Настроив звуковую систему, мы, наконец, можем заказывать наши звук и музыку. SDL_Mixer берет на себя их загрузку, а вам остается сделать два вызова функций Mix_LoadWAV() и Mix_LoadMSU(). Они принимают имя загружаемого файла и автоматически обрабатывают множество популярных форматов – WAV, MP3, OGG, MID и MOD, но если ваш дистрибутив не поддерживает формат MP3, то SDL, скорее всего, не сможет его проиграть. Кому интересно, общедоступную запись tipperary.mp3 я нашел в Сети – она совершенно не подходит для игры [«Путь далекий до Типперери» – популярная песенка английских солдат времен I Мировой войны, – прим. ред.], поэтому вы уж сами подберите нужный файл! Чтобы покончить с поддержкой звука, остается еще два шага. Добавьте в методе frameStarted() следующие три строки кода:
| + | |
− | if (!Mix_PlayingMusic()) {
| + | |
− | Mix_PlayMusic(m_Music, 0);
| + | |
− | }
| + | |
− | | + | |
− | Я не собираюсь вас унижать, объясняя этот код, кроме 0 в конце: это число повторов нашей мелодии [0 значит, что она будет проиграна всего один раз, без повтора, – прим. ред.]. Добавление звука лазера потребует немного мозгов, поскольку потребуется определить метод mousePressed(). В настоящий момент он пуст и сидит в chad.h. Заменим «заглушку» в chad.h на прототип и напишем реализацию этого метода в chad.cpp (чтобы лазер зазвучал). В chad.h, превратим строку....
| + | |
− | void mousePressed(MouseEvent* e) { }
| + | |
− | | + | |
− | ... в...
| + | |
− | | + | |
− | void mousePressed(MouseEvent* e);
| + | |
− | | + | |
− | Тело этого метода надо поместить где-то в файле chad.cpp:
| + | |
− | void CChadGame::mousePressed(MouseEvent* e) {
| + | |
− | Mix_PlayChannel(-1, m_MixFire, 0);
| + | |
− | }
| + | |
− | | + | |
− | Звук лазера теперь будет раздаваться при каждом нажатии кнопки мыши – не сногсшибательно, но начало хорошее! Можете скомпилировать свой код и насладиться звуками лазера.
| + | |
− | | + | |
− | | + | |
− | ----
| + | |
− | | + | |
− | === Наш эксперт ===
| + | |
− | Пол Хадсон
| + | |
− | написал три книги по Linux и одну по PHP, он также поддерживает на SourceForge два проекта на Mono по лицензии
| + | |
− | GPL. Пол любит Emacs.
| + | |