簡體   English   中英

刪除和添加演員到組 - libgdx

[英]Removing and adding actors to a group - libgdx

我有一個組,其中有一個 Map 將每個entity與一個演員相關聯; 它有方法addEntityremoveEntity用於向/從地圖添加和刪除實體以及它們各自的參與者到/從組中添加和刪除實體。

public final void addEntity(final Entity entity) {
    EntityActor entityActor = new EntityActor(entity, shapeRenderer);
    this.addActor(entityActor); //adding the actor to the group
    this.entitesActors.put(entity, entityActor); //adding the actor to the map
}

public final void addEntities(final Collection<Entity> entities) {
    entities.stream().forEach(this::addEntity);
}

public final void removeEntity(final Entity entity) {
    entitesActors.get(entity).addAction(Actions.removeActor()); //removes actor from group
    this.entitesActors.remove(entity); //removes actor from map
}

public final void removeEntities(final Collection<Entity> entities) {
    entities.forEach(this::removeEntity);
}

該組還有一個reset方法,可以刪除他所有的孩子並添加新的孩子。

 public final void reset(final Collection<Entity> entities) {
    Gdx.app.postRunnable(() -> {
        removeEntities(entitesActors.keySet());
        this.addEntities(entities);
    });
}

第一次調用 reset (Map 和 group 為空)一切正常,但是第二次我調用它(Map 和 Group 包含第一次調用的實體)我從 removeEntity 方法中得到了一個 cuncurrentModificationException。

我試着像這樣編輯它:

public final void removeEntities(final Collection<Entity> entities) {
    entitesActors.entrySet().stream().filter(e -> entities.contains(e.getKey())).map(e -> e.getValue())
            .forEach(a -> a.addAction(Actions.removeActor()));
    entitesActors.keySet().removeAll(entities);
}

或者繞過 removeEntities 方法並調用:

this.clearChildren();
this.entitesActors.clear();

在這兩種情況下都沒有異常被觸發,演員被成功地移除並添加到地圖和組中,但他們沒有被繪制到舞台上。 (調用了每個演員中的 draw 方法,但我在屏幕上看不到它們,我得到的只是黑屏)。

有人知道正確的方法,或者告訴我哪里出錯了? 非常感謝您的幫助。

編輯:我嘗試了@luis-fernando-frontanilla 解決方案,但沒有成功。 現在我的重置方法看起來像這樣

public final void reset(final Collection<Entity> entities) {
    this.clearChildren();
    this.entitesActors.clear();
    this.addEntities(entities);
}

我試圖將整個重置方法包裝在 Gdx.app.postRunnable 中

//EntityCrew is my Group object wich has the reset method
Gdx.app.postRunnable(() -> this.entityCrew.reset(level.getEntities()));

而且我注意到,在第一次使用這種設置時,我也看不到該組的演員。 它們在組中,它們是由渲染線程繪制的,但它們沒有顯示在屏幕上,這件事讓我發瘋。

第一次調用 reset (Map 和 group 為空)一切正常,但是第二次我調用它(Map 和 Group 包含第一次調用的實體)我從 removeEntity 方法中得到了一個 cuncurrentModificationException。

發生此異常是因為當您在render()方法中迭代 Collection 時,該集合中的一個元素被刪除,從而混淆了迭代器應該做什么。

對我們來說幸運的是,LibGDX 有一個DelayedRemovalArray類,專為這些情況而設計。 它是這樣工作的:

  • 告訴DelayedRemovalArray你想刪除它的一個或多個元素
  • 在要刪除的元素上放置一個標志
  • 告訴DelayedRemovalArray您已完成設置標志
  • DelayedRemovalArray等待迭代完成並刪除標記的元素
DelayedRemovalArray<Entity> array;
// Prepare to flag elements
array.begin();
// Flag some elements
array.removeIndex(index);
// Finished flagging elements
array.end();

來自 LibGDX API:
DelayedRemovalArray 是一個數組,它在迭代期間排隊移除,直到迭代完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM