Озвучку движения игрока сделал. Слегка пришлось повозиться, правда (: Обычно я эмулятор использовал только для игр, но они, как выяснилось, позволяют дебажить игры и вытаскивать из них ресурсы =D
Вообще, первоначальная проблема была в том, что не было у меня звуковых файлов из игры. Пропарсив .nes файлы, кое-что достать удалось, но вот звуки движений не получилось. Думал, как же вытащить или где найти. Оказалось, что эмулька Nestopia позволят писать аудио потоки из игры прям в файл. Ну да, многие эмуляторы это умеют, но в этом можно заглушать некоторые потоки. Заглушил поток фоновой музыки и засейвил звуки движений. Потом, правда, в Audacity подгонять пришлось, чтоб бесшовно звук был.
В итоге, звуки есть, теперь надо их как-то использовать в libgdx. Сразу пришлось в классе Bomberman
менять direction
. Двигает то он, как правило, только в одном направлении, но вот в оригинальной игре озвучка движения по вертикали и горизонтали отличается. Логично конечно просто запускать обе озвучки, если двигается по двум направлениям сразу, но как оказалось озвучка в оригинальной игре — это не просто запуск двух озвучек, а именно отдельная (:
Собственно, создал массив ауди спрайтов, так сказать, и юзал уже их потом:
01.
//массив аудио дорожек
02.
public
Map<String, Sound> sounds =
new
HashMap<String, Sound>();
03.
04.
//добавляем необходимые дорожки
05.
private
void
loadSounds(){
06.
sounds.put(
"left-right"
, Gdx.audio.newSound(Gdx.files.internal(
"audio/left-right.ogg"
)));
07.
sounds.put(
"up-down"
, Gdx.audio.newSound(Gdx.files.internal(
"audio/up-down.ogg"
)));
08.
sounds.put(
"double-direction"
, Gdx.audio.newSound(Gdx.files.internal(
"audio/double-direction.ogg"
)));
09.
10.
}
Теперь просто надо в нужный момент проигрывать. При рендеринге сцены вызываю метод:
01.
//играет музло или нет
02.
boolean
isPlaying =
false
;
03.
private
void
playMusic(){
04.
Bomberman bomberman = world.getBomberman();
05.
//есил игрок двигается
06.
if
(bomberman.getState() == Bomberman.State.WALKING){
07.
//если мызыка не играет
08.
if
(!isPlaying)
09.
{
10.
isPlaying =
true
;
11.
//если идём по горизонтали и не по вертикали
12.
if
((bomberman.getDirection(Bomberman.Direction.LEFT) || bomberman.getDirection(Bomberman.Direction.RIGHT)) &&!(bomberman.getDirection(Bomberman.Direction.UP) || bomberman.getDirection(Bomberman.Direction.DOWN)))
13.
//врубаем музло...loop означает, что зациклена мызыка
14.
//в противоположность play(), который сыграет лишь 1 раз
15.
sounds.get(
"left-right"
).loop();
16.
...
17.
//дальше по аналогии для движения по вертикали
18.
}
19.
}
20.
//если не движемся
21.
else
{
22.
//если играет музло
23.
if
(isPlaying){
24.
//отключаем
25.
isPlaying =
false
;
26.
sounds.get(
"left-right"
).stop();
27.
sounds.get(
"up-down"
).stop();
28.
sounds.get(
"double-direction"
).stop();
29.
30.
}
31.
}
32.
}
Вот и вся магия. И да, ничто не мешает вам одновременно несколько Audio файлов проигрывать: фон и движение. libgdx их в разных потоках крутит, что очень радует. Единственное, что не понимаю, почему нету метода по проверке вроде «isPlaying». Приходится самому флаги создавать.
UDP: как оказалось, надо просто использовать класс Music
вместо Audio
. У него как раз есть метод isPlaying()
, что позволяет не создавать лишних флагов (:
Спасибо, за статью…. до звука ещё руки не доходят. :)
Я вот думаю как разделить в два потока рендер и логику приложения, и вобще стоит ли это делать))))
заманало писать в рендаре абдейт загруски файлов, или апдейт физики..
На вкус и цвет,как говорится. Я вообще стараюсь MVC придерживаться. Так что в игре, которую сейчас пишу, логику и рендеринг разграничил, что очень упрощает разработку.
Всё-таки собираюсь с этой недели начать в бложик выкладывать уроки по libgdx. В каком-нить из них расскажу, как можно разбить проект на составляющие)
Здравствуйте!
Сталкивались ли вы с проблемой отключения музыки?
К примеру у меня беда:
В проекте, в главном меню, есть пункт «Settings», в котором есть всего лишь одна кнопка «Sounds», которая работает как выключатель(т.е. нажал — звук есть, нажал — звука нет) и отключает или включает звук во всей игре. Итак сама проблема заключается в следующем:
по нажатию возврата в главное меню, а затем снова вход в «settings», если музыка играет и я нажимаю на кнопку, запускается ещё один экземпляр музыки и играет один и тот же трек в две дорожки.
программа почему-то думает что isPlaying() == false
Как решить эту проблему… Заранее спасибо за ответ!
soundsButton.addListener(new ClickListener(){
public void clicked(InputEvent event, float x, float y)
{
if(global.musicIntro.isPlaying() == true)
{
if(global.musicIntro.isPlaying() == true) global.musicIntro.pause();
else global.musicIntro.play();
}
else
{
if(global.musicIntro.isPlaying() == false) global.musicIntro.play();
}
}
});
Со звуком были проблемы, но такого рода нет.