2

私は現在 AndEngine でゲームを開発しており、何らかの理由で for ループが機能しないため、敵配列のすべての個々のインデックスに対して各車をチェックすることにより、敵との衝突検出を設定しました。これは、敵を増やしたり減らしたりするのが面倒であるだけでなく、見栄えが悪いため、非常に不便です。次のようになります。

if (rManager.getInstance().iceArray[0].getIceSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite()))
{
    rManager.getInstance().carArray[r].setCarSpeed(1f);
} else if (rManager.getInstance().iceArray[1].getIceSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
    rManager.getInstance().carArray[r].setCarSpeed(1f);
} else if (rManager.getInstance().iceBergArray[0].getIceBergSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
    rManager.getInstance().carArray[r].setCarSpeed(0f);
} else {
    rManager.getInstance().carArray[r].setCarSpeed(0.5f);
}   

私が試した for ループは、[r] が car 配列のすべての車であるこのようなものでしたが、何もしないようです。

for (int h = 0; h < rManager.getInstance().snowArray.length; h++)
{
    if (rManager.getInstance().snowArray[h].getSnowSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
        String temp = rManager.getInstance().carArray[r].toString();
        Log.e("SNOW", "SNOWWWWW!" + rManager.getInstance().snowArray[h].toString());
        rManager.getInstance().carArray[r].setCarSpeed(0.2f);
    }
}

ありがとう!!

4

1 に答える 1

4

if else を削除するには、ファクトリ パターンまたは戦略パターンを使用する必要があります。

以下のリンクを参照してください。

http://www.cumps.be/nl/blog/read/design-patterns-strategy-pattern

または「switch」ステートメントのない戦略パターン?

編集

コードに基づいて、startegy パターンは以下の疑似コードに従って実装する必要があります。上記で既に投稿されているコードに基づいて、いくつかの仮定を作成しました。

以下のように、ロジックと適切なアクションを含むディクショナリを作成します。

 Dictionary<Func<RManager, int, bool>, Action<Car>> 
 ruleUpdates = 
 new Dictionary<Func<RManager, int, bool>, Action<Car>>();

それぞれFunc<Ice, Car, bool>、このように実装する必要があります

private bool ZeroElementEqualIcePrite(RManager rManager, int r)
    {
        return rManager.getInstance().iceArray[0].collidesWith(rManager.getInstance().carArray[r].getCarSprite());
    }

アクションは以下のように実装する必要があります。

public static void DoUpdateOneLevel(Car car)
{
    car.setCarSpeed(1f);
}

そこから、同じ方法でコードに続くすべてのロジックで同様の実装を行うことができます。以下の辞書を初期化できます

ruleUpdates.Add(FirstElementEqualIcePrite, DoUpdateOneLevel);
ruleUpdates.Add(SecondElementEqualIcePrite, DoUpdateOneLevel);
ruleUpdates.Add(FirstElementEqualIceBergPrite, DoUpdateZeroSpeed);
ruleUpdates.Add(SecondElementEqualIceBergPrite, DoUpdateZeroSpeed);

その後、以下のように executionList の各キーをループします。

foreach (KeyValuePair<Func<RManager, int, bool>, Action<Car>> 
 ruleUpdate in ruleUpdates)
    {
       if (ruleUpdate.Key.Invoke(rManager, r))
       {
          ruleUpdate.Value.Invoke(rManager.getInstance().carArray[r]);
          break;
       }
    }

この助けを願っています。コードがクリーンで変更しやすい戦略に従えば、if / then / else ロジックもあまり気にしません。将来的には簡単に拡張できます。

于 2013-04-25T18:46:35.203 に答える