【问题标题】:Spawning Enemies From ArrayList从 ArrayList 生成敌人
【发布时间】:2017-10-04 13:45:18
【问题描述】:

我在ArrayList 中有十二个敌人,我想为每个敌人延迟batch.draw。我在render 方法中尝试了以下代码,但它只会使精灵闪烁。我正在使用libgdx。请帮忙;(

for (int i = 0; i < list.size(); i++)
{
    fireDelay -= Gdx.graphics.getDeltaTime();
    if (fireDelay <= 0)
    {
        batch.draw(list.get(i)//..etc)                    
        fireDelay += 0.2;
    }
}

【问题讨论】:

    标签: java android libgdx tile 2d-games


    【解决方案1】:

    下面的代码肯定可以工作:

    boolean spawnTime=0;
    
    void spawnEnemy(){
      Rectangle rect = new Rectangle();
      rect.x = Gdx.graphics.getWidth()/2;
      rect.y = Gdx.graphics.getHeight();
      rect.setSize(50,50);
      myList.add(rect);
    }
    
    spawnTime+=Gdx.graphics.getDeltaTime();
    
    //call spawnEnemy function every second
    if(spawnTime>=1){
      spawnEnemy();
      spawnTime=0;
    }
    
    //draw all the rectangles to the batch you added in the list
    for(Rectangle rect: myList){
      batch.draw(rect,rect.x,rect.y,rect.w,rect.h);
    }
    

    注意:全局声明 spawnTime。

    【讨论】:

    • The following code will definitely work: 如果没有,您可以随时大喊“它应该有效!”
    • 如果您想避免错误累积,请将if 更改为while 并将spawnTime=0; 更改为spawnTime-=1;
    • @Madmenyo 我们是程序员,这就是我们的工作,对吧? ;)
    【解决方案2】:

    请记住,在游戏中,您的 render 方法会将所有绘图命令排入队列。然后它们被绘制到屏幕上。然后在下一次调用render() 时,它会清除屏幕并重新开始。您的代码有许多没有意义的问题,例如倒计时 for 循环中的增量时间。

    有上百万种方法可以做到这一点。这是一个简单的。它的作用是在每次调用render() 时更新经过的时间并使用它来重新计算现在应该显示多少项目。然后 for 循环将它们全部绘制到该数字。

    private static final float APPEARANCE_RATE = 5f; // 5 per second
    private float elapsedTime = 0;
    
    // in render():
    
    elapsedTime += Gdx.graphics.getDeltaTime();
    
    int itemCount = Math.min(list.size(), (int)(elapsedTime * APPEARANCE_RATE));
    for (int i = 0; i < itemCount; i++)
    {
        batch.draw(list.get(i), /*..etc*/);
    }
    

    【讨论】:

    • 我试图运行它,但我无法让它工作。我在 ArrayList 中的所有敌人都具有相同的位置/行为,但必须按照它们的索引顺序绘制。我想等一下,生成敌人 1,等一下,生成敌人 2,等等。
    【解决方案3】:

    您可以尝试我使用 ModelBatch 编写的这个 sn-p 代码,但该方法也适用于 spriteBatch。

    private int idx = 1;
    private float elapsedTime = 0;
    private int everySec = 1;
    private Array<ModelInstance> storedInstance = new Array<>(); //extra array added each model every second to render in model batch.
    

    在render()方法中

    modelBatch.begin(cam);
    elapsedTime += Gdx.graphics.getDeltaTime();
    
    int time = (int) Math.floor(elapsedTime);
    
    if (idx <= instance.size) {
    
    if (time == idx * everySec) {
         storedInstance.add(instance.get(idx - 1));
         idx++;
        }
    }
    modelBatch.render(storedInstance);
    modelBatch.end();
    

    idx 会分别检查所有模型是否已在每一秒内渲染完毕。如果您想更改模型出现的时间跨度,您只需将“everySec”更改为例如 5 延迟 5 秒。 “实例”也是我要渲染的模型的列表(在你的情况下是敌人)。

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      相关资源
      最近更新 更多