有时需要访问特定于平台的 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);
}
其他平台的类似,这里就不列入了。