2016-08-21 6 views
1

Я пытаюсь построить Android-игру с помощью 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(); 
    } 
} 

Я извиняюсь, что имена спрайтов/текстур сбивают с толку. Пожалуйста, проигнорируйте комментарии, поскольку они есть для будущих/альтернативных вещей, которые я пробовал. Я хотел бы знать, что я могу сделать, чтобы заставить Sprite появиться. Кроме того, будет ли спрайт вращаться после того, как я его покажу? Любая помощь получает широкую оценку. Спасибо.

класс состояния:

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, я получаю красную подчеркивание на верхняя строка 'playstate extends ...' и красная подчеркивание на @overrride. Если я удалю метод create(), я не получу никаких проблем. –

+0

вы можете показать класс состояния, то –

+0

обновлено основное сообщение –

0

Может быть libgdx не может рисовать спрайты, потому что дублировать любой SpriteBatch.begin();
и дублирование SpriteBatch.end(); в стопку звонков

1

Вы должны нарисовать свои спрайты с sprite.draw(spritebatch), а не spritebatch.draw(sprite).

Кроме того, что такое использование класса государства? Предполагается, что PlayState будет экраном? Тогда вам, вероятно, следует реализовать интерфейс Screen в вашем классе, который затем будет использовать нужные вам методы, такие как «render», «dispose», ...

+0

cannon.getCannon() возвращается с спрайтом. sb - это SpriteBatch. Так что это то же самое, что sprite.draw (spritebatch). –

+0

Вы используете 2 spritebatches, один в методе визуализации и один в самом классе, удалите его в своем методе рендеринга. Кроме того, вам действительно нужно подумать о внедрении Screen вместо того, что вы делаете сейчас. –

Смежные вопросы