LibGdx 如何从 libgdx 类返回到 androidActivity
Posted
技术标签:
【中文标题】LibGdx 如何从 libgdx 类返回到 androidActivity【英文标题】:LibGdx how to return from libgdx class to an androidActivity 【发布时间】:2012-12-30 18:13:22 【问题描述】:所以,在一个 libgdx android 项目中,我们有一个包含 android 活动的文件夹和另一个包含 libgdx 项目源代码的文件夹。
要从 Android 活动开始“游戏”,我们使用 initialize(new MyGdxGame(),cfg);
现在我需要知道如何从游戏中的 libgdx 类返回到主菜单之类的 android 活动...
我尝试从 Activity 扩展类以获取 contextApplication
,但我无法填写第二个参数,因为程序无法识别 libgdx 类中的 android 类...
【问题讨论】:
【参考方案1】:在 libGDX 项目中使用 Android 特定代码的标准方法是在 libGDX 核心项目(例如,interface PlatformStuff
)中创建一个独立于平台的接口,然后在每个特定于平台的后端(例如,桌面或Android)使用特定于平台的对象(所以class AndroidPlatformStuff implements PlatformStuff
)实现该接口。您可以在构建时将接口的平台特定实现传递到通用代码中(例如,new MyGdxGame(new AndroidPlatformStuff())
。
调用更改活动和上下文的 Android 代码可能需要更多工作(因为它与 libGDX 基础架构有一点交互),但也应该是可行的。您应该能够使用集成广告支持的教程来获得基本概念。见http://code.google.com/p/libgdx/wiki/AdMobInLibgdx或http://code.google.com/p/libgdx/wiki/ApplicationPlatformSpecific
【讨论】:
【参考方案2】:首先,您应该在核心文件夹中创建一个接口类。这通常与您的游戏类一起放置。例如,假设您的函数名称将是 LoginFacebook() 用于名为 ActionResolver 的接口类
接口类
package com.mygdx.game;
public interface ActionResolver
public void LoginFacebook();
现在在您的游戏类中,您应该有以下构造函数:
public SpaceXplorerGame(ActionResolver actionResolver)
this.actionResolver = actionResolver;
现在在你的 android 文件夹中,在 src -> com.mygdx.game.android(你的包名)中,你应该创建你的处理程序类,在我的例子中叫做 ActionResolverAndroid
public class ActionResolverAndroid implements ActionResolver
Handler handler;
Context context;
public ActionResolverAndroid(Context context)
handler = new Handler();
this.context = context;
public void LoginFacebook()
handler.post(new Runnable()
@Override
public void run()
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
);
现在从 LibGdx 调用函数 LoginFacebook() 将带你到你在 android 中的 LoginAcitivty.class。 希望我没有错过任何东西
【讨论】:
【参考方案3】:你应该创建回调; 创建一个接口并在android类上实现,然后将其传递给libgdx,当您需要调用相关方法时。
【讨论】:
【参考方案4】:用于广告平台的 libGDX 文档正是您所需要的。它在 libGDX 核心中创建一个接口,并在 android 启动器中实现一个处理程序,该处理程序可以从核心部分调用。
看这里:https://github.com/libgdx/libgdx/wiki/Admob-in-libgdx
基本上跳过所有的广告内容。 向下滚动到“控制”,只需实现以下部分:
在您的 AndroidLauncher 中注册一个新的处理程序。这是必要的,因此处理程序可以稍后在正确的 android 线程中处理接口的实现功能......(参见“HelloWorldAndroid”) 在核心项目中创建接口(如 IActivityRequestHandler) 让您的 AndroidLauncher 实现该功能并使用处理程序在您的 android 线程中执行实际功能最后,您需要传递一个引用到您的 libGDX 核心代码。我个人通过在我的核心项目中实现一个 singleton-class 来使用它,如下所示:
class SingletonData
private SingletonData()
private static SingletonData instance;
public static SingletonData getInstance()
if(instance==null)
instance = new SingletonData(); // can only be assessed here. no other class can generate a second instance
return instance;
private IActivityRequestHandler handler;
public void setHandler(IActivityRequestHandler handler)
this.handler=handler;
public IActivityRequestHandler getHandler()
return this.handler;
在您的 AndroidLauncher(即 HelloWorldAndroid)创建结束时调用以下内容以注册它:
SingletonData.getInstance().setHandler(this);
现在您可以通过以下方式在任何您喜欢的核心类中使用它:
SingletonData.getInstance().getHandler().showAds(true); // showAds or whatever your interface handler implements
PS:确保在游戏开始后调用 getHandler(),这样你就不会得到空引用。
【讨论】:
以上是关于LibGdx 如何从 libgdx 类返回到 androidActivity的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gradle 将 jar 文件添加到 libgdx 项目
如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回
LibGDX - InputProcessor - 如果用户将手指从代表在 X 上移动的按钮拖动到代表在 Y 上移动的按钮