Краткий урок по звукам и музыке, очень краткий. Со звуком игра оживает, и если Вы думаете , что это не так, то впилите звук в Вашу игру и узрейте ))
Видеоверсия http://www.youtube.com/watch?v=QU68sHQzwqw
Заходим на http://www.sfml-dev.org/tutorials/2.3/audio-sounds.php и смотрим:
Звук (sf::Sound
) – подходит для коротких\маленьких звуков (прыжков, выстрелов), это более легковесный объект, помещается в памяти.
Музыка (sf::Music
) – не загружает весь ваш файл в память, вместо этого он передает его “на лету” из вашего файла. Используется для сжатых музыкальных сопровождений, которые длятся от одной до нескольких минут.
Для загрузки звуков – такая конструкция:
1 2 3 4 5 |
sf::SoundBuffer buffer; buffer.loadFromFile(какой-то файл)// тут загружаем в буфер что то sf::Sound sound; sound.setBuffer(buffer); sound.play(); |
На примере рассмотрим:
В продолжение предыдущим урокам научим нашего персонажа озвучивать свою стрельбу.
Я буду использовать этот звук стрельбы:
shoot
Помещу его в папку с main.cpp (лучше внутри ещё одну папку sounds создать)
SFML не поддерживает mp3. Только WAV, FLAC, OGG/Vorbis
Я буду использовать ogg, в инете есть конвертер mp3 в ogg онлайн, удобно. Например вот: http://audio.online-convert.com/ru/convert-to-ogg
Там где загружаем картинки и уровень напишем (а вы старайтесь не городить всё вместе и разделять)
1 2 3 |
SoundBuffer shootBuffer;//создаём буфер для звука shootBuffer.loadFromFile("shoot.ogg");//загружаем в него звук Sound shoot(shootBuffer);//создаем звук и загружаем в него звук из буфера |
Теперь в месте , где мы нажимаем кнопку выстрела, а так же сразу после появления пули пишем:
1 2 |
entities.push_back(new Bullet(BulletImage, "Bullet", lvl, p.x, p.y, 16, 16, pos.x, pos.y)); //и передаем в конструктор пули. создается пуля shoot.play();//играем звук пули |
Запускаем и проверяем. Напишите shoot. и посмотрите варианты, которые предлагаются. Например там можно задать громкость setVolume, или перемотать.
Перейдем к музыке:
конвертните свой файл музыки в .ogg или другой съедобный формат и закиньте в папку с main.cpp
теперь после создания (не воспроизведения, а создания!) звука пишем:
1 2 3 |
Music music;//создаем объект музыки music.openFromFile("music.ogg");//загружаем файл music.play();//воспроизводим музыку |
Всё, музыка будет играть. После того, как она кончится – она может замолчать. На форуме был такой вопрос. Есть стандартное решение, по моему music.setLoop(true); зациклит музыку и она будет играть снова. Опять же напечатав music. Вы увидите ф-ции , которые есть у этого объекта. Там же есть getStatus, который вернет “играется ли сейчас музыка?” . Не играется? Ну так включаем: music.play (), но это уже второй способ зациклить музыку. Первый стандартный и более простой. Это Вам как пример.
Самая частая проблема, с которой Вы столкнетесь – зацикливание. Если Ваше событие происходит бесконечное количество раз (всегда == true например), то звук не сможет проиграться , он будет играть всегда с самого начала. Поэтому будьте внимательнее.