Libgdx或本地人

时间:2014-10-30 04:43:04

标签: android libgdx

我正在寻找一个游戏,我需要涉及原生的Android sdk功能,如吐司,对话,在应用计费,其他谷歌Api,gcm ..等 当我构建工具应用程序并且使用动画和非常简短的表面视图时,我对android sdk非常有经验。

然而,我已经研究过libdgx并且看起来很有希望,但我找到的唯一缺点是"与Android原生sdk"不太容易集成。也就是说,除非我错过它,否则我无法开始自己的活动或调用原生api

所以我想知道,在这种情况下我应该使用libgdx还是应该使用原生路线?

谢谢

1 个答案:

答案 0 :(得分:4)

如果您确定不打算定位其他平台,可以将代码从默认核心项目移到Android项目中,然后在那里工作,随意调用任何API。但是你将无法在桌面上进行测试。

为了保持对其他平台的可移植性以及在桌面上进行测试的能力,您可以创建一个列出您要调用的所有Android API方法的界面。将此界面的实例传递到Android项目中的游戏构造函数中,这样您的游戏就可以间接调用它们。您的桌面项目可以使用空或系统日志记录方法传入此接口的实例。

示例:

public class MyGdxGame extends ApplicationAdapter {

    public interface AndroidAPIAdapter {
        public void makeToast(String msg);
        public void startActivity(int activityNumber);
    }

    AndroidAPIAdapter androidAPIAdapter;

    public MyGdxGame (AndroidAPIAdapter androidAPIAdapter){
        this.androidAPIAdapter = androidAPIAdapter;
    }

    //Call this from game code in core project as needed
    public void makeToast(String msg){
        if (androidAPIAdapter!=null)
            androidAPIAdapter.makeToast(msg);
    }

    //Call thisfrom game code in core project as needed
    public void startActivity(int activityNumber){
        if (androidAPIAdapter!=null)
            androidAPIAdapter.startActivity(activityNumber);
    }

    //...
}

使用:

public class MyGameActivity extends AndroidApplication implements AndroidAPIAdapter {

    public static final int ACTIVITY_SETTINGS = 0;
    public static final int ACTIVITY_ABOUT = 1;
    //etc.

    public void onCreate (Bundle bundle) {
        super.onCreate(bundle);

        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        config.useImmersiveMode = true;
        initialize(new MyGdxGame(this), config);
    }

    @Override
    public void makeToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT);
    }

    @Override
    public void startActivity(int activityNumber) {
        switch (activityNumber){
            case ACTIVITY_SETTINGS:
                startActivity(this, MySettingsActivity.class);
                break;
            case ACTIVITY_ABOUT:
                startActivity(this, MyAboutActivity.class);
                break;
        }
    }
}