2016-03-07 3 views
0

Недавно я начал работать с Libgdx, и я столкнулся с проблемой, которую я могу решить. Я хочу сделать объект Image из Scene2d на экран, но он ничего не отображает. Это просто показывает пустой экран.Рендеринг изображения в 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); 
    } 

} 

Что я делаю неправильно?

EDIT: Хорошо, я сузил проблему в своем файле JSON. Похоже, я не декларирую элемент логотипа правильно. Как объявить элементы изображения в JSON?

EDIT 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 }, 
}, 

} 

Но она по-прежнему не работает ...

EDIT 3: Я пытался загрузить только .png файл логотип в логотип, как объект Texture, но он все равно ничего не рисует. Я сделал это вот так: pastebin.com/n6iB2ymD

РЕШЕНИЕ: Хорошо, я наконец понял это. Получается Values.Logo_Width и Values.Logo_Height были 0, поэтому размер изображения был установлен равным 0 ...

+0

Просьба показать класс ScreenWrapper. Он уже называет «act» и «draw» на сцене? – Tenfour04

+0

Я добавил класс ScreenWrapper –

ответ

0

MenuScreen a Stage? Это не так ясно из кода. Если да, то вам нужно добавить вызовы к act и draw методов в методе render:

@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); 
} 

Кроме того, вы устанавливаете новый видовой экран на вашей сцене никогда не обновляя его, так что окно просмотра не знает размер экрана. Измените свой метод resize в ScreenWrapper следующим образом:

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

Я вызываю эти методы в своем классе ScreenWrapper. Я загрузил код на этот пост. Похоже, я не декларирую элемент логотипа правильно. Как объявить элементы изображения в JSON? –

+0

Изображения не должны быть объявлены в JSON. Создайте образ изображения, используя имя, которое соответствует имени региона в вашем атласе. Вы уже сделали это правильно. Вы исправили порядок вызова 'glClear' и' super.render() '? – Tenfour04

+0

Ваш код, как показано выше, ничего не рисует, потому что вы очищаете экран после рисования сцены. – Tenfour04