2016-08-21 32 views
1

我正在尝试使用LibGDX构建安卓游戏。这是我第一个android应用程序,所以请原谅我,如果我要求的是简单的。我想画一个精灵,但似乎没有出现。我在想,也许这个精灵画在相机空间之外,但即使当我将相机拿回来(显示出游戏区域),我也看不到精灵。我花了很长时间试图找到问题,而我一直未能。这是我的Playstate类:Sprite在绘制时未显示

public class PlayState extends State{ 
    private Man man; 
    private Cannon cannon; 
    private Texture cannontop; 
    private Texture bg; 
    private SpriteBatch sb; 

    public PlayState(GameStateManager gsm) { 
     super(gsm); 
     cannon = new Cannon(); 
     cannontop = new Texture("Cannon.png"); 
     man = new Man(0, (Gdx.graphics.getHeight()/4)); 
     bg = new Texture("background.png"); 
     cam.setToOrtho(false, 2160, 3840); 

    } 

    @Override 
    protected void handleInput() { 
     // finish later 

    } 

    @Override 
    public void update(float dt) { 
     man.update(dt); 
     //cannon.update(); 
    } 

    public void create(){ 
     sb = new SpriteBatch(); 
    } 

    @Override 
    public void render(SpriteBatch sb) { 
     sb.setProjectionMatrix(cam.combined); 
     sb.begin(); 
     sb.draw(bg, cam.position.x - (cam.viewportWidth/2), 0); 
     sb.draw(man.getTexture(), man.getPosition().x, man.getPosition().y); 
     //sb.draw(cannon.getTexture(), cannon.getPositionx(), cannon.getPositiony()); 
     cannon.getCannon().draw(sb); 
     sb.draw(cannontop, (bg.getWidth()/ 2) - (cannon.getTextureWidth()/2) - 23, (bg.getHeight()/2) + (bg.getHeight()/5)); 
     //sb.draw(cannon.getTexture(), (bg.getWidth()/ 2) - (cannon.getTextureWidth()/2), (bg.getHeight()/2) + (bg.getHeight()/5) - (cannontop.getWidth()/2) + 8); 
     sb.end(); 

    } 

    @Override 
    public void dispose() { 
     bg.dispose(); 
     man.dispose(); 
     cannon.dispose(); 
    } 
} 

我试图绘制的精灵是在大炮类中。这是我的加农炮类:

public class Cannon { 
    private Texture cannend; 
    private Texture bg; 
    private Texture cannonmain; 
    private SpriteBatch batch; 
    private Sprite cannon; 


    public Cannon(){ 
     cannonmain = new Texture("Cannon.png"); 
     bg = new Texture ("background.png"); 
     cannend = new Texture("cannonend.png"); 
     cannon = new Sprite(cannend, (bg.getWidth()/ 2) - (cannend.getWidth()/2), (bg.getHeight()/2) + (bg.getHeight()/5) - (cannonmain.getWidth()/2) + 8, (cannend.getWidth()), (cannend.getHeight())); 
     cannon.setPosition((bg.getWidth()/ 2) - (cannend.getWidth()/2), (bg.getHeight()/2) + (bg.getHeight()/5) - (cannonmain.getWidth()/2) + 8); 
     cannon.setRotation(70); 
     cannon.setCenter((bg.getWidth()/ 2) , (bg.getHeight()/2) + (bg.getHeight()/5) + 3*(cannend.getHeight()/4)); 
    } 
    //public update(dt){ 
    // stuffff 
    // } 


    public Sprite getCannon(){ 
     return cannon; 
    } 

    public float getPositionx(){ 
     return cannon.getX(); 
    } 

    public float getPositiony(){ 
     return cannon.getY(); 
    } 

    public void dispose(){ 
     cannonmain.dispose(); 
     cannend.dispose(); 
     bg.dispose(); 
    } 

    public Texture getTexture(){ 
     return cannend; 
    } 

    public float getTextureWidth(){ 
     return cannend.getWidth(); 
    } 
} 

我道歉是雪碧/纹理名称令人困惑。请忽略评论,因为他们在未来/我尝试过的其他选择。我想知道我能做些什么让雪碧出现。另外,当我使它出现后,精灵会旋转吗?任何帮助是非常赞赏的。 谢谢。

状态类:

public abstract class State { 
    protected OrthographicCamera cam; 
    protected Vector3 mouse; 
    protected GameStateManager gsm; 

    protected State(GameStateManager gsm) { 
     this.gsm = gsm; 
     cam = new OrthographicCamera(); 
     mouse = new Vector3(); 

    } 


    protected abstract void handleInput(); 
    public abstract void update(float dt); 
    public abstract void render(SpriteBatch sb); 
    public abstract void dispose(); 


} 

回答

0

删除SpriteBatch某人参数从渲染方法 只需使用像

@Override 
public void render() 
+0

如果我删除了SpriteBatch sb,我会得到一个红色下划线top'playstate extends ...'行和@overrride上的红色下划线。如果我删除create()方法,则不会遇到任何问题。 –

+0

可以显示状态类,然后 –

+0

更新了主帖 –

0

可能libgdx不能得出精灵,因为复制任何SpriteBatch.begin();
并复制SpriteBatch.end(); 在调用堆栈中

1

你应该用sprite.draw(spritebatch)而不是spritebatch.draw(sprite)来绘制你的精灵。

另外,State class有什么用? Playstate应该是一个屏幕?那么你应该在你的类中实现Screen接口,然后使用你想要的方法,比如'render','dispose',...

+0

cannon.getCannon()返回一个精灵。 sb是一个SpriteBatch。所以它和sprite.draw(spritebatch)一样。 –

+0

您正在使用2个spritebatches,一个在渲染方法中,另一个在类本身中,删除渲染方法中的一个。此外,你真的需要考虑实现屏幕而不是你现在正在做的事情。 –