我正在尝试每秒生成一个精灵或对象,但会发生的事情是精灵每秒只渲染不到一秒
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被渲染的次数少于每秒秒,我知道是因为计时器每秒都会被重置,但是你如何产生或绘制下一个呢?
答案 0 :(得分:3)
您正在将游戏逻辑与绘图混为一谈。你在draw
方法中所做的一切都是绘制所有东西,所以你应该通过你的敌人列表并绘制每一个:
public void draw(SpriteBatch batch){
for (Sprite enemy : enemies)
enemy.draw(batch);
}
请注意,此类不应拥有甚至引用精灵批处理,也不应调用begin
或end
。拥有此类的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,如果它包含玩家和所有敌人?)。