LibGdx - 将一组actor添加到表中,具有延迟

时间:2016-08-02 19:22:48

标签: libgdx

我想让几个彗星落在我的UI的背景中,我有一个工作的彗星演员做它应该做的,但我不知道如何用这些彗星创建一个连续的生成(随机延迟在每个表格之间,没有scene2d / actors,它看起来像:

cometTimer += delta
if(cometTimer >= interval){
    addCometToArray();
    cometTimer = 0;
}

将cometArray循环并绘制每一帧,然后在超出界限时删除实体。

我知道如何将Actors添加到表中的唯一方法是:

table().add(new DialogComet());

如何使用Scene2d添加此类行为?

1 个答案:

答案 0 :(得分:1)

不确定这是否是您所寻找的,但下面是一个小型工作应用程序,显示彗星"下降"从上到下,使用表并让表管理彗星(没有单独的数组/数据结构)。我创建了一个扩展Actor的小Comet类,以允许移动和放置。

"主"类:

import java.util.Iterator;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Table;

public class StageComet  implements ApplicationListener {

    private static final float INTERVAL = 0.3f;

    private Batch batch;
    private ShapeRenderer shapeRenderer;
    private OrthographicCamera camera;
    private BitmapFont font;

    private Table rootTable;
    private Table cometTable;
    private Stage stage;
    private Iterator<Actor> iter;
    private Comet comet;

    private float cometTimer = 0;
    private float delta = 0;

    @Override
    public void create() {

        camera = new OrthographicCamera();
        camera.setToOrtho(false, 960, 640);

        shapeRenderer = new ShapeRenderer();
        batch = new SpriteBatch();
        font = new BitmapFont();

        stage = new Stage();

        /*
         * The root table could contain main "play" actors. It is empty in this example.
         */
        rootTable = new Table();
        rootTable.setFillParent(true);

        /*
         * Usually in Scene2d I think the practice is only to have 1 root table that takes up the entire screen (above), 
         * but for simplicity/illustrative purposes, I created a cometTable only, set it to Fill Parent as well, and the
         * getChildren() of the table will have our array of comets in play at any given time.
         */
        cometTable = new Table();
        cometTable.setFillParent(true);

        stage.addActor(rootTable);
        stage.addActor(cometTable);
    }


    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0.2f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        camera.update();
        batch.setProjectionMatrix(camera.combined);

        delta = Gdx.app.getGraphics().getDeltaTime();
        stage.act(delta);                                               // make sure the comets "fall"

        shapeRenderer.begin(ShapeType.Filled);                          // simple rendering of comets, they are just a circle ...
        iter = cometTable.getChildren().iterator();                     // Table subclasses Group, which has a snapshot array of its Actors 
        while ( iter.hasNext() ) {
            comet = (Comet)iter.next();

            shapeRenderer.circle(comet.getX(), comet.getY(), 20.0f);    // Draw the comet

            if ( comet.getY() < -100 ) {                                // Hack/hardcode, if the comet fell far enough "off stage" ...
                iter.remove();                                          // ... remove it from the stage
            }
        }
        shapeRenderer.end();

        /*
         * Sample code from original question on how to create a comet without scene2d ...
         */
        cometTimer += delta;
        if ( cometTimer > INTERVAL ) {
            cometTable.add(new Comet());                                // ... but in this case, we use scene2d
            cometTimer = 0;
        }

        /*
         * To keep track, display a simple message of # of comets on stage at any given time.
         */
        batch.begin();
        font.draw(batch, "Comets on stage: " + cometTable.getChildren().size, 100, 100);
        batch.end();
     }

    /*
     * I may have missed disposing something, but you get the idea ...
     */
    @Override
    public void dispose() {
        shapeRenderer.dispose();
        batch.dispose();
        stage.dispose();
        font.dispose();
    }

    @Override
    public void resize(int width, int height) {  }

    @Override
    public void pause() { }

    @Override
    public void resume() { }
}

小彗星课:

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.Actor;

public class Comet extends Actor{

    /*
     * Spawn a comet at the top of the screen, in the middle
     */
    public Comet() {
        super();
        this.setY(Gdx.app.getGraphics().getHeight());
        this.setX(Gdx.app.getGraphics().getWidth()/2.0f);
    }

    /*
     * Let the comet fall (same speed) to the bottom of the screen ...
     */
    @Override
    public void act (float delta) {
        this.setY(this.getY() - 10);
        super.act(delta);
    }

}