libgdx你如何每秒绘制或生成一个新的精灵/对象?

时间:2015-05-03 07:03:53

标签: java libgdx spawning

我正在尝试每秒生成一个精灵或对象,但会发生的事情是精灵每秒只渲染不到一秒

public ActionResult preapprove_detail(int preapprove_id)
{
    provider_preapproval requestHeader = new provider_preapproval();
    requestHeader = db.provider_preapproval.Find(preapprove_id);
    if (requestHeader != null)
    {
        return View(requestHeader);
    }
}

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

1 个答案:

答案 0 :(得分:3)

您正在将游戏逻辑与绘图混为一谈。你在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方法应该获得一个精灵,设置它,并将其添加到敌人列表中。它可以简单地实例化一个新的精灵new Sprite(enemy);,它会创建一个新的精灵并用你拥有的现有enemy原型精灵来种子。但是如果你使用池,你可以避免触发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,如果它包含玩家和所有敌人?)。