2016-08-02 2 views
0

Я хочу, чтобы на фоне моего пользовательского интерфейса было несколько комет, у меня есть рабочая комета. Актер делает то, что он должен, но я не уверен, как создать непрерывную икру с этими кометами (со случайной задержкой между каждым) в таблице, без scene2d/актеров это будет выглядеть примерно так:LibGdx - добавление массива актеров в таблицу с задержкой

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

с cometArray быть накинуто и обращается каждый кадр, а затем удаления объект, когда он выходит за пределы.

Единственный способ я знаю, как добавить Актёры к столу, как это:

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

Как бы идти о добавлении этот тип поведения с помощью Scene2d?

+0

Таблица расширяет группу, которая может дать вам актеров в таблице как в значительной степени массив (libGDX SnapshotArray) , Таким образом, вы можете использовать подобную логику для своего кода. Добавьте комету в таблицу, используйте методы drawChildren или getChildren, если вы хотите зацикливаться на кометах (чтобы убедиться, что они за пределами границ, установить положение, что угодно), а затем использовать метод tableVar.removeActor (specificComet) при OOB. –

+0

@PeterR Я пытался реализовать это, но не могу заставить его работать, каким-либо образом вы могли бы написать пример кода в ответ? –

+1

Я попробую, но может быть пара/несколько дней, прежде чем я смогу добраться до него. –

ответ

1

Не уверен, что это то, что вы искали, но нижеследующее небольшое рабочее приложение показывает, что кометы «падают» сверху вниз, используя Таблицы и управляя таблицами кометы (без отдельного массива/данных состав). Я создал небольшой класс Comet, который также расширяет Actor, позволяя перемещаться и размещаться.

«главный» класс:

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); 
    } 

} 
+0

Я нахожу еще один способ решения своей проблемы, но буду принимать и подавать награду, поскольку это, похоже, другое рабочее решение, спасибо за вашу помощь! –

Смежные вопросы