第五章:在其他IDE中管理资产

本文将介绍在不同的Java开发工具中,如何创建资产目录。

Eclipse

新建一个普通的Java工程,根据你自己的喜好来命名。

在工程目录下,手动创建 assets 资产目录结构。

右键单击 assets 文件夹,在弹出菜单中选择 Build Path -> Use as Source Folder。这样做将把 assets 转化为Eclipse的源码目录,并当作classpath来识别。

assets 中的文件夹现在都变成了 package ,想要继续在其中创建子文件夹,需要使用创建 package 的方式来操作。

例如在 Textures 中创建 Monkey 文件夹,要右键单击 Textures ,然后在弹出菜单中选择 New -> Pacakge

随后,在 New Java Package 窗口中,将包名(Name)写成 Textures.Monkey,最后点击 Finish

同理,在 Models 目录中创建 Monkey 目录,则需要创建 Models.Monkey 包。

建完之后,分别把 DiffuseMap.png 和 monkey.j3o 文件放进去,结构是这样的。

Eclipse工程中的资产目录结构就是这样了。

验证效果

如果想要用Eclipse工程开发jME3程序的话,还需要添加 jme3 的jar文件。如果你用的是Windows系统,至少需要这么几个jar文件:

// {version} 代表具体的版本号,例如 3.1.0-stable
jme3-core-{version}.jar
jme3-desktop-{version}.jar
jme3-lwjgl-{version}.jar
lwjgl-2.9.3.jar
lwjgl-platform-2.9.3-natives-windows.jar

这些 jar 文件就是 jMonkeyEngine 的最小形态。如果你不知道怎么获得这些jar文件,请看 jME3简介 中“获取jME3”部分。

若已下载 jMonkeyEngine SDK ,还可以直接去 SDK 安装目录的 jmonkeyplatform/libs 文件夹下找到它们。

假设你已经获得了这些 jar 文件,在工程目录下创建 libs 文件夹,把这5个jar文件放进去。

注意,因为我这个工程是在Ubuntu系统上开发的,所以第5个jar用的是 lwjgl-platform-2.9.3-native-linux.jar

鼠标选中这5个jar文件,然后单击右键,在弹出菜单中选择 Build Path -> Add to build path。这样做将把它们添加到工程编译的classpath中,并且将显示在 Referenced Libraries中。

在 src 中创建 mygame.Main 类,作为运行入口。

Main.java 的内容和之前在SDK中写得一模一样,不需要做任何修改。

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;

/**
 * 测试加载j3o模型
 * @author yanmaoyuan
 */
public class Main extends SimpleApplication {

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // 加载j3o模型
        Spatial model = assetManager.loadModel("Models/Monkey/monkey.j3o");
        rootNode.attachChild(model);

        // 添加灯光
        DirectionalLight sun = new DirectionalLight();
        sun.setColor(new ColorRGBA(0.7f, 0.7f, 0.7f, 1f));
        sun.setDirection(new Vector3f(-3, -4, -5).normalizeLocal());
        rootNode.addLight(sun);

        AmbientLight ambient = new AmbientLight();
        ambient.setColor(new ColorRGBA(0.2f, 0.2f, 0.2f, 1f));
        rootNode.addLight(ambient);
    }

}

运行结果也是一模一样。

从现在开始,下面就不再重复运行Main类了,请读者自己验证。

IDEA

在Idea中创建一个Java工程。

根据你的喜好来为项目命名。我将工程命名为 HelloGame,包名为 mygame

生成工程后,将左侧导航切换成 Project 视图。

右键单击 HelloGame 工程名,在弹出菜单中选择 New -> Directory,输入文件夹的名称 assets,即可创建资源目录。

继续在 assets 中创建 InterfacesModelsTextures等目录,顺便把 monkey.j3oDiffuseMap.png 分别放到对应的目录中。

然后右键单击 assets 目录,在弹出菜单中选择 Mark Directory as -> Resources Root。这将把 assets 转化为 IDEA 工程的资源根目录。

IDEA中的资源目录结构就建好了。

验证效果

想要用IDEA开发JME3程序,同样需要添加一些jar文件。

创建 libs 文件夹,然后把5个最基本的jar文件拷贝进去。

选中这些jar文件,然后单击右键,在弹出菜单中选择 Add as Library..

在弹出对话框中输入Library的名字(Name),并选择应用级别(Level)。

我将这套库文件命名为 jme3-desktop,因为它们只适用于桌面开发;级别设为 Module Library,因为我只打算在 HelloGame 这个 module 中使用它。

剩下的事情就简单了。把前面写好的测试代码拷贝到 mygame.Main.java 中,然后编译运行程序,结果与在 SDK、Eclipse 中是一样的。

AndroidStudio

创建一个 Android 工程,按你的喜好来给App命名。我将应用命名为 HelloGame,包名为 mygame

Android Studio 创建的工程结构如下:

该工程默认是没有资源目录的,手动在 app/src/main 目录下创建一个 assets 目录。然后在 assets 目录中创建 InterfacesModelsTextures等目录,顺便把 monkey.j3oDiffuseMap.png 分别放到对应的目录中。

然后等待 Android 工程同步,它会自动识别 assets 目录。

这样 Android Studio 的资产目录结构就OK了。

验证效果

Android 项目至少需要3个jme3的jar文件,分别是:

jme3-core-{version}.jar
jme3-android-{version}.jar
jme3-android-native-{version}.jar

把这三个 jar 文件拷贝到Android项目的 app/libs 目录下。

然后编辑 app/build.gradle 脚本,在 dependencies 块中增加 compile fileTree(dir: 'libs', include: ['*.jar'])。同步工程后,Android工程就会识别 libs 目录下的 jar 文件。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // ..
}

创建 mygame.hellogame.Main 类,编写验证代码。除了没有 main 方法外,与前面的验证代码并没有什么区别。

package mygame.hellogame;

import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;

/**
 * 测试加载j3o模型
 * @author yanmaoyuan
 */
public class Main extends SimpleApplication {

    @Override
    public void simpleInitApp() {
        // 加载j3o模型
        Spatial model = assetManager.loadModel("Models/Monkey/monkey.j3o");
        rootNode.attachChild(model);

        // 添加灯光
        DirectionalLight sun = new DirectionalLight();
        sun.setColor(new ColorRGBA(0.7f, 0.7f, 0.7f, 1f));
        sun.setDirection(new Vector3f(-3, -4, -5).normalizeLocal());
        rootNode.addLight(sun);

        AmbientLight ambient = new AmbientLight();
        ambient.setColor(new ColorRGBA(0.2f, 0.2f, 0.2f, 1f));
        rootNode.addLight(ambient);
    }

}

修改 mygame.hellogame.MainActivity 类,使其继承 com.jme3.app.AndroidHarness 类,并在构造方法中设置程序的启动类为 mygame.hellogame.Main

package mygame.hellogame;

import android.app.Activity;
import android.os.Bundle;

import com.jme3.app.AndroidHarness;

public class MainActivity extends AndroidHarness {

    public MainActivity() {
        this.appClass = "mygame.hellogame.Main";
    }
}

编译项目,并在真机或模拟器中调试运行。下面是在我的手机上运行的效果。

Maven

Maven工程有其标准目录结构,你可以通过下面的文章了解详细内容。

Maven 工程已经定义了 resources 目录,用来管理项目中使用的资源文件。

  • src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
  • src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。

一般支持Maven的IDE都会自动创建这些目录。如果没有的话,手动创建 src/main/resources 目录即可。下图分别是 Eclipse 和 IDEA 中的Maven工程结构。

src/main/resources 就是资产文件的根目录。在其中创建子目录,并把资产文件放进去。

Maven工程中的资产目录就搞定了。

验证效果

Maven工程可以自动下载所需的依赖库。在 pom.xml 中添加如下脚本:

  • <repositories></repositories> 块中添加 jcenter 仓库
  • <dependencies></dependencies> 块中添加对 jme3-corejme3-desktopjme3-lwjgl 的依赖;
  • 为了方便引用,可以用 <properties> 把 jMonkeyEngine 的 groupIdversion 配置成变量。

代码如下:

<properties>
    <jme3_g>org.jmonkeyengine</jme3_g>
    <jme3_v>3.2.0-beta2</jme3_v>
</properties>

<repositories>
    <repository>
        <id>jcenter</id>
        <url>http://jcenter.bintray.com</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>${jme3_g}</groupId>
        <artifactId>jme3-core</artifactId>
        <version>${jme3_v}</version>
    </dependency>
    <dependency>
        <groupId>${jme3_g}</groupId>
        <artifactId>jme3-desktop</artifactId>
        <version>${jme3_v}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>${jme3_g}</groupId>
        <artifactId>jme3-lwjgl</artifactId>
        <version>${jme3_v}</version>
    </dependency>
</dependencies>

执行maven命令,就会自动下载这些 jar 文件。然后在 src/main/java 创建 mygame.Main 类,编写验证代码,最后编译运行即可。

运行截图就不贴了,都是一样的。

Gradle

Gradle 工程也有标准目录结构,与 Maven 是一模一样的,只不过 IDE 不会直接把这些文件夹全创建出来。一般来说,只需要用 src/main/java 来放源代码,用 src/main/resources 来放资源文件即可。

下图是 IDEA 中创建的 Gradle 工程。

src/main/resources 目录中创建资产目录结构,并把资产文件拷贝进去即可。

下图是 Eclipse 中创建的 Gradle 工程,它并没有自动创建 resources 目录。

手动在 src/main 目录下创建 resources 目录,并建立资产目录结构,再把资产文件拷贝到对应目录中。

鼠标右键单击 build.gradle 文件,在弹出菜单中选择 Gradle -> Refresh Gradle Project。这么做会让 Eclipse 刷新 Gradle 工程,识别刚才的改动。

Package Explorer 视图中,可以看到完整的资产目录结构。

验证结果

Gradle 与 Maven 一样,可以自动从远程仓库下载所需要的 jar 文件。

编辑 build.gradle 脚本,在 repositories 块中添加 jcenter() 仓库,并在 dependencies 块中添加对 jme3-corejme3-desktopjme3-lwjgl 的依赖。

apply plugin: 'java'

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    def jme3 = [g:'org.jmonkeyengine', v:'3.2.0-beta2']
    
    compile "$jme3.g:jme3-core:$jme3.v"
    compile "$jme3.g:jme3-desktop:$jme3.v"
    compile "$jme3.g:jme3-lwjgl:$jme3.v"

    testCompile 'junit:junit:4.12'
}

如果你想使用自己电脑上的jar文件,可以这么做:

  • 在工程目录下创建 libs 目录,然后把 jar 文件放进去;
  • build.gradledependencies 块中,添加一句 compile fileTree(dir: 'libs', include: ['*.jar'])

参考:

这两种方式都可以在 Gradle 工程中添加所需要的 jar 文件,前者是自动管理,后者是手动管理。配置好 build.gradle 文件后,刷新一下 Gradle 工程,让它下载或识别这些 jar 文件即可。

接着在 src/main/java 中创建 mygame.Main 类,编写验证代码,运行看结果吧。

代码和截图就不贴了,跟前面一模一样。