2016-04-08 12 views
1

タグのアイデアに基づいて基本的なゲームエンジンを作ろうとしています。すべてのオブジェクトには壁のようなものをグループ化するためのタグがたくさんあります一度にすべての操作を実行します。私は、すべての関数を各オブジェクトで呼び出すためにループで囲む必要はないので、各オブジェクトで渡されたメソッドを呼び出すことができるメソッドを作成しようとしています。ここオブジェクトのリストにパラメータとして関数を渡す

は、いくつかの例の須藤コードです:

//have a list of objs. some door, some not. 

//an example of stuff I could want to do 
// - check returns on any functions called 
// - call a function on a bunch of objects, possibly with parameters 
if (runOnTag("door", isClosed())[aPositionInReturnList] == true){ 
    runOnTag("door", open()); 
} 

//the method 
public couldBeAnyType[] runOnTag(String tag, function(anyPerams)){ //dont want the function to compile here 
    for (String currentObj : listOfObjsWith[tag]){ 
     returns[index++] = currentObj.function(anyPerams);  //so that it can be executed on this object 
    } 
    return returns; //want to be able to colect returns 
} 

私はすでにこの種の質問に他の回答の束を通して見ているが、私は彼らに何が起こっているか理解していません。誰かがそれをもっと簡単に説明できるなら、私はそれを高く評価します。

+0

あなたのオブジェクトのリストの定義を表示できますか?これを行うより良い方法があるはずです – jack3694078

答えて

0

仮定:タグを動的に変更するオブジェクトはありません。

タグをインターフェイスとして実装しないのはなぜですか?これは、文字列マッチングよりも高速であり、型セーフであり、一般的により効率的です。

interface Door {boolean isClosed(); void open();} 

class State { 
    private Collection<Object> gameObjects; 

    public <T,R> Stream<R> onTagged(Class<T> type, Function<T,R> apply) { 
     return gameObjects 
      .stream() 
      .filter(type::isInstance) 
      .map(type::cast) 
      .map(apply); 
    } 
} 

名前を無視してください(onTagged)、あなた自身で作成してください。これはf.eのように使うことができます。

State state = ...; 
if(state.onTagged(Door.class, door -> !door.isClosed()).anyMatch(Boolean.TRUE::equals)) { 
    // ... do stuff ... 
} 

あなたはしかし、それは通常、より良い、このようなものだということでしょう、あなたが操作(マップ/フィルター/任意の*)を構成することができるので非常に簡単に、::オープンいずれかのドアがあるかどうか検索します

public <T> Stream<T> withTag(Class<T> type) { 
     return gameObjects 
      .stream() 
      .filter(type::isInstance) 
      .map(type::cast); 
    } 

if(state.withTag(Door.class).anyMatch(door -> !door.isClosed())) { 
    // ... do stuff ... 
} 
関連する問題