2016-03-07 197 views
0

最近我開始使用Libgdx開發,我遇到了一個我可以解決的問題。我想從Scene2d渲染一個Image對象到屏幕上,但是它沒有渲染任何東西。這只是顯示一個空白的屏幕。在Libgdx中渲染圖像

這裏是我的skin.json文件:

{ 

com.badlogic.gdx.scenes.scene2d.ui.Image: { 
    logo: { drawable: logo } 
    exit: { drawable: exit } 
}, 
com.badlogic.gdx.graphics.Color: { 
    green: { a: 1, b: 0, g: 1, r: 0 }, 
    white: { a: 1, b: 1, g: 1, r: 1 }, 
    red: { a: 1, b: 0, g: 0, r: 1 }, 
    black: { a: 1, b: 0, g: 0, r: 0 }, 
}, 

} 

這裏是我的skin.atlas文件:

skin.png 
format: RGBA8888 
filter: Nearest,Nearest 
repeat: none 
logo 
    rotate: false 
    xy: 1, 1 
    size: 384, 93 
    orig: 384, 93 
    offset: 0, 0 
    index: -1 
help 
    rotate: false 
    xy: 387, 30 
    size: 65, 64 
    orig: 65, 64 
    offset: 0, 0 
    index: -1 
musicoff 
    rotate: false 
    xy: 454, 30 
    size: 65, 64 
    orig: 65, 64 
    offset: 0, 0 
    index: -1 
musicon 
    rotate: false 
    xy: 521, 30 
    size: 65, 64 
    orig: 65, 64 
    offset: 0, 0 
    index: -1 
exit 
    rotate: false 
    xy: 588, 30 
    size: 64, 64 
    orig: 64, 64 
    offset: 0, 0 
    index: -1 
settings 
    rotate: false 
    xy: 654, 30 
    size: 64, 64 
    orig: 64, 64 
    offset: 0, 0 
    index: -1 

ScreenWrapper類:

package screens; 

import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.utils.viewport.StretchViewport; 

import engine.Values; 

import com.badlogic.gdx.scenes.scene2d.Stage; 

public abstract class ScreenWrapper extends Stage implements Screen{ 

    protected ScreenManager manager; 
    public ScreenWrapper(ScreenManager manager) { 
     super(new StretchViewport(Values.WIDTH, Values.HEIGHT, new OrthographicCamera())); 
     this.manager = manager; 
    } 

    // All the actors will be added here 
    public abstract void initiate(); 
    public abstract void buildStage(); 
    @Override 
    public void show() { 

    } 
    @Override 
    public void render(float delta) { 
     act(); 
     draw(); 
    } 
    @Override 
    public void resize(int width, int height) { 
     setViewport(new StretchViewport(Values.WIDTH, Values.HEIGHT)); 
    } 
    @Override 
    public void pause() { 

    } 
    @Override 
    public void resume() { 

    } 
    @Override 
    public void hide() { 

    } 
} 

,這裏是我的主文件:

package screens; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.scenes.scene2d.ui.Image; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 

import engine.Values; 

public class MenuScreen extends ScreenWrapper{ 

    private ScreenRenderer renderer; 
    public MenuScreen(ScreenManager manager) { 
     super(manager); 
     renderer = new ScreenRenderer(); 
    } 

    @Override 
    public void initiate() { 
     manager.getLoader().load("skin.json", Skin.class); 
    } 
    @Override 
    public void buildStage() { 
     Skin skin = manager.getLoader().getAsset("skin.json", Skin.class); 
     Image logo = new Image(skin.getDrawable("logo")); 
     logo.setSize(Values.LOGO_WIDTH, Values.LOGO_HEIGHT); 
     logo.setOrigin(logo.getX() + Values.LOGO_WIDTH/2, logo.getY() 
       + Values.LOGO_HEIGHT/2); 
     logo.setPosition(Values.WIDTH/2 - Values.LOGO_WIDTH/2, 
       Values.HEIGHT); 
     addActor(logo); 
     Gdx.app.log("X and Y", "X : " + logo.getX() + ", Y : "+logo.getY()); 
     Gdx.app.log("Width and Height", "Width : " + logo.getWidth() + ", Height : " + Values.HEIGHT); 
    } 

    @Override 
    public void render(float delta) { 
     super.render(delta); 
     Gdx.gl.glClearColor(242/255f, 242/255f, 242/255f, 0); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    } 

} 

我在做什麼錯?

編輯:好的我縮小了問題到我的JSON文件。它看起來像我沒有正確地宣佈徽標元素。我如何在JSON中聲明圖像元素?

編輯2:我試圖改變JSON文件到這一點:

{ 

com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { 
    logo: { imageUp: logo, imageDown: logo } 
}, 
com.badlogic.gdx.graphics.Color: { 
    green: { a: 1, b: 0, g: 1, r: 0 }, 
    white: { a: 1, b: 1, g: 1, r: 1 }, 
    red: { a: 1, b: 0, g: 0, r: 1 }, 
    black: { a: 1, b: 0, g: 0, r: 0 }, 
}, 

} 

但它仍然無法正常工作......

編輯3:我試圖加載剛剛的PNG文件將徽標作爲紋理對象標識到徽標actor中,但它仍不會繪製任何東西。我是這樣做的:pastebin.com/n6iB2ymD

解決方法:好吧,我終於明白了這一點。原來Values.Logo_Width和Values.Logo_Height是0,因此圖像的大小被設置爲0 ...

+0

請顯示ScreenWrapper類。它是否已經在舞臺上調用'act'和'draw'? – Tenfour04

+0

我添加了ScreenWrapper類 –

回答

0

MenuScreen a Stage?代碼中不太清楚。如果是的話,你需要調用添加到在render方法actdraw方法:

@Override 
public void render(float delta) { 
    super.render(delta); 
    Gdx.gl.glClearColor(242/255f, 242/255f, 242/255f, 0); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    act(); 
    draw(); 
} 

這些方法繪製Actors添加到舞臺上。

+0

它不起作用......也許它與json文件有關?我是否正確地在JSON文件中聲明徽標元素? –

0

您需要確保在繪圖之前清除屏幕,而不是之後。

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(242/255f, 242/255f, 242/255f, 0); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    super.render(delta); 
} 

此外,要設置你的階段新視窗而沒有更新,所以視不知道屏幕的大小。在ScreenWrapper中更改resize方法是這樣的:

@Override 
public void resize(int width, int height) { 
    getViewport().update(width, height); 
} 
+0

我在我的ScreenWrapper類中調用了這些方法。我將代碼上傳到了這篇文章。它看起來像我沒有正確地宣佈徽標元素。我如何在JSON中聲明圖像元素? –

+0

圖像不需要在JSON中聲明。使用與地圖集中的區域名稱匹配的可繪製名稱來實例化圖像。你已經做得正確。你是否修正了調用'glClear'和'super.render()'的順序? – Tenfour04

+0

上面顯示的代碼不會繪製任何東西,因爲您在繪製舞臺後清除屏幕。 – Tenfour04