libgdx 你如何每秒绘制或生成一个新的 sprite/object?
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 每秒渲染不到 as 秒,我知道是因为计时器每秒都在重置,但是你如何生成或绘制下一个?
您将游戏逻辑与绘图混为一谈。在你的 draw
方法中你应该做的就是画出你所有的东西,所以你应该只浏览你的敌人列表并画出每一个:
public void draw(SpriteBatch batch){
for (Sprite enemy : enemies)
enemy.draw(batch);
}
请注意,此 class 不应拥有甚至引用精灵批次,也不应调用 begin
或 end
。拥有此 class 的游戏或屏幕 class 应该调用 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 作为种子。但是如果你使用pooling,你可以避免触发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);
}
希望这能让你走上正轨,尽管你的游戏结构看起来有点混乱(比如为什么这个 class 叫做玩家,如果它同时包含玩家和所有敌人?)。
我试图每秒生成一个 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 每秒渲染不到 as 秒,我知道是因为计时器每秒都在重置,但是你如何生成或绘制下一个?
您将游戏逻辑与绘图混为一谈。在你的 draw
方法中你应该做的就是画出你所有的东西,所以你应该只浏览你的敌人列表并画出每一个:
public void draw(SpriteBatch batch){
for (Sprite enemy : enemies)
enemy.draw(batch);
}
请注意,此 class 不应拥有甚至引用精灵批次,也不应调用 begin
或 end
。拥有此 class 的游戏或屏幕 class 应该调用 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 作为种子。但是如果你使用pooling,你可以避免触发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);
}
希望这能让你走上正轨,尽管你的游戏结构看起来有点混乱(比如为什么这个 class 叫做玩家,如果它同时包含玩家和所有敌人?)。