Libgdx : 将桌面 jar 文件 link 导出到外部路径而不是 jar root

Libgdx : Exported desktop jar file link to external path instead jar root

我正在尝试将我的 libgdx 应用程序部署到 jar 桌面文件中。我使用 Intellij,所以我构建了桌面模块,然后执行 ./gradlew desktop:dist 来生成 jar,一切顺利!我使用资产管理器来加载我的资产。现在,当我执行 jar 时,资产管理器尝试获取 jar 目录中的资产,而不是直接在 jar 文件中。

我的资产经理:

package com.com8.game.Utils;

import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.SkinLoader;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;


public class Assets {

public AssetManager manager = new AssetManager();

public static final AssetDescriptor<Texture> logo =
        new AssetDescriptor<Texture>("logo.png", Texture.class);

public static final AssetDescriptor<Texture> tableBack =
        new AssetDescriptor<Texture>("back.png", Texture.class);

public static final AssetDescriptor<Texture> frontBackground =
        new AssetDescriptor<Texture>("frontBackground.png", Texture.class);

public static final AssetDescriptor<Texture> backBackground =
        new AssetDescriptor<Texture>("backBackground.png", Texture.class);

public static final AssetDescriptor<TextureAtlas> uiAtlas =
        new AssetDescriptor<TextureAtlas>("UI/uiskin.atlas", TextureAtlas.class);

public static final AssetDescriptor<Skin> uiSkin =
        new AssetDescriptor<Skin>("UI/uiskin.json", Skin.class,
                new SkinLoader.SkinParameter("UI/uiskin.atlas"));

public static final AssetDescriptor<TextureAtlas> gameAtlas =
        new AssetDescriptor<TextureAtlas>("Atlas/gameImages.atlas", TextureAtlas.class);

public static final AssetDescriptor<TextureAtlas> flamesAnimation =
        new AssetDescriptor<TextureAtlas>("Atlas/flamesAnimation.atlas", TextureAtlas.class);

public static final AssetDescriptor<TextureAtlas> hitAnimation =
        new AssetDescriptor<TextureAtlas>("Atlas/hitAnimation.atlas", TextureAtlas.class);

public static final AssetDescriptor<TextureAtlas> shipExplosionAnimation =
        new AssetDescriptor<TextureAtlas>("Atlas/shipExplosionAnimation.atlas", TextureAtlas.class);

public static final AssetDescriptor<TextureAtlas> dustAnimation =
        new AssetDescriptor<TextureAtlas>("Atlas/dustAnimation.atlas", TextureAtlas.class);


public void load()
{
    manager.load(logo);
    manager.load(tableBack);
    manager.load(frontBackground);
    manager.load(backBackground);
    manager.load(uiAtlas);
    manager.load(uiSkin);
    manager.load(gameAtlas);
    manager.load(flamesAnimation);
    manager.load(hitAnimation);
    manager.load(shipExplosionAnimation);
    manager.load(dustAnimation);
}

public void dispose() {
    manager.dispose();
}
}

我的 build.gradle 桌面启动器: 应用插件:"java"

sourceCompatibility = 1.6
sourceSets.main.java.srcDirs = [ "src/" ]

project.ext.mainClassName = "com.com8.game.desktop.DesktopLauncher"
project.ext.assetsDir = new File("../core/assets");

task run(dependsOn: classes, type: JavaExec) {
    main = project.mainClassName
    classpath = sourceSets.main.runtimeClasspath
    standardInput = System.in
    workingDir = project.assetsDir
    ignoreExitValue = true
}

task debug(dependsOn: classes, type: JavaExec) {
    main = project.mainClassName
    classpath = sourceSets.main.runtimeClasspath
    standardInput = System.in
    workingDir = project.assetsDir
    ignoreExitValue = true
    debug = true
}

task dist(type: Jar) {
    from files(sourceSets.main.output.classesDir)
    from files(sourceSets.main.output.resourcesDir)
    from {configurations.compile.collect {zipTree(it)}}
    from files(project.assetsDir);

    manifest {
        attributes 'Main-Class': project.mainClassName
    }
}

dist.dependsOn classes

eclipse {
    project {
        name = appName + "-desktop"
        linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/core/assets'
    }
}

task afterEclipseImport(description: "Post processing after project 
generation", group: "IDE") {
  doLast {
    def classpath = new XmlParser().parse(file(".classpath"))
    new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]);
    def writer = new FileWriter(file(".classpath"))
    def printer = new XmlNodePrinter(new PrintWriter(writer))
    printer.setPreserveWhitespace(true)
    printer.print(classpath)
  }
}

有人可以帮助我吗? :) 谢谢

编辑: 我只是在每个路径名前面加了一个“/”,这样似乎更好! now i have this,文件logo.png在jar文件的根目录。

下面是我如何使用资产 class:

// Assets
private AssetManager manager;
private Stage stage;
private Skin skin;

// UI
private TextField userIDRegistered;
private TextField userPwd;
private TextField userIDGuest;
private Label authentificationResponse;
private Label socketConnectedMessage;

// Socket
private Socket socket;

public ConnexionScreen(Com8 game) {
    this.game = game;
    this.socket = game.getSocket();
    this.manager = game.assets.manager;

    skin = game.skin;

    stage = game.stage;
    stage.clear();

    configSocketEvents();
}

@Override
public void show() {
    //Create Table
    Table mainTable = new Table();

    //Set table position properties
    mainTable.align(Align.center|Align.center);
    mainTable.setFillParent(true);

    //Create image
    Texture logoTexture = manager.get("/logo.png", Texture.class);
    Image logoImage = new Image(logoTexture);

改变

project.ext.assetsDir = new File("../core/assets");

project.ext.assetsDir = new File("../android/assets");

在桌面模块的 build.gradle 文件中

然后 运行 ./gradlew desktop:dist

希望您的所有资源都在 android module 的 assets 文件夹中。

编辑

我测试过,它对我来说工作正常,发现你做错了什么。

create() 方法中的代码

AssetDescriptor<Texture> assetDescriptor=new AssetDescriptor<Texture>("brick.png",Texture.class);

AssetManager assetManager=new AssetManager();
assetManager.load(assetDescriptor);   // load by assetDescriptor
assetManager.load("badlogic.jpg", Texture.class);   // manual loading

assetManager.finishLoading();

texture=assetManager.get("badlogic.jpg",Texture.class);  // fetch data manually 
texture1=assetManager.get(assetDescriptor);              // fetch by descriptor

我用render()方法绘制这两个纹理

资源位于 assets 文件夹中的核心模块内。

然后我在桌面模块的 build.gradle 文件中分配资产目录,该文件也在 dist 任务

中使用

project.ext.assetsDir = new File("../core/assets");

运行 ./gradlew dist 终端命令。

我在桌面模块的构建文件夹中找到了我的 desktop-1.0.jar。复制并保存在其他文件夹中,双击 运行,工作正常。

两种资源(badlogic.jpgbrick.png)都在我的 .jar 根目录下。

我找到了问题,感谢@Abhishek Aryan! 我的资产描述符是静态的,在处理资产管理器时似乎没有什么可以是静态的。我像这样更改我的资产 class :

public class Assets {

public AssetManager manager;

public AssetDescriptor<Texture> logo;

public AssetDescriptor<Texture> tableBack;
public AssetDescriptor<Texture> frontBackground;

public AssetDescriptor<Texture> backBackground;

public AssetDescriptor<TextureAtlas> uiAtlas;

public AssetDescriptor<Skin> uiSkin;

public AssetDescriptor<TextureAtlas> gameAtlas;

public AssetDescriptor<TextureAtlas> flamesAnimation;

public AssetDescriptor<TextureAtlas> hitAnimation;

public AssetDescriptor<TextureAtlas> shipExplosionAnimation;

public AssetDescriptor<TextureAtlas> dustAnimation;

public Assets(){
    manager = new AssetManager();
    logo = new AssetDescriptor<Texture>("logo.png", Texture.class);
    tableBack = new AssetDescriptor<Texture>("back.png", Texture.class);
    frontBackground = new AssetDescriptor<Texture>("frontBackground.png", Texture.class);
    backBackground = new AssetDescriptor<Texture>("backBackground.png", Texture.class);
    uiAtlas = new AssetDescriptor<TextureAtlas>("UI/uiskin.atlas", TextureAtlas.class);
    uiSkin = new AssetDescriptor<Skin>("UI/uiskin.json", Skin.class,
            new SkinLoader.SkinParameter("UI/uiskin.atlas"));
    gameAtlas = new AssetDescriptor<TextureAtlas>("Atlas/gameImages.atlas", TextureAtlas.class);
    flamesAnimation = new AssetDescriptor<TextureAtlas>("Atlas/flamesAnimation.atlas", TextureAtlas.class);
    hitAnimation = new AssetDescriptor<TextureAtlas>("Atlas/hitAnimation.atlas", TextureAtlas.class);
    shipExplosionAnimation = new AssetDescriptor<TextureAtlas>("Atlas/shipExplosionAnimation.atlas", TextureAtlas.class);
    dustAnimation = new AssetDescriptor<TextureAtlas>("Atlas/dustAnimation.atlas", TextureAtlas.class);
}

public void load()
{
    manager.load(logo);
    manager.load(tableBack);
    manager.load(frontBackground);
    manager.load(backBackground);
    manager.load(uiAtlas);
    manager.load(uiSkin);
    manager.load(gameAtlas);
    manager.load(flamesAnimation);
    manager.load(hitAnimation);
    manager.load(shipExplosionAnimation);
    manager.load(dustAnimation);
}

public void dispose() {
    manager.dispose();
}
}

现在一切正常:)