特定平台代码接口

有时需要访问特定于平台的 api,例如,添加广告服务或由 Swarm 等框架提供的排行榜功能。这种功能可以通过先定义一个公共的接口类,然后在特定的平台里定义特定的实现类来实现。

比如以下示例,假设我们想要使用一个非常简单的只能在 Android 上使用的排行榜 API。对于其他平台,我们只想记录调用或提供返回一个值。

安卓中排行榜功能的代码实现:

public class LeaderboardServiceApi {
   public void submitScore(String user, int score) { 
	 	// 具体的排行榜实现
	 }
}

首先在游戏应用的核心模块中定义一个抽象类。

public interface Leaderboard {
   public void submitScore(String user, int score);
}

接下来,我们为每个平台创建具体的实现,并将它们放入各自的模块中。 Android中的实现:

public class AndroidLeaderboard implements Leaderboard {
   private final LeaderboardServiceApi service;

   public AndroidLeaderboard() {
      // Assuming we can instantiate it like this
      service = new LeaderboardServiceApi();
   }

   public void submitScore(String user, int score) {
      service.submitScore(user, score);
   }
}

desktop中的实现:

public class DesktopLeaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score);
   }
}

HTML5中的实现:

public class Html5Leaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("Html5Leaderboard", "would have submitted score for user " + user + ": " + score);
   }
}

接下来,我们可以将具体的 Leaderboard 实现传递给ApplicationListener的构造函数。

public class MyGame implements ApplicationListener {
   private final Leaderboard leaderboard;

   public MyGame(Leaderboard leaderboard) {
      this.leaderboard = leaderboard;
   }

   // 其他相应的代码
}

最后在每个启动类中,我们可以将相应的排行榜实现作为参数传递给MyGame,例如,在desktop中的示例代码如下:

public static void main(String[] argv) {
   LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
   new LwjglApplication(new MyGame(new DesktopLeaderboard()), config);
}

其他平台的类似,这里就不列入了。