【问题标题】:libgdx How do you draw or spawn a new sprite/object every second?libgdx 你如何每秒绘制或生成一个新的精灵/对象?
【发布时间】:2015-07-12 17:14:43
【问题描述】:

我试图每秒生成一个精灵或对象,但结果是精灵每秒只渲染不到一秒

public class Player {
private Sprite playerSpr,enemy,enemy1;
public Vector2 position,size;
public Rectangle bounds;
private SpriteBatch batch;
private float deltaTime;
private float timer,elapsedTime;

private ArrayList<Sprite> enemies;
private Iterator<Sprite> enemyIterator;

public void create(){
    position=new Vector2(200,910);
    size=new Vector2(82,80);
    batch=new SpriteBatch();
    timer=0;

    playerSpr=new Sprite(new Texture(Gdx.files.internal("spr_player.png"))); 
    enemy=new Sprite(new Texture(Gdx.files.internal("spr_player.png"))); 
    enemy1=new Sprite(new Texture(Gdx.files.internal("spr_player.png"))); 
    bounds=new Rectangle(position.x,position.y,size.x,size.y);

    enemies=new ArrayList<Sprite>();
    enemies.add(playerSpr);
    enemies.add(enemy);

}

public void update(){
    deltaTime=Gdx.graphics.getDeltaTime();
    enemyIterator=enemies.iterator();

    timer+=1*deltaTime;
    elapsedTime+=1*deltaTime;   

    playerSpr.setPosition(position.x,position.y);
    playerSpr.setSize(size.x,size.y);

    bounds.set(position.x,position.y,size.x,size.y);
}

public void movement(){
    if(position.y<=910){
        position.y-=600*deltaTime;

        }

    }

/* wan't to draw the next sprite every second, for now I only have to stored in the iterator */
public void draw(){
    if(timer>=1){
        Sprite cur=enemyIterator.next();
        batch.begin();
        cur.draw(batch);
        batch.end();timer=0;
    }  

只有 playerpr 的渲染时间少于每秒,我知道是因为计时器每秒都会重置,但是你如何生成或绘制下一个?

【问题讨论】:

  • 为了以后参考,没有必要删除你的旧问题并提出一个新问题。您可以编辑原始问题,这会像新问题一样将其排入队列。编辑的好处是你不会失去以前已经试图帮助你的人的注意力。

标签: java libgdx spawning


【解决方案1】:

您将游戏逻辑与绘图混为一谈。你在draw 方法中应该做的就是绘制你所有的东西,所以你应该浏览你的敌人列表并绘制每一个:

public void draw(SpriteBatch batch){
    for (Sprite enemy : enemies)
        enemy.draw(batch);
}

请注意,此类不应拥有甚至引用精灵批次,也不应调用beginend。拥有此类的 Game 或 Screen 类应调用 begin 和 end,因此它们在整个游戏中只被调用一次。

并且您希望每秒生成一个敌人,这应该在您的 update 方法中完成。在您增加计时器后(timer+=1*deltaTime; 行),您可以通过创建一个敌人并将其添加到您的列表中来生成一个敌人:

while (timer >= 1f) {
    createNewEnemy();
    timer -= 1f;  //don't simply reset to 0, or you will be rounding off every time a new one is spawned, so the rate won't be consistent over time.
}

(使用while 而不是if 的原因是因为理论上,您可能希望生成敌人的次数超过您的最大帧时间。这可以防止您的游戏逻辑在某处出现慢帧时落后。 )

createNewEnemy 方法应该获取一个精灵,设置它,并将它添加到敌人列表中。它可以简单地实例化一个新的 sprite new Sprite(enemy);,它会创建一个新的 Sprite 并使用现有的 enemy 原型 sprite 为它播种。但是如果你使用池化,你可以避免触发GC,这会导致你的游戏卡顿:

private void newEnemy(){
    Sprite newEnemy = Pools.obtain(Sprite.class);
    newEnemy.set(enemy); //reference same Texture from your prototype enemy sprite
    //set up enemy position and other parameters here
    enemies.add(newEnemy);
}

如果你使用池化,那么稍后当你想移除一个敌人时,你应该这样做:

private void removeEnemy(Enemy removedEnemy){
    Pools.free(removedEnemy);
    enemies.remove(removedEnemy);
}

希望这能让你走上正确的道路,尽管你的游戏结构看起来有点混乱(例如,如果这个类同时包含玩家和所有敌人,为什么要称为 Player?)。

【讨论】:

  • 最后一个问题,如果每秒都会为 newEnemy 创建一个新位置,我该如何移动 newEnemy。
  • 我不明白你的问题。能详细解释一下吗?
  • 我希望每秒创建的每个精灵都向下移动(减小 y 坐标)。基本上,一旦创建了精灵,它就会向下移动,直到它超出屏幕。对不起我的英语,谢谢你的回答。
  • 这是一个相当复杂的问题。开始一个新的怎么样?
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多