我結束了使用這兩種方法的東西。下面的代碼片段應有助於說明我承擔了方法:
class TerrainType {
public String displayName;
public String regionName;
public int movementCost;
/* additional properties omitted */
/* constructors omitted */
}
此結構包含一個地形類型,包括運行成本和其他遊戲相關的統計(我爲了簡化省略其餘部分)的相關信息,顯示檢查時顯示的地形類型的顯示名稱,以及從TextureAtlas
拉取的TextureRegion
的名稱,我的渲染器對我非常友善。
class GameMapSystem extends EntityProcessingSystem {
@Mapper private ComponentMapper<MapPosition> pm;
@Mapper private ComponentMapper<SolidObject> som;
private ListMultimap<MapPosition, Entity> entityByLocation;
private int[][] map;
private int width, height;
private Array<TerrainType> terrainTypes;
/**
* Accepts an Array of TerrainType objects and an 2d integer array with
* values corresponding to indices into the array for the correct type.
*
* In my case, these values are gleaned by reading a level description
* file, but any source should be fine.
*/
public GameMapSystem(Array<TerrainType> terrainTypes, int[][] map) {
super(Aspect.getForAll(MapPosition.class));
this.terrainTypes = terrainTypes;
this.map = map;
this.width = map.length;
this.height = map[0].length;
this.entityByLocation = ArrayListMultimap.create();
}
public boolean isOccupied(int x, int y) {
List<Entity> entities = entityByLocation(new MapPosition(x, y));
for(Entity e : entities) {
if(som.has(e)) {
return true;
}
}
return false;
}
@Override
protected void inserted(Entity e) {
this.entityByLocation.put(pm.get(e), e);
}
@Override
protected void removed(Entity e) {
this.entityByLocation.remove(pm.get(e), e);
}
/* additional EntityProcessingSystem overrides omitted */
}
這個EntityProcessingSystem
然後以被動模式連接到我的世界。應該沒有任何真正的理由在這個系統中爲我的世界實際做任何處理,我真正想要的是能夠聽取inserted
和removed
事件將實體放入地圖。一個經理在這種情況下可能會過於矯枉過正,因爲它會告訴我每個插入或刪除的實體,而我只關心與地圖有關的地圖(或者更具體地說與地圖相關的位置)。然後,我有一些單獨的路徑查找邏輯,它會消耗額外的(這裏未見到的)方法來簡單地通過向世界對象請求這個被動系統來引導AI。
爲了完整,MapPosition
類也如下所示。重要的是包含equals()
和hashcode()
以幫助使用MapPosition
作爲集合中的關鍵。
public class MapPosition extends Component
{
public int x, y;
public MapPosition(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if(!(other instanceof MapPosition)) {
return false;
}
MapPosition pos = (MapPosition)other;
return (pos.x == this.x && pos.y == this.y);
}
@Override
public int hashCode() {
int hash = 7;
hash = 59 * hash + this.x;
hash = 59 * hash + this.y;
return hash;
}
}
我很可能會試圖找到比使用番石榴Multimap
最終更方便的數據結構,但它工作,現在和我感覺很舒服移動到充實公共API的論文類,其餘。如果此答案確實對其他人有幫助,請記住,此實現的ArrayListMultimap
的性能未經過嚴格測試!
歡迎的StackOverflow!請務必參考[Tour](http://stackoverflow.com/tour)並仔細閱讀幫助中心以瞭解[如何撰寫正確答案](http://stackoverflow.com/help/how-回答)。在這種情況下,您或許可以通過至少總結鏈接中討論的問題來改進您的答案,而不是簡單地粘貼鏈接本身。 – dg99
啊,好的謝謝,將盡力改進和編輯總結。 –