2014-10-28 71 views
2

请原谅我的英文。libGDX演员draw()不叫

开始探索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

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); 
    } 
} 
+0

“不叫” 在你的代码不执行或没有什么可见的?你是否尝试过在你的按钮的绘制调用周围'batch.begin/end'? – cfrick 2014-10-28 20:32:04

+0

,你已经用空方法覆盖了你的'Game'类中的所有方法。对于较短的代码?否则什么都不会呈现。 – cfrick 2014-10-28 21:00:17

回答

5

感谢您的帮助。

现在我发现我的错误。

我将SpriteBatch替换为批处理,它工作。

变化

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); 
} 
+0

+1,解决了自己的问题 – 2014-10-28 20:58:46

+0

不错。我记得在升级旧项目的Libgdx库时遇到这样的问题 – z3n105 2014-10-28 20:59:25

+5

这是'@ Override'关键字可以提供帮助的地方。把它放在任何你压倒一切的方法之前,它会在你没有把握的时候发出警告。 – Tenfour04 2014-10-28 22:35:38

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.draw()之前调用batch.end(),因为批处理阶段和主批次是相同的。在stage.draw()后调用batch.end()