[英]Drawing multiple sprites in libgdx
我正在使用libgdx 1.2.0 + eclipse。 我想从游戏屏幕的一个类中绘制多个子画面,但是只绘制了一个子画面。 这是我的渲染方法
@Override
public void render(float delta) {
Gdx.gl.glClearColor(100/255f, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if(Gdx.input.justTouched()){
touchX = Gdx.input.getX();
touchY = Gdx.input.getY();
//for(int i=0; i < enemy.length; i++)
//System.out.println(enemy[i].x + " " + enemy[i].y);
}
for(int i=0; i< enemy.length; i++){
enemy[i].update(delta);
if(enemy[i].getSprite().getBoundingRectangle().contains(touchX/ppX, touchY/ppY))
enemy[i].reset();
if(enemy[i].gameOver){
gameOver = true;
//System.out.println("Over");
}
}
game.batch.begin();
//if(!gameOver){
for(int i=0; i < enemy.length; i++)
enemy[i].getSprite().draw(game.batch);
//}
game.batch.end();
}
如果我打电话,也会发生同样的事情
enemy[0].getSprite().draw(game.batch);
enemy[1].getSprite().draw(game.batch);
如果我只呼叫其中之一,它总是会吸引人。
这是敌人阶级。 我在每个敌人实例中都从游戏屏幕类中加载了相同的精灵,但是更改了它的位置。
public class Enemy {
private final float minX=1, minY=2;
private final float maxX=31, maxY=18;
private float x,y;
private float time;
private Sprite sprite;
boolean gameOver;
public Enemy(Sprite sprite){
this.sprite = sprite;
reset();
}
public Sprite getSprite(){
return sprite;
}
public void reset(){
x = minX + (int)(Math.random() * (maxX - minX + 1));
y = minY + (int)(Math.random() * (maxY - minY + 1));
time = 0.0f;
gameOver = false;
sprite.setPosition(x, y);
}
public void update(float delta){
time += delta;
if(time >= 3.0f)
gameOver = true;
}
}
我在每个敌人实例中都从游戏屏幕类中加载了相同的精灵,但是更改了它的位置。
这是问题所在,您必须为每个Enemy
对象创建一个new Sprite()
。 但是,当您更改敌人的精灵位置时,所有敌人的位置都会更改。
如您所见,您将到达执行enemy[0].getSprite()
或enemy[1].getSprite()
的同一个精灵。 您可以轻松地使用引用相等enemy[0].getSprite()==enemy[1].getSprite()
。
您可以使用类似的方法解决此问题
public Enemy(Sprite sprite){
this.sprite = new Sprite(sprite);
reset();
}
您的代码中的另一个奇怪的事情是:
public void reset(){
x = minX + (int)(Math.random() * (maxX - minX + 1));
y = minY + (int)(Math.random() * (maxY - minY + 1));
time = 0.0f;
gameOver = false;
sprite.setPosition(x, y);
}
如果执行sprite.setPosition(x, y)
,则修改x
和y
不足以更改sprite的位置。 您应该以这种方式改进update(float delta)
方法,以确保正确更新精灵的位置。
public void update(float delta){
time += delta;
if(time >= 3.0f)
gameOver = true;
sprite.setPosition(x, y);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.