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 项目

如何在 libgdx 中绘制 Button 类

如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回

Libgdx 之Actor 演员类

如何在libgdx使用矩形类来绘制矩形边框?

LibGDX - InputProcessor - 如果用户将手指从代表在 X 上移动的按钮拖动到代表在 Y 上移动的按钮