2014-10-30 53 views
1

我期待做一個遊戲,我需要涉及本機android sdk功能,如吐司,對話框,在應用程序結算,其他谷歌Api,gcm ..等 我很有經驗的android sdk當我建立工具應用程序,我使用動畫和非常簡單的表面視圖。Libgdx或原生此

但是我看了看libdgx,看起來很有前途,但唯一的缺點是「與Android本機sdk的集成不太容易」。也就是說,我不能只是開始我自己的活動或調用本機api,除非我錯過它

所以我想知道,在這種情況下,我應該與libgdx一起去嗎?還是應該跟本機路線走?

謝謝

+0

據我所知,'LibGDX'不使用Java,你可以調用所有的Java API的Android SDK所提供的。但是如果你打算調用'c/C++',那麼你將不得不使用JNI綁定。 – 2014-10-30 04:53:57

+0

這並不難,如果你在CORE中有一個通用的接口並且在ANDROID上有一個實現,那麼它將工作得很好,當你實例化Android啓動類時,你只需要將它提供給你的Game類。 – EpicPandaForce 2014-10-30 15:16:07

回答

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; 
     } 
    } 
} 
+0

感謝您的評論。我只針對Android。調用不同的Api通常需要用意向啓動一個新的活動或使用上下文來完成Toast之類的工作。 Libgdx似乎沒有這個概念 – Snake 2014-10-30 14:30:17

+0

見第二段。 Libgdx不需要知道這些東西來調用Android項目界面中的方法。 – Tenfour04 2014-10-30 14:43:58

+0

我添加了一個例子。 – Tenfour04 2014-10-30 15:13:35