0

クリーチャーがステージを前後に上下に走っているコードを作成しようとしています。プレイヤーである私は、クリーチャーに近づき、拾う必要があります。舞台にも境界がある――

  1. マップの制約 - 大きな長方形のボックスは簡単に実現できます。私はこれをやった。
  2. マップ内の境界も長方形ですが、プレーヤーを長方形の内側に跳ね返す代わりに、反対のことをしようとしています-プレーヤーを長方形から遠ざけます.

私のコードは今のところ次のようになります。

//Conditions that check if player/monsters are hittesting the boxes (rocks 
//and stuff), then if correct, bounce them away. Following code excludes 
//the monsters for simplicity.

    if((mcPlayer.x - aBounceBox[b].x) < 0 && mcPlayer.y <= (aBounceBox[b].y + aBounceBox[b].height/2) && mcPlayer.y >= (aBounceBox[b].y - aBounceBox[b].height/2))
                {
                    mcPlayer.x = aBounceBox[b].x - aBounceBox[b].width/2 - mcPlayer.width/2;
                }
//Duplicate above code for right side of box here
                if((mcPlayer.y - (aBounceBox[b].y + aBounceBox[b].height/2)) < 0 && (mcPlayer.x + mcPlayer.width/2) > (aBounceBox[b].x - aBounceBox[b].width/2) && (mcPlayer.x - mcPlayer.width/2) < (aBounceBox[b].x + aBounceBox[b].width/2))
                {
                    mcPlayer.y = aBounceBox[b].y + aBounceBox[b].height/2;
                }
//Duplicate above code for Upper boundary of box here

ボックスの左側と右側をバウンスするコードが、ヒット テストしているボックスの上部と下部と競合するため、上記はうまく機能しません。それをスムーズに行う方法はありますか?

また、私が抱えているもう 1 つの問題は、ゲーム内のモンスターのパスです。私は彼らに次のことをさせようとしています:

  1. 「有機的に」動き回るか、少しランダムに動きます。少し動き、停止します。境界に遭遇すると、停止して別の場所に移動します。岩や木への移動が止まる限り、どこへ行っても構いません。
  2. ステージ上での動きはなるべく重ならないように。
  3. 重なっている場合は互いに押し離しますが、ごくわずかに重なるようにしたいと思います。

私はそのコードをゆっくりと構築していますが、それを行う方法について誰かアイデアを持っているかどうか尋ねてみようと思いました.

4

1 に答える 1

0

最初の質問に答えるには、2 つの表示オブジェクト間の xy オフセットを示す新しいクラス/オブジェクトを実装してみてください。アイデアをより明確に説明するために、次のような関数を使用できます。

public function getOffset(source:DisplayObject, target:DisplayObject):Object {
    var dx:Number = target.x - source.x;
    var dy:Number = target.y - source.y;
    return { x:dx, y:dy };
}

ヒーロー キャラクターが別のオブジェクトと衝突しているかどうかを最初hitTestObject(displayObj)DisplayObjectクラス別に確認します。結果が の場合に進みtrueます。

ヒーロー キャラクターをソース オブジェクトとして渡し、別の障害物をターゲット オブジェクトとして渡すとします。

var offset:Object = getOffset(my_hero.mc, some_obstacle.mc);

結果のオフセット値を取得したら、 と の大きさ (絶対値) を比較しoffset.xますoffset.y。結果は次のように要約できます。

ありましょうabsDxMath.abs(offset.x)ありましょabsDyMath.abs(offset.y)

  • absDx < absDy
    • offset.y < 0targetsource
    • offset.y > 0target以下ですsource
  • absDx > absDy
    • offset.x < 0targetの左側にありますsource
    • offset.x > 0targetの右側にありますsource
  • absDx == absDy
    • 上記のケースのいずれかを参照してください。実際には問題ではありません

その後、さまざまな状況に応じてヒーロー キャラクターの位置を更新できます。


クリーチャーに非常に単純な AI アルゴリズムを実装することに関する 2 番目の質問については、上記の戦略を使用して、クリーチャーが他のものと衝突するかどうかを確認できます。衝突した場合は、他の移動方向を割り当てます。さらに簡単に、速度の符号 (+/-) を反転するだけで、反対方向に移動します。

単純なアルゴリズムを最初に実装する方が簡単です。機能したら、後で好きな拡張機能を適用できます。たとえば、ジャンクションに到達したとき、または 3 秒ごとに方向を変更します。

于 2014-07-21T03:27:26.933 に答える