2013-02-03 145 views
2

我應該如何關注目錄結構以及要指定的內容,以便assetManger將使用該文件夾作爲不同的分辨率。支持libgdx的多圖像分辨率

我研究了assetManagerResolutionFileResolver,但直到現在我還不能準確地知道如何指定文件夾來支持不同的分辨率。

回答

4

更新:Libgdx的較新版本使用不同的策略來解決文件名(帶目錄,而不是文件),所以經過這個答案並不適用於較新版本的Libgdx

(0.9.2,我認爲 https://github.com/libgdx/libgdx/commit/3afcfe49c40196765033a90b4610159183dde981?)

內置的ResolutionFileResolver不使用目錄層次結構。它使用文件後綴將屏幕分辨率與資產相匹配。

下面是來自libGDX AssetManagerTest代碼:

Resolution[] resolutions = { new Resolution(320, 480, ".320480"), 
          new Resolution(480, 800, ".480800"), 
          new Resolution(480, 856, ".480854") }; 
ResolutionFileResolver resolver = new ResolutionFileResolver(new InternalFileHandleResolver(), resolutions); 
AssetManager manager = new AssetManager(); 
manager.setLoader(Texture.class, new TextureLoader(resolver)); 
... 

解析器附加基於當前的屏幕分辨率的後綴之一。因此,例如,如果您在480x800設備上查找「foo.jpg」,則會打開文件「foo.jpg.480800」。

如果你想解決基於目錄的文件(所以「foo.jpg」將被解析爲「480x800/foo.jpg」或類似的東西),你可以編寫一個新的解析器。只需執行FileHandleResolverResolutionFileResolver.java來源可能是一個很好的開始。

+0

感謝您的幫助....再次我迷惑.. bcoz我使用TexurePacker包裝圖像...和任何分辨率我打包..它將包裝他們所有相同的分辨率.. –

+0

是的。您可能需要TexturePacker來生成不同的分辨率地圖集(我不確定這是否是libGDX紋理打包器中的選項),或者將不同的分辨率紋理打包到單個地圖集中(我認爲這不是TexturePacker自動支持的東西)。我建議再問一個關於多分辨率圖像和紋理圖集的SO問題。 –

+2

行爲已更改。檢查http://stackoverflow.com/questions/19915535/libgdx-resolutionfileresolver-assetmanager-file-names – noone

0

如果您使用OrthographicCamera,則不需要處理不同的圖像分辨率。

假設您有一臺尺寸爲400x300的相機。然後在座標(0,0)處繪製一張400x300的大圖。然後,不管屏幕分辨率如何,圖像將被縮放以填滿屏幕。這對Android來說非常簡潔,屏幕分辨率在不同設備之間可能會有很大差異,而像這樣做,您不必考慮這一點。

2

一旦我也遇到了這個問題,但最終我得到了工作解決方案,用於在libgdx中使用SpriteBatch或Stage繪製任何東西。使用正交相機我們可以做到這一點。

首先選擇一個最適合遊戲的恆定分辨率。在這裏,我採取了1280 * 720(風景)。

class ScreenTest implements Screen{ 
 
    
 
final float appWidth = 1280, screenWidth = Gdx.graphics.getWidth(); 
 
final float appHeight = 720, screenHeight = Gdx.graphics.getHeight(); 
 

 
OrthographicCamera camera; 
 

 
SpriteBatch batch; 
 
Stage stage; 
 

 
Texture img1; 
 
Image img2; 
 

 
public ScreenTest(){ 
 
    \t \t camera = new OrthographicCamera(); 
 
\t \t camera.setToOrtho(false, appWidth, appHeight); 
 
    \t \t 
 
     batch = new SpriteBatch(); 
 
    \t \t batch.setProjectionMatrix(camera.combined); 
 
    \t \t \t 
 
     img1 = new Texture("your_image1.png"); 
 
    \t \t img2 = new Image(new Texture("your_image2.png")); 
 
    \t \t img2.setPosition(0, 0); // drawing from (0,0) 
 
    \t 
 
     stage = new Stage(new StretchViewport(appWidth, appHeight, camera)); 
 
     stage.addActor(img2); 
 
    } 
 
    
 
    @Override 
 
\t public void render(float delta) { 
 
\t  batch.begin(); 
 
\t \t batch.draw(img, 0, 0); 
 
\t \t batch.end(); 
 

 
\t \t stage.act(); 
 
\t \t stage.act(delta); 
 
\t \t stage.draw(); 
 
\t \t 
 
\t \t // Also You can get touch input according to your Screen. 
 
\t \t 
 
\t \t if (Gdx.input.isTouched()) { 
 
\t \t System.out.println(" X " + Gdx.input.getX() * (appWidth/screenWidth)); 
 
\t \t System.out.println(" Y " + Gdx.input.getY() * (appHeight/screenHeight)); 
 
\t } 
 
\t  
 
\t } 
 
    // 
 
    : 
 
    : 
 
    // 
 
}

運行這段代碼在任何類型的分辨率將要在沒有任何干擾這一決議進行調整。

+0

感謝您的答案,它爲我工作 – ManishSB