2014-07-23 29 views
0

2天來,我一直在嘗試修復bug,在我的遊戲中有變得浮躁和變態的紋理。我在互聯網上進行了一些操作,我嘗試了一些解決方案,比如使用scene2d,但沒有奏效。我該怎麼辦 ?Java libgdx 1.20版本紋理bug

這張截圖顯示的問題:作爲角色移動,一隻眼睛有時比其他較大:

Screenshot

編輯:

我仍然有問題widthdistored眼睛,當我使用sprite.setPosition((int)sprite.getX(),(int)sprite.getY());每次我呈現我的角色之前。

當我從答案中使用自定義視口時,我在遊戲窗口上什麼也看不到我做錯了什麼?

package com.mygdx.redHoodie; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.utils.viewport.StretchViewport; 

public class GameScreen implements Screen { 
    public static final int GAME_WIDTH = 800; 
    public static final int GAME_HEIGHT= 480 ; 

    SpriteBatch batch; 
    Background background; 
    public Hoodie hoodie; 

    public PixelMultipleViewport viewport; 
     OrthographicCamera camera; 
    public int gameMode; // 0 normalna gra, 1 level up, 2 end game 

    public GameScreen(){ 
     camera= new OrthographicCamera(GAME_WIDTH,GAME_HEIGHT); 


     viewport = new PixelMultipleViewport(GAME_WIDTH, GAME_HEIGHT, camera); 
     viewport.update(); 
     camera.setToOrtho(false, GAME_WIDTH, GAME_HEIGHT); 
     batch = new SpriteBatch(); 

     //klasy wyswietlane 
     background= new Background(this); 
     hoodie = new Hoodie(this); 

     startNewGame(); 
    } 

    @Override 
    public void render(float delta) { 
     // TODO Auto-generated method stu 

     Gdx.gl.glClearColor(1, 1, 0, 1); 

     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     batch.setProjectionMatrix(camera.projection); 
      batch.setTransformMatrix(camera.view); 

     camera.update(); 
     //batch.setProjectionMatrix(camera.combined); 
     this.update(delta); 
     this.batch.begin(); 
      toRender(delta); 
     this.batch.end(); 



    } 

    public void update(float delta){ 
     hoodie.update(delta); 
    } 

    public void toRender(float delta){ 
     background.render(); 
     hoodie.render(); 

    } 

    public void startNewGame(){ 

    } 
    public void startNevLevel(){ 

    } 

    @Override 
    public void resize(int width, int height) { 
     // TODO Auto-generated method stub 
     viewport.update(width, height,false); 
    } 

    @Override 
    public void show() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void hide() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void pause() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void resume() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void dispose() { 
     // TODO Auto-generated method stub 

    } 

} 
+0

如果不知道你是如何加載你的紋理的話,很難想象。你能爲此提供代碼嗎?這可能導致了一個錯誤,或者你以一種意想不到的方式使用這些紋理。從看libgdx社區論壇看,這似乎不是一個普遍的問題,因爲那裏沒有人抱怨過它。 – Tenfour04

+0

我有這個bug,當我做項目相同,在這個教程http://theinvader360.blogspot.co.uk/2013/05/street-race-swipe-libgdx-scene2d.html,但也當我複製粘貼解決方案從這個stackoverflow問題:http://stackoverflow.com/questions/18997013/sprite-flicker-while-moving-libgdx – peterSweter

+0

也許你可以更詳細地描述你的意思是閃爍和扭曲,因爲這些術語意味着不同的東西不同的人。例如,你剛剛鏈接的另一個問題似乎與從一個位置跳到另一個位置的精靈有關,這不是我所稱的閃爍。 – Tenfour04

回答

2

加載你的紋理時,使用線性過濾和mip-mapping。默認過濾器是最近/最近的,這會導致您遇到的問題。

Texture myTexture = new Texture("textureFilename", true); //must enable mip-mapping in constructor 
myTexture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear); 

編輯:

我現在認識到,在看你的截圖,你是在一個更大的窗口做像素化圖形。爲了做到這一點,是的,你需要保持最近/最近的過濾,而不是我建議的。

爲避免某些像素大小不同,您必須將角色移動和攝像機移動到最近的世界單位。當你的角色處於像素之間時,精靈像素的大小會變化,因爲它們不與屏幕像素對齊。

你有你的世界縮放,所以一個單位等於你的一個大像素。因此,無論什麼時候繪製任何東西,都需要先將其位置繞到x和y中最接近的整數,以及相機位置。移動相機或精靈後,您必須做這樣的事情:

sprite.position.set((int)sprite.position.x,(int)sprite.position.y,sprite.position.z); 

至於你的視口去,如果你不希望任何黑邊,你可能需要一個自定義的視口類試圖儘可能接近你想要的分辨率,然後向外擴展以避免失真。 ExtendViewport做了類似的工作,但與像素化圖形的區別在於,您需要將世界分辨率設置爲屏幕分辨率的整數倍,以便像素邊緣看起來更清晰而不是模糊。

我認爲這會做你想做的。它會將所需的屏幕分辨率縮小並將其縮小到適合屏幕像素中每個像素的大小爲整數的位置。然後它將視圖擴展到超出所需的分辨率,以避免失真和黑條。這個班級假定所有的屏幕尺寸都是4的倍數。我認爲這是真的。如果你想變得很花哨,你可以使用OpenGL剪刀將視口大小舍入到最接近的4的倍數,以保證安全。至多你會有2個像素的黑條,我不認爲這是明顯的。

public class PixelMultipleViewport extends Viewport { 

    private int minWorldWidth, minWorldHeight; 

    public PixelMultipleViewport (int minWorldWidth, int minWorldHeight, Camera camera) { 
     this.minWorldHeight = minWorldHeight; 
     this.minWorldWidth = minWorldWidth; 
     this.camera = camera; 
    } 

    @Override 
    public void update (int screenWidth, int screenHeight, boolean centerCamera) { 

     viewportWidth = screenWidth; 
     viewportHeight = screenHeight; 

     int maxHorizontalMultiple = screenWidth/minWorldWidth; 
     int maxVerticalMultiple = screenHeight/minWorldHeight; 

     int pixelSize = Math.min(maxHorizontalMultiple, maxVerticalMultiple); 

     worldWidth = (float)screenWidth/(float)pixelSize; 
     worldHeight = (float)screenHeight/(float)pixelSize; 

     super.update(screenWidth, screenHeight, centerCamera); 
    } 
} 
+0

有了這個紋理過濾器更好,但現在眼睛看起來像behinnd霧。 http://snag.gy/2hBqV.jpg – peterSweter

+0

我剛剛檢查過,我仍然在拉伸視口中遇到同樣的問題。 – peterSweter

+0

當我使用FitViewport更好。反正有沒有黑色的酒吧,沒有任何異常的紋理? – peterSweter

0

這是我剛纔遇到的一個不同的選項。這是一種在任何分辨率下以不帶黑條的比例繪製場景的方法。

視覺質量會比我的其他答案(您以所需場景比例的整數倍繪製)稍差,但比使用屏幕截圖中的直接最近過濾要好得多。

的基本思想是繪製一切你想要的規模小的幀緩衝,然後使用倍增着色器(不同於線性過濾)僅沿精靈的邊緣插值像素顏色繪製幀緩衝的顏色紋理屏幕像素。

解釋is here。我沒有將這個移植到Libgdx或測試它。我不確定這款着色器在移動設備上運行的效果如何。它涉及每個屏幕片段運行四個依賴紋理查找。