我试图将我的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();
}
}
desktopLauncher的build.gradle: apply plugin:&#34; java&#34;
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)
}
}
有人可以帮帮我吗? :)谢谢
编辑: 我刚刚添加了一个&#34; /&#34;在每个路径名称前面,它似乎更好! now i have this,文件logo.png位于jar文件的根目录中。
以下是我如何使用Assets类:
// 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);
答案 0 :(得分:0)
更改
project.ext.assetsDir = new File("../core/assets");
到
project.ext.assetsDir = new File("../android/assets");
在桌面模块的build.gradle
文件中
然后运行./gradlew desktop:dist
希望您的所有资源都在android module
的资源文件夹中。
修改强>
我测试过,它对我来说很好,找到你做错了什么。
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.jpg
和brick.png
)都位于我的.jar
顶级根域。
答案 1 :(得分:0)
我找到了问题,感谢@Abhishek Aryan! 我的资产描述符是静态的,在处理资产管理器时似乎没有什么是静态的。我像这样更改我的Assets类:
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();
}
}
现在一切都运转良好:)