没有调用libGDX actor draw()

时间:2014-10-28 19:35:02

标签: java android libgdx actor stage

请原谅我的英语。

开始探索libGDX并遇到问题。当我在舞台上添加actor时,没有调用方法draw()。 试图应用该方法绘制一条直线,纹理成功绘制但它不是一个演员,这种方法不正确。

请帮助。

SpiderHunt.java

package com.spiderhunt;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.spiderhunt.screens.MainMenu;

    public class SpiderHunt extends Game{   
        private SpriteBatch batch; 
        public MainMenu mainMenu;

        private static SpiderHunt instance = new SpiderHunt();

        public SpiderHunt(){

        }

        public static SpiderHunt getInstance() {
            return instance;
        }

        public void create () {     

            //load textures
            Assets.load();

            batch = new SpriteBatch();

            mainMenu = new MainMenu(batch);
            this.setScreen(mainMenu);
        }

        public void showMainMenu(){     
            setScreen(mainMenu);
        }

        public void render (float delta) {

        }

        public void resize(int width, int height) {

        }

        public void pause() {

        }

        public void resume() {

        }

        public void dispose() {

        }   
    }

MainMenu.java

package com.spiderhunt.screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.StretchViewport;
import com.spiderhunt.Assets;
import com.spiderhunt.buttons.btnPlay;

public class MainMenu implements Screen {

    public btnPlay playButton;
    public Stage stage; 
    public SpriteBatch batch;    

    class GoToGameListener extends ClickListener {
        @Override
        public void clicked(InputEvent event, float x, float y) {
            //some code for click or push
        }
    }

    public MainMenu(SpriteBatch batch_1) {
        batch = batch_1;

        stage = new Stage(new StretchViewport( Gdx.graphics.getWidth(), Gdx.graphics.getHeight()), batch);  
        Gdx.input.setInputProcessor(stage);

        playButton = new btnPlay(); //make actor  

        stage.addActor(playButton);     
    }       

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        //make background
        batch.begin();          
        batch.draw(Assets.bgMenuRegion, 0, 0, 540, 960);
        batch.end();

        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw(); //this action must do method draw() from actor but it not called !!!!!!!!!!

        //batch.begin();
        //playButton.draw(batch, 0); THIS CODE DRAW BUTTON, BUT IT NOT CORRECTLY ACTOR
        //batch.end();
    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

     @Override
    public void show() {
        Gdx.input.setInputProcessor(stage);
    }   

    @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

    }

}

btnPlay.java

package com.spiderhunt.buttons;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.spiderhunt.Assets;


public class btnPlay extends Actor {

    public btnPlay(){
        setSize(100, 40);
        setPosition(100, 100);
    }

    public void draw(SpriteBatch batch, float parentAlpha) {    
        //!!!!!!!!!!!!!!!Error in this place. Draw() not called from stage
        batch.setColor(getColor());        
        batch.draw(Assets.btnPlayRegion, 0, 0);
    }
}

Assets.java

package com.spiderhunt;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

public class Assets {
    public static Texture atlas;    
//backgrounds
    public static TextureRegion bgMenuRegion;
    public static TextureRegion bgSelectLevelRegion;
//buttons
    public static TextureRegion btnPlayRegion;
//objects
    public static TextureRegion objFlyRegion;

    public static void load(){
        atlas = new Texture("atlas.png");

        bgMenuRegion = new TextureRegion(atlas, 0, 0, 540, 960);
        btnPlayRegion = new TextureRegion(atlas, 1111, 1244, 418, 112);
    }
}

2 个答案:

答案 0 :(得分:5)

感谢您的帮助。

现在我发现了我的错误。

我将SpriteBatch替换为Batch并且它可以正常工作。

更改

public void draw(SpriteBatch batch, float parentAlpha) {    
        //!!!!!!!!!!!!!!!Error in this place. Draw() not called from stage
        batch.setColor(getColor());        
        batch.draw(Assets.btnPlayRegion, 0, 0);
}

@Override
public void draw(Batch batch, float parentAlpha) {    
        //!!!!!!!!!!!!!!!Error in this place. Draw() not called from stage
        batch.setColor(getColor());        
        batch.draw(Assets.btnPlayRegion, 0, 0);
}

答案 1 :(得分:0)

我认为问题出在这一行:

new Stage(new StretchViewport( Gdx.graphics.getWidth(), Gdx.graphics.getHeight()), batch);

从舞台初始化中删除批处理将其更改为:

new Stage(new StretchViewport( Gdx.graphics.getWidth(), Gdx.graphics.getHeight()));

您正在将批处理从屏幕传递到舞台,并且您在stage.draw()之前调用batch.end()。但是stage有自己的批处理,因此您不必为舞台传递批处理。如果由于您自己的原因(例如批量投影矩阵配置),您仍然希望您的屏幕批处理传递到阶段,请不要在stage.draw()之前调用batch.end(),因为您的阶段批次和主批处理是相同的。在stage.draw()

之后调用batch.end()