[英]libgdx How do you draw or spawn a new sprite/object every second?
我試圖每秒生成一個Sprite或對象,但是發生的是該Sprite每秒僅渲染不到一秒鍾
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;
}
我只知道每秒僅重置一次playerspr,而每秒渲染的時間少於第二秒,但是您如何生成或繪制下一個定時器呢?
您正在將游戲邏輯與繪圖混淆。 在draw
方法中您應該做的就是繪制所有東西,因此您應該遍歷敵人列表並繪制每個敵人:
public void draw(SpriteBatch batch){
for (Sprite enemy : enemies)
enemy.draw(batch);
}
注意,此類不應該擁有甚至引用一個sprite批處理,並且不應調用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
方法應獲取一個精靈,對其進行設置,然后將其添加到敵人列表中。 它可以簡單地實例化一個新的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?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.