Can't draw a ninepatch image and stage at the same time

本小妞迷上赌 提交于 2020-01-24 13:19:08

问题


Whenever I try to draw a ninepatch image and a stage the last thing that's called is being drawn. I have tried to use a orthographic camera but didn't succeed. What I have tried:

batch.setProjectionMatrix(camera.combined);
ninePatch.draw(batch, xPos, yPos, width, height);
stage.act(delta);
stage.draw();

camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
stage.setCamera(camera)

EDIT: The code

The CreateQuiz class

public class CreateQuiz implements Screen{

    public CreateQuiz(Quiz quiz){
    this.quiz = quiz;
    }

    private Quiz quiz;
    private FallDownPanel fallDownPanel;
    private OrthographicCamera camera;

    @Override
    public void render(float delta) {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    quiz.beginBatch();
    fallDownPanel.render(quiz.getSpriteBatch(), delta);
    quiz.endBatch();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void show() {
    fallDownPanel = new FallDownPanel(FallDownPanel.START_LOWER_SIDE, 200, quiz.getTextureAtlas().createPatch("fallDownWindow"));
    Stage stage = new Stage(fallDownPanel.getWidth(), fallDownPanel.getHeight(), false);
    TextFieldStyle style = quiz.getGreenTextFieldStyle();
    style.font.scale(-0.30f);
    TextFieldQuiz test = new TextFieldQuiz("Hej åäö 123 !", style, 0, 2, 400, 16);
    test.setTextFieldListener(new TextFieldListener() {
        @Override
        public void keyTyped (TextField textField, char key) {
        if (key == '\n') {
            textField.getOnscreenKeyboard().show(false);
        }
        }
    });
    stage.addActor(test);
    Gdx.input.setInputProcessor(stage);
    fallDownPanel.setStage(stage);
    camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    stage.setCamera(camera);
    fallDownPanel.setCamera(camera);
    }

    @Override
    public void hide() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void dispose() {

    }

}

The FallDownPanel.class

    public class FallDownPanel {

    //With repeat
    public FallDownPanel(int startSide, int size, NinePatch ninePatch){
    Tween.registerAccessor(FallDownPanel.class, new FallDownPanelTween());
    Tween.registerAccessor(Widget.class, new WidgetTween());
    tweenManager = new TweenManager();
    final int screenWidth = Gdx.graphics.getWidth();
    final int screenHeight = Gdx.graphics.getHeight();
    int target = 0;
    int tweenType = 0;

    if(startSide == START_LEFT_SIDE){
        setSize(size, screenHeight);
        xPos = -size;
        yPos = 0;
        target = 0;
        tweenType = FallDownPanelTween.POSITION_X;
    }

    else if(startSide == START_RIGHT_SIDE){
        setSize(size, screenHeight);
        xPos = screenWidth;
        yPos = 0;
        target = screenWidth - size;
        tweenType = FallDownPanelTween.POSITION_X;
    }

    else if(startSide == START_UPPER_SIDE){
        setSize(screenWidth, size);
        xPos = 0;
        yPos = screenHeight + size;
        target = screenHeight - size;
        tweenType = FallDownPanelTween.POSITION_Y;
    }

    else if(startSide == START_LOWER_SIDE){
        setSize(screenWidth, size);
        xPos = 0;
        yPos = -size;
        target = 0;
        tweenType = FallDownPanelTween.POSITION_Y;
    }

    Tween.to(this, tweenType, 1).target(target).start(tweenManager);
    this.tweenType = tweenType;
    this.startSide = startSide;

    this.ninePatch = ninePatch;
    }

    private TweenManager tweenManager;
    private NinePatch ninePatch;
    private Stage stage;
    private OrthographicCamera camera;

    private float xPos, yPos;
    private int width, height;
    private int tweenType;
    private int startSide;
    public static final int START_LEFT_SIDE = 0, START_RIGHT_SIDE = 1, START_UPPER_SIDE = 2, START_LOWER_SIDE = 3;

    public void render(SpriteBatch batch, float delta){
    tweenManager.update(delta);
    batch.setProjectionMatrix(camera.combined);
    ninePatch.draw(batch, xPos, yPos, width, height);
    stage.act(delta);
    stage.draw();
    }

    public void setX(float x){
    this.xPos = x;
    }

    public void setY(float y){
    this.yPos = y;
    }

    public float getX(){
    return xPos;
    }

    public float getY(){
    return yPos;
    }

    public float getWidth(){
    return width;
    }

    public float getHeight(){
    return height;
    }

    private void setSize(int w, int h){
    width = w;
    height = h;
    }

    public Stage getStage() {
    return stage;
    }

    public void setStage(Stage stage) {
    this.stage = stage;
    startWidgetTweens();
    }

    private void startWidgetTweens(){
    float size = getShortestSide();
    Array<Actor> actors = stage.getActors();
    for(int i = 0; i < actors.size; i++){
        Widget w = (Widget) actors.get(i);
        Tween.to(w, tweenType, 1).target(0).start(tweenManager);
    }
    }

    private float getShortestSide() {
    if(startSide == START_LEFT_SIDE){
        return width;
    }

    else if(startSide == START_RIGHT_SIDE){
        return width;
    }

    else if(startSide == START_UPPER_SIDE){
        return height;
    }

    else if(startSide == START_LOWER_SIDE){
        return height;
    }

    return -1;
    }

    public void setCamera(OrthographicCamera camera) {
    this.camera = camera;
    }

}

回答1:


Always make sure you have only one active Renderer at a time. The Renderers are:

  • Batch
  • SpriteBatch
  • ShapeRenderer
  • Box2DDebugRenderer if i am not wrong
  • ModelBatch for 3D

I hope i did not forget one.
Make sure you always call end() for the active one, before calling begin() for a new one.
Also remember, that a Stage has its own SpriteBatch and it calls begin() for this SpriteBatch, if you call stage.draw(). So make sure you end() the active Renderer, before stage.draw().
If you need a ShapeRenderer or any other renderer to draw an Actor (maybe cause of debuging), you have to end the stages SpriteBatch, which you get with the draw() method. Make sure you begin() it again at the end of the method.
Hope this is clear enough.



来源:https://stackoverflow.com/questions/21318030/cant-draw-a-ninepatch-image-and-stage-at-the-same-time

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!