Search code examples
javaandroidlibgdx

How to draw a Sprite in Libgdx/Android?


im working on a libgdx Game where you avoid Asteroids with a spaceship. When i launch my project i only see a white Screen :( Here u can see a big part of my code to understand what iam trying to do.

Main Class:

package com.me.mygdxgame;

import screen.MenuScreen;
import screen.ScreenManager;


public class MyGdxGame implements ApplicationListener {


SpriteBatch batch;
public static int WIDTH = 800 , HEIGHT = 480; // resolution

@Override
public void create() {
    batch = new SpriteBatch();
    ScreenManager.setScreen(new MenuScreen());

}

@Override
public void dispose() {

    if(ScreenManager.getCurrentScreen() != null){
    ScreenManager.getCurrentScreen().dispose();
    }
}

@Override
public void render() {

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().update();
    }

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().render(batch);
    }
}

Screen class:

package screen;

public abstract class Screen {
public abstract void create();
public abstract void render(SpriteBatch batch);
public abstract void update();
public abstract void resize(int width, int height);
public abstract void dispose(int width, int height);
public abstract void dispose();
public abstract void pause();
public abstract void resume();
}

ScreenManager:

public class ScreenManager {

private static Screen currentScreen;

public static void setScreen(Screen screen){
    if(currentScreen != null){
        currentScreen.dispose();
        currentScreen = screen;
        currentScreen.create();
    }
}

public static Screen getCurrentScreen() {
    return currentScreen;
}



}

MenuScreen:

public class MenuScreen extends Screen {

private OrthoCamera cam;
private Spaceship spaceship;

@Override
public void create() {
    // TODO Auto-generated method stub
    cam = new OrthoCamera();
    spaceship = new Spaceship();
}

@Override
public void render(SpriteBatch batch) {
    // TODO Auto-generated method stub
    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    spaceship.render(batch);
    batch.end();
}

@Override
public void update() {
    // TODO Auto-generated method stub
    cam.update();
    spaceship.update();
}

Spaceship Class:

 public class Spaceship extends Entity {

 Texture texture;
 Sprite sprite;

public Spaceship() {


    texture = new Texture("spritesheet.png");

    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear );
    TextureRegion region = new TextureRegion(texture, 0, 312, 258, 144);  

    sprite = new Sprite(region);
    sprite.setSize(sprite.getWidth(), sprite.getHeight());
    sprite.setOrigin(sprite.getWidth() / 2, sprite.getHeight() / 2);
    sprite.setPosition(-sprite.getWidth() / 2, -sprite.getHeight() / 2);

}

public void update() {

    if (Gdx.input.isTouched()) {  

        pos.x = Gdx.input.getX() - MyGdxGame.WIDTH / 2;
        pos.y = -Gdx.input.getY() + MyGdxGame.HEIGHT / 2;
    } 

}

@Override
public void render(SpriteBatch batch) {
    sprite.draw(batch);
}

Solution

  • The problem should be in your ScreenManager. The method setScreen is incapable of initializing a screen if there is no previous screen:

    public static void setScreen(Screen screen){
        if(currentScreen != null){
            currentScreen.dispose();
            currentScreen = screen;
            currentScreen.create();
        }
    }
    

    Should be:

    public static void setScreen(Screen screen) {
        if (currentScreen != null){
            currentScreen.dispose();
        }
        currentScreen = screen;
        currentScreen.create();
    }