2012-03-27 48 views
10

我正在使用libgdx構建一個小型的Android遊戲。 現在我在桌面項目文件夾和Android項目文件夾中有一個遊戲資源的副本。由於一些奇怪的原因,我必須在兩個版本中分別訪問這些文件。在桌面和設備版本之間管理資產libgdx

這個工作在桌面應用程序很好,但給我的Android應用程序一個FileNotFound例外:

Texture texture = new Texture(Gdx.files.internal("assets/someImage.png")); 

如果我從文件名中去掉「資產」這一輪的其他方式(Android版,桌面崩潰):

Texture texture = new Texture(Gdx.files.internal("someImage.png")); 

我不確定是什麼問題。這兩個項目的文件夾結構完全相同...... 使用libgdx的正確方法是什麼?

回答

10

您應該將所有資產存儲在Android資產文件夾中,並將桌面項目鏈接到該文件夾​​。這裏有一個簡短的說明http://www.badlogicgames.com/wordpress/?p=1537

編輯:官方的Project Setup教程介紹瞭如何執行此操作。它被發現在http://code.google.com/p/libgdx/wiki/ProjectSetup#Asset_folder_setup

除了項目設置,我相信你的第二種方法是從兩個項目引用資產的正確方法。修復安裝後,它應該在兩種環境中都能正常工作。

0

檢查是否所有的文件都在Android的資產文件夾

0

引用了android資產的文件夾是不是一個很好的主意較低的情況下,這是因爲:

1)Eclipse將probly採取複製您參考資產文件夾到Android項目的apk,重複大小 2)路徑應該是平臺不可知論的。正如我所看到的,這是一個JogFiles實現問題。

你最好的folloing類複製到類路徑:

package com.badlogic.gdx.backends.jogl; /******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.backends.jogl; import java.io.File; import com.badlogic.gdx.Files; import com.badlogic.gdx.files.FileHandle; /** * Gdx class overrided in order to keep internal files paths platform independent. * Android search at "assets/" folder. And so we do here for jogl. */ final class JoglFiles implements Files { private static final String ASSETS_FOLDER = "assets"; private final String externalPath = System.getProperty("user.home") + "/"; @Override public FileHandle getFileHandle (String fileName, FileType type) { return new JoglFileHandle(fileName, type); } @Override public FileHandle classpath (String path) { return new JoglFileHandle(path, FileType.Classpath); } @Override public FileHandle internal (String path) { // append "asset/" prefix to those urls who did not already have it. if (!path.startsWith(ASSETS_FOLDER)) { path = ASSETS_FOLDER + File.separator + path; } return new JoglFileHandle(path, FileType.Internal); } @Override public FileHandle external (String path) { return new JoglFileHandle(path, FileType.External); } @Override public FileHandle absolute (String path) { return new JoglFileHandle(path, FileType.Absolute); } @Override public String getExternalStoragePath() { return externalPath; } @Override public boolean isExternalStorageAvailable() { return true; } }

1

libGDX維基提取物:

資產文件夾設置
而Android項目的子文件夾命名爲assets ,它是自動創建的。 Android應用程序可用的文件必須放在這裏。這是有問題的,因爲這些相同的文件必須可用於桌面應用程序。而不是保持所有文件的兩個副本,桌面項目可以配置爲發現在Android項目的資產:

單擊Source選項卡,單擊Link SourceBrowse,從您的Android項目中選擇「資產」文件夾,點擊確定
指定文件夾名稱的「assets」並單擊Finish then OK

注意:如果您的桌面和Android項目位於同一父文件夾中,則可以使用「PARENT-1-PROJECT_LOC/gamename-android/assets」作爲鏈接資產文件夾的位置,其中「gamename-android」爲您的Android項目的名稱。如果您計劃與他人分享您的項目,這比硬編碼路徑要好。

3

經過大量的實驗,我發現一個方法來得到這個工作:

爲Android模塊,Gdx.files.internal根植於android的資產文件夾。 對於桌面模塊,Gdx.files.internal植根於頂層項目文件夾。

因此,如果您將Android資產文件夾中的文件或目錄的符號鏈接置於頂層項目文件夾下(即與android,core,desktop等平行),那麼Gdx.files.internal將適用於兩者。

% cd project 
% ln -s android/assets/sound sound 
% ln -s android/assets/images images 

獎金提示 - 如果使用的是Windows,你可以在CMD外殼使用mklink命令來創建這些:

mklink /d sound d:\project\android\assets\sound 
mklink /d images d:\project\android\assets\images 

(注意:Windows不能在符號鏈接處理相對路徑還你。必須以管理員身份運行cmd)

確保在同時運行時同步文件。

+0

這是最簡單的方式,像一個魅力,而不是IDE具體 – Lyoneel 2014-10-26 18:35:05

7

資產桌面項目的文件夾,也可以選擇與搖籃 - 加入這一行build.gradledesktop文件夾:

sourceSets.main.resources.srcDirs = [ "../android/assets/" ] 

或者,如果你沒有生成Android項目:

sourceSets.main.resources.srcDirs = [ "../core/assets/" ] 

這應該在運行eclipse/idea Gradle任務時正確鏈接Eclipse和IntelliJ中的文件夾。與創建鏈接或手動將文件夾添加到源代碼相比,我認爲這是迄今爲止最容易設置和管理的。

+3

這樣做。這應該是被接受的答案。謝謝! – 2016-02-18 16:08:54

+0

不知道爲什麼這個解決方案沒有在libgdx官方網站上描述,因爲它是最乾淨的解決方案... – 2017-05-09 11:12:11