7

だから私は最近自分のセルでたくさんのパックマンをプレイしていて、幽霊が互いに独立してどのように機能しているように見えるのか疑問に思っています。私はそれがどのようにプログラムされるかについて考えていました。

私が考えたオプションの1つは、スレッドでした。4つのゴーストはすべて独自のスレッドで実行されており、どういうわけかpacmanの位置を見つけます。しかし、4つのスレッドが機能していると、同期が困難になるのは少々多すぎるようです。また、グーグルはスレッドをサポートしないJavascriptでpacmanを書いたので、スレッドなしでそれを行うことができ、より簡単な方法がなければなりません。

私の2番目の考えは、イベントハンドラーでした。pacmanが起動する「directionChanged」イベントをゴーストごとに1つずつ、4つのイベントハンドラーにワイヤリングするだけです。次に、各ゴーストは、pacmanに到達するためにどのパスを取るかを決定します。これは、起こっている可能性が高いと思います。ただし、イベントハンドラーが同期的に実行されると、パスを順番に計算する必要があり、4番目のゴーストが方向を変更するのに時間がかかり、これにより目に見えるラグが発生する可能性があるため、速度が低下する可能性があります。また、ゴーストは壁にぶつかったときに自分でイベントを発生させ、イベントハンドラーはゴーストの方向を変更します。しかし、pacmanが方向を変え、4人のゴーストが応答する頻度を考えると、イベントハンドラーも少し多すぎるように見えます。

30年前にCPU時間とメモリが不足していたゲームを思い出してください。もっと簡単な方法が必要だと思います。

また、pacmanがまだいるときでも、幽霊は別の道をたどっているようです。すべてのゴーストは、完全に異なる、または異なる方法で最適化されたパスファインディングアルゴリズムを使用していますか?

私は、すべてのゴーストが使用するパスファインディングアルゴリズムよりも、すべてのゴーストが同時にどのように機能するかを調べることに興味があります。考え?

4

3 に答える 3

13

ここには、幽霊の振る舞いに関する詳細な記事など、 pacmanがどのように機能するかについてのすばらしい情報がたくさんあります。

**この情報は、しばらく前にパックマンのパスファインディングアルゴリズムから見つけたものです。

編集:

このブログ投稿には、幽霊に関するさらに多くの情報があります。

于 2010-08-21T02:40:29.127 に答える
6

あなたはこれを大幅に考えすぎています。

スレッドとイベントハンドラーは、ビデオゲームの標準ではひどく遅いです。マルチスレッドゲームエンジンは比較的新しい発明であり、パックマンがリリースされてから文字通り数十年後のことです。Pacmanのわずかなロジックは、この非常に単純化された擬似コードのような、単一のかなりタイトなループ内で発生します。

while (!pacman_dead) {
  foreach ghost {
    if (ghost has hit a wall) {
      if (pacman to left) turn left
      if (pacman to right) turn right
    } else {
      go straight
      if (ghost touched pacman) {
        pacman_dead = true
      }
    }
  }

  handle_input();
  move_pacman();
  draw_screen();      
}

これはゲームではかなり一般的なパターンであり、同意のように見えます。通常、ゲームは単一のループで実行され、画面の再描画の間のスペースでゲームの状態が少しずつ進みます。これが、ゲーム開発においてパフォーマンスが依然として非常に重要である理由です。ゲームは、何かを実行したり、何らかの決定を下したりする必要のあるすべてのゲーム内オブジェクト(AI制御の対戦相手、移動するプラットフォーム、単純なアニメーションなど)を繰り返し処理し、次の場所で状態を更新する必要があります。 1秒間に少なくとも30回。

于 2010-08-21T02:41:42.923 に答える
1

各フレームをレンダリングする前に、ゴーストをループします。そのようにイベント、スレッド、または非同期の問題はありません。各ゴーストは、おそらくその動きを記録して決心するための非常に大雑把なヒューリスティックを持っています(左または右に曲がる、アクションなし、whatev)。

これがあなたがチェックアウトできる実装です。:)

于 2010-08-21T02:40:59.950 に答える