没有调用libGDX actor draw()

NSu*_*nny 2 java android stage actor libgdx

请原谅我的英语.

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

请帮忙.

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() {

        }   
    }
Run Code Online (Sandbox Code Playgroud)

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

    }

}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

NSu*_*nny 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);
}
Run Code Online (Sandbox Code Playgroud)

@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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是`@Override`关键字可能有用的地方.把它放在你压倒的任何方法之前,它会在你没有把它弄好的时候警告你. (5认同)