在 libgdx 中绘制精灵
Drawing sprites in libgdx
我在调用
时收到 NullPoinerExecption
enemy.getSprite().draw(batch);
我必须在哪里初始化精灵?
它在 main class 中工作,但如果我尝试在 Enemy 构造函数中初始化纹理和精灵,那么它会给我错误。
这是我的主要class:
public class SpaceShooter implements ApplicationListener {
private SpriteBatch batch;
private Texture texture;
private Sprite sprite, spriteEnemy;
private Player p;
private Enemy enemy;
@Override
public void create() {
p = new Player();
enemy = new Enemy(spriteEnemy);
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
batch = new SpriteBatch();
texture = new Texture(Gdx.files.internal("craft.png"));
sprite = new Sprite(texture);
sprite.setPosition(w/2 -sprite.getWidth()/2, h/2 - sprite.getHeight()/2);
// Adding enemy sprite
}
@Override
public void dispose() {
batch.dispose();
texture.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// moving sprite left and right
batch.begin();
sprite.draw(batch);
enemy.getSprite().draw(batch);
batch.end();
}
敌人class
public class Enemy {
private Sprite sprite;
private Texture texture;
boolean gameOver;
public Enemy(Sprite sprite){
this.sprite = new Sprite();
}
public Sprite getSprite(){
return sprite;
}
public void create() {
texture = new Texture(Gdx.files.internal("enemy.png"));
sprite = new Sprite(texture);
this.sprite.setPosition(100, 200);
}
您从未在 Enemy 实例上调用 create()
,因此从未实例化 Enemy 中的纹理和精灵。在 create()
方法中调用 enemy.create()
。或者简化事情并将 enemy.create()
中的代码移动到 Enemy 构造函数中。
此外,在您的 Enemy 构造函数中,您正在实例化一个无用的 Sprite 实例,该实例不引用纹理,一旦对敌人调用 create()
就会被丢弃。而且构造函数甚至不使用传入的 Sprite 引用(尽管您目前只是传入 null
,因为 SpaceShooter class 中的 spriteEnemy
从未实例化)。
我在调用
时收到 NullPoinerExecptionenemy.getSprite().draw(batch);
我必须在哪里初始化精灵? 它在 main class 中工作,但如果我尝试在 Enemy 构造函数中初始化纹理和精灵,那么它会给我错误。
这是我的主要class:
public class SpaceShooter implements ApplicationListener {
private SpriteBatch batch;
private Texture texture;
private Sprite sprite, spriteEnemy;
private Player p;
private Enemy enemy;
@Override
public void create() {
p = new Player();
enemy = new Enemy(spriteEnemy);
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
batch = new SpriteBatch();
texture = new Texture(Gdx.files.internal("craft.png"));
sprite = new Sprite(texture);
sprite.setPosition(w/2 -sprite.getWidth()/2, h/2 - sprite.getHeight()/2);
// Adding enemy sprite
}
@Override
public void dispose() {
batch.dispose();
texture.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// moving sprite left and right
batch.begin();
sprite.draw(batch);
enemy.getSprite().draw(batch);
batch.end();
}
敌人class
public class Enemy {
private Sprite sprite;
private Texture texture;
boolean gameOver;
public Enemy(Sprite sprite){
this.sprite = new Sprite();
}
public Sprite getSprite(){
return sprite;
}
public void create() {
texture = new Texture(Gdx.files.internal("enemy.png"));
sprite = new Sprite(texture);
this.sprite.setPosition(100, 200);
}
您从未在 Enemy 实例上调用 create()
,因此从未实例化 Enemy 中的纹理和精灵。在 create()
方法中调用 enemy.create()
。或者简化事情并将 enemy.create()
中的代码移动到 Enemy 构造函数中。
此外,在您的 Enemy 构造函数中,您正在实例化一个无用的 Sprite 实例,该实例不引用纹理,一旦对敌人调用 create()
就会被丢弃。而且构造函数甚至不使用传入的 Sprite 引用(尽管您目前只是传入 null
,因为 SpaceShooter class 中的 spriteEnemy
从未实例化)。