タイル張りの世界を使用した簡単なタワーディフェンスゲームがあります。クリープとタワーは常にタイルの上にあります。
コードでクリープの位置をどのように表すべきですか?(クリープは現在のタイルとそのタイル上の位置を知っていますか、それとも絶対的な世界の位置を知っていますか?)
私は基本的に、ベストプラクティス、デザインパターンタイプのヒント、またはタイルベースの世界での配置の管理方法に関する一般的な洞察を探しています。
ありがとうございました。
タイル張りの世界を使用した簡単なタワーディフェンスゲームがあります。クリープとタワーは常にタイルの上にあります。
コードでクリープの位置をどのように表すべきですか?(クリープは現在のタイルとそのタイル上の位置を知っていますか、それとも絶対的な世界の位置を知っていますか?)
私は基本的に、ベストプラクティス、デザインパターンタイプのヒント、またはタイルベースの世界での配置の管理方法に関する一般的な洞察を探しています。
ありがとうございました。
回答:
私の経験では、タイルベースの世界で位置を処理する最良の方法は、タイルベースの世界にいることを無視することです。つまり、エンティティをワールド位置に保存し、エンティティが移動するパスをワールド空間に保存し、可能な場合はエンティティや他のゲームロジックにタイルについて知らせないでください。まったく。
タイルを検討する際の問題は、タイルがゲームコードにコーナーケースを導入することです。コードが微妙に誤動作する可能性がある多くの新しい場所。(たとえば)タワーは、自分のタイルのエンティティにどれだけ近いかだけでなく、他のタイルのエンティティにも通知できる必要があります。そして、タイルについて考えているとすぐに、タイルの隣を見つけることを考え始めます。これは、バグを(特にプレイフィールドの端と角に沿って)導入するのも簡単です。
タイルベースのワールドは、レベル編集に非常に便利です。しかし、私のアドバイスは、編集にはタイル構造のみを使用することです。レベルの構築方法がゲームロジック自体に広がらないようにしてください。
私はあなたのエンティティにワールドポジションを使用します。これは、世界が実際に巨大にならない限りうまく機能します(世界の位置が精度のために実用的でなくなるため、世界をチャンクに分割する必要があります)。
現在のタイルは、x座標とy座標から簡単に計算できます。また、世界座標があるとエンティティの比較がはるかに簡単になります(たとえば、エンティティXがタワーYの範囲にあるかどうか)。
他のアプローチを使用することもできますが、常に2セットの座標(タイルインデックスとタイル内の位置)を処理する必要があります。
結論として:どちらのアプローチも機能しますが、ワールド座標を使用するほうがはるかに実用的です(扱う座標が少なく、必要な計算が少ない)。便宜上、エンティティには、その場で現在のタイル位置を計算するxおよびyタイルインデックスのゲッターメソッドを含めることもできます。