Libgdx AssetsManager - 听起来加载,但"未加载错误"? [英] Libgdx AssetsManager - Sounds Loaded but "Not Loaded Error"?

查看:219
本文介绍了Libgdx AssetsManager - 听起来加载,但"未加载错误"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用LibGDX的AssetsManager,我已经实现了管理的声音AssetsManager,并使其全球。这些文件都位于内

  ../数据/声音/.*
(例如:../data/sounds/buttons/buttonl.mp3)

然后我打开声音文件转换为管理器,然后包括一些code播放这些声音。低于code:

 公共final类声音{
    私有静态HashMap的<弦乐,HashMap的<字符串,字符串>>项=新的HashMap<弦乐,HashMap的<字符串,字符串>>();
    私有静态HashMap的<字符串,字符串> currentPackage =新的HashMap<字符串,字符串>();
    公共静态声音的声音;    市民声音(){
        让addpath(
            主要,
            BGM,数据/声音/主/ title.mp3
            buttonl,数据/声音/按键/ buttonl.mp3
            buttonh,数据/声音/键/ buttonh.mp3);        // ...更完善的资产更多路径
    }    公共静态布尔让addpath(字符串的packageName,字符串参数... args){
        如果(!entries.containsKey(的packageName)){
            entries.put(的packageName,新的HashMap<字符串,字符串>());
            的for(int i = 0; I< args.length;我++)
                entries.get(的packageName)。把(参数[I],ARGS [++ i]);
            返回true;
        }
        返回false;
    }    公共静态无效loadSoundAssets(字符串的packageName){
        对于(字符串str:entries.get(的packageName).values​​())
            s_manager.load(STR,Sound.class);
        s_manager.finishLoading();
    }    公共静态布尔播放(字符串文件){
        如果(currentPackage.containsKey(文件)){
            听起来= s_manager.get(文件,Sound.class);
            sound.play();
            返回true;
        }
        返回false;
    }
}

在一个更高的类与创建Sound类后

 公共类游戏实现了ApplicationListener {
    公共听起来gameSounds =新声音();    公共屏幕currentScreen =新MainMenuScreen();
    // ...更多类变量和方法    公共无效渲染(){
        currentScreen.update();
    }
}

问题是当我打电话

 公共类MainScreen()扩展屏幕{
    公共MainScreen(){
        Sounds.loadSoundAssets(主);
        // ...更多构造函数的变量和方法
    }
    // ...类的变量和方法    公共无效更新(){
        如果(s_manager.update()){
            如果(play.getBoundingRectangle()。含有(X,Y))
                Sounds.play(buttonl);
        }
    }
}

s_manager.update()返回true,但随后尝试播放声音文件buttonl,并抛出这个错误:

 螺纹LWJGL应用com.badlogic.gdx.utils.GdxRuntimeException异常:资产未加载:buttonh
    在com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:121)
    在device.sounds.Sounds.play(Sounds.java:146)
    在game.screens.MainMenuScreen.update(MainMenuScreen.java:63)
    在menu.StateManager.render(StateManager.java:89)
    在com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:190)
    在com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:110)

我应该如何使用的AssetsManager来解决这个加载/播放的问题?我想用AssetsManager,但目前,我的解决方法是使用

 声音= Gdx.audio.newSound(Gdx.files.internal(currentPackage.get(文件)));


解决方案

我相信,在您的播放方法,你的关键,而不是它的价值currentPackage调用AssetManager.get。我认为,正确的打法方法是:

 公共静态布尔播放(字符串文件){
    如果(currentPackage.containsKey(文件)){
        听起来= s_manager.get(currentPackage.get(文件),Sound.class);
        sound.play();
        返回true;
    }
    返回false;
}

When using LibGDX's AssetsManager, I've implement an AssetsManager for managing Sounds, and made it global. The files are all located within

../data/sounds/.*
(example: ../data/sounds/buttons/buttonl.mp3)

Then I load sound files into the manager, and then include some code to play those sounds. Code below:

public final class Sounds {
    private static HashMap<String, HashMap<String, String>> entries = new HashMap<String, HashMap<String, String>>();
    private static HashMap<String, String> currentPackage = new HashMap<String, String>();
    public static Sound sound;

    public Sounds() {
        addPath(
            "Main", 
            "bgm", "data/sounds/main/title.mp3",
            "buttonl", "data/sounds/buttons/buttonl.mp3",
            "buttonh", "data/sounds/buttons/buttonh.mp3");

        //... More paths with more sound assets
    }

    public static boolean addPath(String packageName, String... args) {
        if(!entries.containsKey(packageName)) {
            entries.put(packageName, new HashMap<String, String>());
            for(int i = 0; i < args.length; i ++)
                entries.get(packageName).put(args[i], args[++i]);
            return true;
        }
        return false;
    }

    public static void loadSoundAssets(String packageName) {
        for(String str : entries.get(packageName).values())
            s_manager.load(str, Sound.class);
        s_manager.finishLoading();
    }

    public static boolean play(String file) {
        if(currentPackage.containsKey(file)) {
            sound = s_manager.get(file, Sound.class);
            sound.play();
            return true;
        }
        return false;
    }
}

After creating the Sound class in a higher class with

public class Game implements ApplicationListener{
    public Sounds gameSounds = new Sounds();

    public Screen currentScreen = new MainMenuScreen();
    //... More class variables and methods

    public void render() {
        currentScreen.update();
    }
}

The problem comes when I call

public class MainScreen() extends Screen {
    public MainScreen() {
        Sounds.loadSoundAssets("Main");
        //... More constructor variables and methods
    }
    //... Class variables and methods

    public void update() {
        if(s_manager.update()) {
            if(play.getBoundingRectangle().contains(x, y))
                Sounds.play("buttonl");
        }
    }
}

s_manager.update() returns true, but then it tries to play the sound file "buttonl" and throws this error:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Asset not loaded: buttonh
    at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:121)
    at device.sounds.Sounds.play(Sounds.java:146)
    at game.screens.MainMenuScreen.update(MainMenuScreen.java:63)
    at menu.StateManager.render(StateManager.java:89)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:190)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)

How should I be using the AssetsManager to fix this loading/playing problem? I want to use the AssetsManager, but currently, my solution is to use

sound = Gdx.audio.newSound(Gdx.files.internal(currentPackage.get(file)));

解决方案

I believe that in your play method, you are calling AssetManager.get on the key rather than its value in currentPackage. I think a correct play method would be:

public static boolean play(String file) {
    if(currentPackage.containsKey(file)) {
        sound = s_manager.get(currentPackage.get(file), Sound.class);
        sound.play();
        return true;
    }
    return false;
}

这篇关于Libgdx AssetsManager - 听起来加载,但&QUOT;未加载错误&QUOT;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆