2014-11-29 5 views
0

몇 가지 게임, 2 차원, 1 3D 게임 및 1 안드로이드 애플 리케이션 (대부분 측면 프로젝트)에서 일 해왔다. Java를 통해 안드로이드 및 컴퓨터 용 게임을 구축 할 수있는 유연성으로 인해 libgdx를 좋아했지만 내가 만난 문제입니다. 게임을 .jar 또는 .apk로 내 보내면 오디오 재생을 거부합니다 ....하지만 intellij를 통해 오디오를 실행하면 오디오가 완벽하게 작동하므로 libgdx 사운드 엔진이 내보내기시에 도청 당했다고 가정합니다. 내 플랫폼에 대한 사운드 엔진과 그것은 오류를 뱉어 내 ... intellij에서 일하는 .jar 파일로 내보낼 수있는 intellij가 metainf을 빌드하지 않기 때문에 일식을 통해 게임을 내보내는 것입니다 ...
그래서 질문은 :
1) 기본 libGDX 사운드 기능으로 내보낼 수있는 비밀 방법이 있습니까? 오류를 뱉어없이 libjdx이 musicbox 코드를 작동하게 할 수있는 방법이 musicBoxlibGDX와 javax.sound가 충돌합니까? 그리고 스케일링 문제

import com.badlogic.gdx.audio.Music; 

Music music; 

Music music = Gdx.audio.newMusic(Gdx.files.internal("Music/TheRoadOfMoor.wav")); 
music.setVolume(0.2f); 
music.setLooping(true); 
music.play(); 
boolean isPlaying = music.isPlaying(); 
boolean isLooping = music.isLooping(); 
float position = music.getPosition(); 


2)없이
MainClass 있습니까? musicbox

import com.charedinferno.game.audio.MusicBox; 
    MusicBox music; 

    public void create(){ 
     music.load("Musicx/level1.mp3", "level1"); 
     music.play("level1"); 
     music.loop("level1", 600, MusicBox.getFrames("level1") - 2200); 
    } 


오류와
MusicBox.java

import java.util.HashMap; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 

public class MusicBox { 

    private static HashMap<String, Clip> clips; 
    private static int gap; 
    private static boolean mute = false; 

    public static void init() { 
     clips = new HashMap<String, Clip>(); 
     gap = 0; 
    } 

    public static void load(String s, String n) { 
     if(clips.get(n) != null) return; 
     Clip clip; 
     try { 
      AudioInputStream ais = AudioSystem.getAudioInputStream(MusicBox.class.getResourceAsStream(s)); 
      AudioFormat baseFormat = ais.getFormat(); 
      AudioFormat decodeFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); 
      AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais); 
      clip = AudioSystem.getClip(); 
      clip.open(dais); 
      clips.put(n, clip); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void play(String s) { 
     play(s, gap); 
    } 

    public static void play(String s, int i) { 
     if(mute) return; 
     Clip c = clips.get(s); 
     if(c == null) return; 
     if(c.isRunning()) c.stop(); 
     c.setFramePosition(i); 
     while(!c.isRunning()) c.start(); 
    } 

    public static void stop(String s) { 
     if(clips.get(s) == null) return; 
     if(clips.get(s).isRunning()) clips.get(s).stop(); 
    } 

    public static void resume(String s) { 
     if(mute) return; 
     if(clips.get(s).isRunning()) return; 
     clips.get(s).start(); 
    } 

    public static void loop(String s) { 
     loop(s, gap, gap, clips.get(s).getFrameLength() - 1); 
    } 

    public static void loop(String s, int frame) { 
     loop(s, frame, gap, clips.get(s).getFrameLength() - 1); 
    } 

    public static void loop(String s, int start, int end) { 
     loop(s, gap, start, end); 
    } 

    public static void loop(String s, int frame, int start, int end) { 
     stop(s); 
     if(mute) return; 
     clips.get(s).setLoopPoints(start, end); 
     clips.get(s).setFramePosition(frame); 
     clips.get(s).loop(Clip.LOOP_CONTINUOUSLY); 
    } 

    public static void setPosition(String s, int frame) { 
     clips.get(s).setFramePosition(frame); 
    } 

    public static int getFrames(String s) { return clips.get(s).getFrameLength(); } 
    public static int getPosition(String s) { return clips.get(s).getFramePosition(); } 

    public static void close(String s) { 
     stop(s); 
     clips.get(s).close(); 
    } 

} 


MainClass.java:122 그것은 밖으로 뱉어 :

Exception in thread "LWJGL Application" java.lang.NullPointerException 
at com.game.audio.MusicBox.load(MusicBox.java:25) 
at com.game.CharedInferno.show(MainClass.java:122) 
at com.badlogic.gdx.Game.setScreen(Game.java:61) 
at com.charedinferno.game.MainMenu$1.touchDown(MainMenu.java:101) 
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:55) 
at com.badlogic.gdx.scenes.scene2d.Actor.notify(Actor.java:182) 
at com.badlogic.gdx.scenes.scene2d.Actor.fire(Actor.java:153) 
at com.badlogic.gdx.scenes.scene2d.Stage.touchDown(Stage.java:278) 
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:323) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:199) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114) 


3) 그리고 마지막 문제 그것은 나에게 다소 괴롭히는 것이지만 소리 만큼은 아니지만, 게임이 안드로이드에 적용될 때입니다. hing가 1920x1080으로 풀 스크린으로 표시되는 대신 확대 축소됩니다. 모든 것이 1280x720으로 고정되어있는 것처럼 수정 되었습니까? (다시 중요하지 않음)

+0

(JukeBox.java : 25) –

+0

yea 오르골과 쥬크 박스는 같은 클래스입니다 :/그냥 다른 게임에서 같은 소스를 복사했는데 여기에 게시하기 전에 이름을 바꾸지 않았습니다> _> 구형 게임은 같은 음원으로 이름이 지정되었습니다 ... 내가 가진 마지막 프로젝트였습니다 여기에 게시하기 전에 열어 xD – Naiakoa

답변

0

모든 문제가 해결되었지만 완전히 포기하고 새로운 해결책을 제시하기로 결심했습니다. 여기에 작동하는 오디오 시스템을 원하는 사람들을 위해 그 (해결 문제 1과 2)에 대한 새로운 코드는 : 문제 3 번을 해결하기

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.audio.Sound; 
import com.badlogic.gdx.audio.Music; 
import com.badlogic.gdx.graphics.Texture; 

public class MusicBox { 

private HashMap<String, Music> music; 
private HashMap<String, Sound> sounds; 

public MusicBox() { 
    music = new HashMap<String, Music>(); 
    sounds = new HashMap<String, Sound>(); 
} 

public void loadMusic(String path) { 
    int slashIndex = path.lastIndexOf('/'); 
    String key; 
    if(slashIndex == -1) { 
     key = path.substring(0, path.lastIndexOf('.')); 
    } 
    else { 
     key = path.substring(slashIndex + 1, path.lastIndexOf('.')); 
    } 
    loadMusic(path, key); 
} 
public void loadMusic(String path, String key) { 
    Music m = Gdx.audio.newMusic(Gdx.files.local(path)); 
    music.put(key, m); 
} 
public Music getMusic(String key) { 
    return music.get(key); 
} 
public void removeMusic(String key) { 
    Music m = music.get(key); 
    if(m != null) { 
     music.remove(key); 
     m.dispose(); 
    } 
} 
public void removeAll() { 
    for(Object o : music.values()) { 
     Music music = (Music) o; 
     music.dispose(); 
    } 
    music.clear(); 
    for(Object o : sounds.values()) { 
     Sound sound = (Sound) o; 
     sound.dispose(); 
    } 
    sounds.clear(); 
} 

} 





대신, 나에게 몇 시간이 걸렸다 단지 기본 장난 난 그냥 일련의 검사에 추가하고 특정 장치 솔루션에 필요할 때 OrthographicCamera 변경에 의존하는 것은 여기에 있습니다 :

,이 클래스 com.game.audio.JukeBox.load입니다
if(Gdx.app.getType() == Application.ApplicationType.Android) { 
      camera = new OrthographicCamera(640, 360); 
     }else if(Gdx.app.getType() == Application.ApplicationType.Desktop){ 
      camera = new OrthographicCamera(1280,720); 
     }