如何在不使AssetManager静态的情况下在libGDX中构建ResourceManager?

时间:2016-07-15 08:44:14

标签: libgdx

自从我开始阅读有关如何管理libGDX中的资产以来已经过了3天。我在文档中读到的第一件事是永远不会使AssetManager或任何纹理静态,但我到目前为止所见的所有示例都将AssetManager作为静态。 有人可以共享一个没有被用作Singleton的AssetManager项目/代码吗? 或者告诉我该怎么做。

2 个答案:

答案 0 :(得分:1)

我曾在$j(function() { $j(document).on('change', 'select#email_select', function(event) { $j.ajax({ type: "POST", url: "../profile/ajax/email_info.php", data: {#select_email val(), }, cache: false, alert('error'); }); }); }); 类实例中创建$("#user_comment_show").append("<li><a id='remove_link' href='<?php echo base_url()?>/my_site/remove_user_comment/'+data.user_email_address+'/'+data.user_text+'>Your Link Name</a></li>") 。然后,因为我正在使用Screens我将public sealed class UserDomainConfig: ConfigParser { public UserDomainConfig(string configFilePath) : base(configFilePath) { } public Domain GetConfig(string key) => GetConfig<Domain>(key); public override bool LoadConfigs() { return base.LoadConfigs(); } public UserDomainConfig SetConfig(string key, Domain value) { base.SetConfig(key, value); return this; } } public abstract class ConfigParser: IConfig { /* Snip */ /// <summary> /// Gets the config. /// </summary> /// <returns>The config.</returns> /// <param name="key">Key.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public virtual T GetConfig<T>(string key) { object output = null; try { if (!configs.TryGetValue(key, out output)) return default(T); //return (T)output; //return output as T; // This is where the exception is occurring. // I've tried multiple solutions to try to remedy this issue. return (T)Convert.ChangeType(output, typeof(T)); } catch (InvalidCastException ex) { logger.Error($"Failed to cast config { key }!"); } return default(T); } /// <summary> /// Sets the config. /// </summary> /// <returns>The config.</returns> /// <param name="key">Key.</param> /// <param name="value">Value.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public virtual IConfig SetConfig<T>(string key, T value) { if (KeyExists(key)) configs.Remove(key); configs.Add(key, value); return this; } 实例设置为构造函数,我可以通过它访问assetManager

AssetManager

不知道这是不是最好的方式。

如果您不想将Main extends Game实例传递给屏幕,可以使用

main

获取当前的 public class MyScreen implements Screen { protected Main game; public MyScreen (Main game) { this.game = game; game.assetManager.load(... } 类对象

答案 1 :(得分:1)

我这样做的方法是在我的第一个屏幕(这是一个加载屏幕)中简单地创建一个AssetManager实例,然后通过它们的构造函数在每个屏幕中传递它。

    public class LoadingScreen implements Screen {
    private AssetManager assetManager ; 
    }

    public LoadingScreen(){
    assetManager = new AssetManager ();
    }

    //when going to the next screen, when the assetManager finishes loading:

     ((Game)Gdx.app.getApplicationListener()).setScreen(new NextScreen(assetManager,...));

附录,以及你的NextScreen类:

    private AssetManager assetManager;

    public NextScreen (AssetManager assetManager){
    this.assetManager = assetManager;
    }