libgdxlibgdx入门


版本

发布日期
1.9.3 2016年5月16日
1.9.5 二零一六年十二月一十一日

添加对特定于平台的代码的支持

LibGDX的设计方式使您可以编写相同的代码并将其部署在多个不同的平台上。但是,有时您希望访问特定于平台的代码。例如,如果您的游戏中有排行榜和成就,除了在本地存储它们之外,您可能还想使用特定于平台的工具(如Google Play游戏)。或者您想使用数据库,或者完全不同的东西。

您无法将此类代码添加到核心模块中。所以第一步是创建一个接口。在核心模块中创建它。第一个是管理其他接口的实用程序:

public interface PlatformWrapper{
    //here you can also add other things you need that are platform specific.
    //If you want to create your own file saver for an instance, a JSON based database,
    //achievements, leaderboards, in app purchases and anything else you need platform specific code for.
    SQLWrapper getSQLSaver();//This one will be used in this example
    AchievementWrapper getAchievementHandler();//this line is here as an example
}
 

然后,我们需要创建第二个接口,即SQLWrapper。这个也在核心模块中。

public interface SQLWrapper{
    void init(String DATABASE);
    void saveSerializable(int id, Object o);
    Object loadSerializable(int id, Object o);
    void saveString(int id, String s);
    //.... and other methods you need here. This is something that varies
    //with usage. You may not need the serializable methods, but really need a custom method for saving 
    //an entire game world. This part is entirely up to you to find what methods you need
   
    //With these three methods, always assume it is the active database in question. Unless 
    //otherwise specified, it most likely is
    String getActiveDatabase();
    void deleteDatabase();
    void deleteTable(String table);//delete the active table
}
 

现在,您需要进入每个项目并创建一个实现PlatformWrapper的类和一个实现SQLWrapper的类。在每个项目中,您都可以添加必要的代码,例如实例,构造函数等。

在覆盖了所有接口之后,确保它们在实现PlatformWrapper的类中都有一个实例(并且有一个getter)。最后,更改主类中的构造函数。主类是您从启动器引用的类。它要么扩展ApplicationAdapter,要么实现ApplicationListener,要么扩展Game。编辑构造函数并添加PlatformWrapper作为参数。在平台包装器内部,除了所有其他包装器(sql,成就或您添加的任何其他包装器)之外,您还有一些实用程序(如果您添加了任何实用程序)。

现在,如果一切都正确设置,您可以调用PlatformWrapper并获取任何跨平台接口。调用任何方法并且(假设执行的代码是正确的)您将在任何平台上看到它执行与平台特定代码相关的操作

AssetManager

AssetManager是一个可以帮助您管理资产的类。

首先,您需要创建一个实例:

AssetManager am = new AssetManager();
 

在初始化之后,在渲染任何内容之前,您需要获取资源:

am.load("badlogic.jpg", Texture.class);//Texture.class is the class this asset is of. If it is a 
//sound asset, it doesn't go under Texture. if it is a 3D model, it doesn't go under Texture.class
//Which class added depends on the asset you load

//... other loading here ...//

//when finished, call finishLoading:
am.finishLoading();
 

现在,无论你想得到badlogic.jpg

Texture texture = am.get("badlogic.jpg");
//Ready to render! The rendering itself is in the normal way
 

使用AssetManager可以将它们加载到AssetManager的内存中,然后根据需要多次获取它们。

为什么要使用AssetManager? (来自维基 ):

AssetManager(代码)可帮助您加载和管理资产。由于以下不错的行为,这是加载资产的推荐方法:

  • 大多数资源的加载是异步完成的,因此您可以在加载时显示反应性加载屏幕
  • 资产参考计算。如果两个资产A和B都依赖于另一个资产C,则在A和B被处置之前不会处置C.这也意味着,如果您多次加载资产,它实际上将被共享,只占用一次内存!
  • 一个存储所有资产的地方。
  • 允许透明地实现缓存之类的东西(参见下面的FileHandleResolver)

安装或设置

在简单的Java程序的帮助下,LibGDX具有相当简单的设置。你可以在这里找到下载。启动应用程序时,它看起来像这样: LibGDX项目生成器的示例
注意:此屏幕截图是在Linux上拍摄的,显示的路径与Windows安装不同。但是,在与此安装应用程序兼容的任何操作系统上,表单都是相同的

输入框

在“名称”输入框中,是项目的游戏名称。 “包”输入框是主类的包。 “游戏类”输入框是运行游戏时调用的主类。 “目标”输入框是生成项目的目标。 “Andriod SDK”输入框,即你的android sdk所在的路径。此输入框是完全可选的,因此如果您不想将应用程序部署到Android,则不必担心这一点。


子项目

子项目只是要部署到的平台。那部分是非常自我解释的。例如,如果您不想将其部署到HTML,只需取消选中该复选框即可。


扩展

扩展是官方的LibGDX扩展。这是一个表格,告诉你每个人是什么:

扩展名称描述
子弹 Bullet是3D碰撞检测和刚体动力学库。
Freetype的 Freetype允许您使用.ttf字体,而不必使用Bitmap字体
工具允许您实现LibGDX工具的输出。
控制器允许您实现XBox 360控制器之类的控制器。
Box2D的适用于2D游戏的物理库。
Box2dlights 可以轻松地为物理游戏添加柔和的动态光源。
阿什利一个微小的实体框架
人工智能框架。

您可以添加第三方扩展程序,但此处不会显示其详细信息或名称。


高级

在“高级”部分中,您可以设置多个设置并为Eclipse和IDEA IDE生成额外的项目文件。

设置名称描述
Maven镜像URL 用提供的Maven URL替换Maven Central
理念生成Intellij IDEA项目文件
日食生成Eclipse项目文件
离线模式不要强制下载依赖项

一旦完成所有设置,就可以按“生成”按钮。这可能需要几秒钟,但它会生成基本文件,Gradle需要您的项目。完成后,就可以将项目导入IDE了。

LibGDX概述

LibGDX是一个用Java开发的免费开源游戏开发库。它的目标是允许用户开发在桌面,Android,iOS和Web浏览器上运行的跨平台游戏。编写代码一次,将其部署到任何主要平台。

LibGDX Hello World

基本

生成的项目包含已实现的基本Hello World类应用程序。

主项目是核心项目,包含所有与平台无关的代码。这是必需的,但根据您的生成设置,您可以为所选的每个平台添加多个项目。

这个例子

core 项目中打开com.mygdx.game.MyGdxGame.java 。您将看到以下代码:

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture img;
    
    @Override
    public void create () {
        batch = new SpriteBatch();
        img = new Texture("badlogic.jpg");
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(img, 0, 0);
        batch.end();
    }
    
    @Override
    public void dispose () {
        batch.dispose();
        img.dispose();
    }
} 
 

虽然这是您的主要项目,但您不会直接执行它,您始终必须运行特定于平台的Launcher,对于桌面,它在desktop 项目中称为com.mygdx.game.desktop.DesktopLauncher.java

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        new LwjglApplication(new MyGdxGame(), config);
    }
} 
 

在此课程中,您可以设置特定于平台的设置。


运行你的游戏

Eclipse和Intellij使用两种不同的方法来运行您的项目。找到您在下面使用的IDE。

使用Eclipse运行

使用eclipse,您可以通过将此类作为Java应用程序运行来运行您的应用程序(右键单击项目 - >运行为 - > Java应用程序)。您将看到以下窗口:

在桌面上运行Hello world

使用Intellij Idea运行

在Intellij中,您需要进行运行配置。要执行此操作,您必须单击右上角看起来像向下胡萝卜的按钮:

胡萝卜

然后单击“编辑配置...”按钮。您将看到一个包含所有当前运行配置的屏幕。单击该窗口左上角的“+”,然后选择“应用程序”选项。从那里,为“Main class”选项选择“DesktopLauncher”文件,将“Use classpath of module”设置为core选项,并将“Working directory”设置为core文件夹中的assets文件夹。最终产品看起来应该是这样的:

运行配置示例

完成后,您可以为运行配置选择一个名称,然后单击“应用”,然后单击“确定”。完成后,您可以单击右上角的绿色运行图标:

运行图标

MyGdxGame课程中发生了什么?

首先调用create 方法,该方法将初始化绘制到屏幕的批处理。然后该方法将badlogic.jpg加载到内存中。

在此之后,重复调用render 方法,直到应用程序停止。此方法将重置为背景颜色为红色并在屏幕上绘制图像。如您所见,您始终必须开始和结束批量绘图。最后,当应用程序即将停止调用dispose 方法时,将释放纹理和批处理使用的内存空间。

(很高兴知道处理可以在运行时以及其他平台上发生,例如Android,因为Android可能会在应用程序处于后台时释放内存空间,但这是一个更高级的主题)



备注:如果您在运行时出现如下错误,请检查此问题以获得答案!

找不到档案:badlogic.jpg(内部)

2D场景图

当您开始使用Java或Android时,您很快就会知道(0,0)位于左上角。但是,在LibGDX中,默认情况下(0,0)位于左下角。

使用正交相机,您可以将(0,0)放在左上角。虽然默认情况下(0,0)位于左下角。这是重要的事情,因为它也会改变纹理的哪个角有X和Y坐标。