レベルでオープンスペースを見つけるための最良の方法は何でしょうか?


7

私は、ペイントを使用してレベルにタイルを追加する2Dゲームに取り組んでいます。現在、ワープタイルを追加するように取り組んでいます。特定の方向指向のペイントが2つのポイント(開始と終了)を使用して、タイルが指す方向(左、右、上、下)を決定するように設定しました。ワープタイルにはこれらのポイントがありますが、他の2つのリスト(ワープの開始と終了)に追加されました。ワープの仕組みは次のとおりです。プレーヤーが1つのタイルに当たると、対応するワープタイルにテレポートされます。さて、これを適切に機能させるには、プレイヤーが壁やマップの外にテレポートできないようにする必要があります。したがって、壁から1スペース離れた開いたタイルにポイントを移動する必要があります。

これを行う最善の方法は何でしょうか?


これらのワープポイントを事前に設定していますか、それとも何らかの方法で自動的に生成されますか?
Richard Marskell-Drackir、2011年


@Drackirペイントは、消えたり移動したりしないパーティクルトレイルであり、すべてのパーティクルには、その位置をマッピングするための独自のポイントがあります。そこで、各パーティクルの位置をチェックし、そのタイルが開いているかどうかを確認し、それに応じて衝突マップを変更してからパーティクルを削除するforループを作成しました。タイルのグラフィックは、衝突マップに従って描画されます。
IronGiraffe 2011

私は信じられないほど混乱しています。おそらく、画像は、人々があなたがやろうとしていることを理解し、しっかりとした答えを与えるのに役立ちます。
Richard Marskell-Drackir、2011年

@Drackir これがこれまでのゲームのビデオです。タイルを配置するたびに、コリジョンマップ上のその位置の値を変更します(int配列)。ワープタイルでは、9タイル分のオープンスペースが必要です(9タイルはすべて0に等しい)。ワープタイルは紫の線の終点に作成されます(フラグは1:32に表示されます)。必要なのは、検索アルゴリズムを使用して、私のガイドラインに適合する新しいポイントの古いポイントを探す方法です(周囲に8つの空のタイル)。空の新しいポイント。)例。
IronGiraffe、2009

回答:


3

クリックしたタイルの周りに開いているタイルがあることを確認するだけの場合は、その周りのタイルをチェックする関数を作成します。そして、クリックされたタイルでそれを呼び出します。

(ネストされた)ループで設定することも、ifステートメントを作成することもできます。したがって、疑似コードでは:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

コメントに基づいて編集

この状況に対処するには2つの方法があります。

  1. (最も簡単)サウンドを再生して、選択した位置が無効であり、別のオプションを選択する必要があることを示すことができます。
  2. 検索アルゴリズムを使用して、開いているタイルを見つけます。ただし、使い方には限界があると思います。たとえば、ユーザーがマップの左側をクリックし、開いている唯一のスポットが右側にある場合を考えてみます。検索アルゴリズムは、そのオープンスポットを見つけて、他のワープをそこに配置します。これはあまり直感的ではないようで、イライラするかもしれません。この場合の私の提案(あなたが私の主な提案である#1を実行したくない場合)は、現在のタイルの周囲のタイル(おそらくnタイルの半径内)のみを検索することです。これにより、ワープゲートがクリックした場所から離れすぎて表示されなくなります。このような検索を行うには(1タイルの半径を想定)、現在のタイルの周囲にある8つのタイルに対して上記の関数を呼び出すだけです(現在のタイルが使用できない場合)。これは、ループで行うことも、ifステートメントを使用して行うこともできます。

私はその方法を知っていますが、古いポイントが開いていないときに、検索アルゴリズムを使用して新しいポイントを見つける方法がわかりません。私はパスファインディングについて調べてきましたが、ダイクストラのアルゴリズムまたはA *アルゴリズムを使用して最も近いオープンスペースを見つけるのと同じようなことができるようです。これまでどのようなプログラムを行ったことがないので、どうすればよいかわかりません。そんなに面倒で申し訳ありませんが、私はプログラミングの初心者なので、まだあまり知りません。
IronGiraffe、2011

@IronGiraffe-ああ、私はあなたが何を意味するのか分かります。はい、答えを更新します。
Richard Marskell-Drackir、2011年

@IronGiraffe-更新されました。
Richard Marskell-Drackir、2011年

レベルの読み込みまたは生成中に「タイルが開いているかどうかを確認」し、結果を保存することをお勧めします。とにかく、通常、この時点ですべてのタイル(少なくとも、遅延評価を行う場合は、すべての読み込まれた/表示されているタイル)を通過させる必要があります。ほとんど余分な作業は問題ではなく、ほとんどのプラットフォームでは、メモリの追加ビットは問題になりません。どちらか。
Martin Sojka、2011

@Martin-私が理解していることから、プレイするとレベルが変化します。ビデオをご覧ください。また、上記のオプション1をお勧めしますが、2番目のオプションを実行する必要がある場合はクリックするだけなので、パフォーマンスに顕著な影響を与える可能性はほとんどありません。
Richard Marskell-Drackir、2011年

0

プレイヤーがフィットできるワープタイルに最も近い「フリー」の長方形を見つける必要があると思います。

Stackoverflowについても同様の質問があります。クリックしてご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.