タイルベースのゲームで壁を作る:何が欠けていますか?


25

今日、タイルベースのゲームへの壁の実装に関するメモを書き留めるために時間を費やした後、突然、想像していたほど単純ではないことに気付きました。私の仕事の現在の段階は、実際に壁に関連するコードを作成することにもほど遠いですが、それを行うための3つの異なる方法を思いつきました。今のところ、自分のアイデアのどれが最もうまくいくか、何かを見逃したかどうかわからない。

重要:キャラクターはCAN関係なく、フォームの、壁を有するタイルの上に立ちます。

3つのバリアントすべてに共通すること:タイルマップは、一次元のstd :: vector(または同様の)ベースのコンテナーに「保持」されます。その理由は(驚くほど)別の質問への回答で説明されています。

タイルベースのゲームのコンテナクラス。

壁に戻る。

A)シンプルなアプローチ。

ここには何も派手なものはありません。各タイルコンテナには、文字だけでなく、タイルのエッジに接続されている1つまたは複数のWallオブジェクトを保持できます。

最初のアプローチ

長所:実装が簡単で、エンジンを変更する必要はありません。短所:2つのこと。1つ-頭の中だけかもしれませんが、一部の組み合わせは見苦しいだけです。第二-このアプローチでは、2つの隣接するタイルから二重壁を作成できます。建物はゲームの重要な部分であり、二重壁により、ビルダーはゲーム手段を通じて壁の材料のアップグレードを控えることができ、既存の壁を2倍にすると耐久性が向上します。それは望ましくありません。確かに、二重壁を禁止する手順を含めることもできますが、それは悪い感じになります。

B)スマート(?)アプローチ。

プレイヤーにマップ全体を二重壁にする代わりに、私は彼らにそれを打ち負かすつもりです。すべての壁には、タイルの端に内側から取り付けられる2つの半分があります。したがって、単一の「壁ユニット」を作成するには、2つの隣接するタイルに2つの半壁オブジェクトを作成する必要があります。

第二のアプローチ

長所:対称的です!!! また、現在のエンジンの仕様を大幅に変更する必要はありません。短所:より多くの手間、より多くのオブジェクト、そしてもちろん、「キャップ」。写真でわかるように、角は基本的に「キャップ」オブジェクトを求めて泣きます。私は実際にそれでクールです、それを追加するのはそれほど難しくありません。ねえ、私はすでに4つの接続されたキャップで作られた細い柱の計画を持っています。甘い。それでも、視野と視線の問題の可能性については心配があります。

C)総オーバーホールバリアント。

または、ゲームオブジェクトの個別のコンテナーとして境界線とコーナーを作成することもできます。そのように。

第三のアプローチ

長所:よくわかりません。まあ、それは簡単です。間違いなく。短所:オーバーホールが必要です。ありがたいことにコードではなく、現在のゲームメカニックのメンタリティです-それは確かです。利点はそれほど明白ではありません。また、このアプローチは、以前の2つのコンテナよりもはるかに多くのコンテナを必要とします。インデックス作成の数学も少し苦労します。

タイル間に壁を作る3つの異なる方法があります。他に選択肢がある場合は、喜んでチェックします。私が見なかったアプローチのいずれかにメリット/ダウンがある場合-それらを指摘してください。


2
A.2:Aのように、たとえば北と西の2つの側面だけが壁を持つことができます。それがX-Comが使用するアプローチです。
マーティンソイカ

@Martin Sojka南東の角に穴が開いています。それでも、この方法でモデルCを検討することは有用かもしれません。各タイルは、3つの異なる壁要素、noth、west、およびnorth-westコーナーの組み合わせを持つことができます。
aaaaaaaaaaaa

だから壁が見える、私はそれを取る?タイルの端をブロックするだけではありません。オプションBで2つの半分が必要なのはなぜですか?単一の壁だけで、他のタイルの半分のオフセットではないのはなぜですか?
リチャードマースケル-ドラッカー12年

@eBusinessでは、北と西の壁だけを許可する場合、その下のタイルの北と西に壁を置くだけで、南と東の壁をシミュレートできます。
テトラッド

Cに行くことをお勧めします。このjemgine.omnisu.com/wp-content/uploads/2011/06/gnomecolony.pngで私がやっていることはうまくいきます。唯一の問題は、マップの非常に南/東の端です。あなたはそれについて何かしなければなりません。
ブレッキ

回答:


14

メソッド「B」を使用します。

「キャップ」が不要になるのを避けるため、各壁を「1/2壁厚」だけ両方向に延長します。これにより、重なり合う壁が重なりますが、図では既にこれが問題ではないことが示唆されています。

したがって、方法 'B'、写真#3では、水平の壁が少し左に伸び、垂直の壁が少し上に伸びます。

[私はここに新しく、登録したばかりです。元の投稿に[コメントを追加]ボタンが表示されないため、何かが欠けています。それは評判の高い人々の特権ですか?または、私は明白なことを見落としていますか?これを「回答」として追加してすみません。]


1
これは答えであり、コメントするのは100(?)の評価レベルだと思います。Gamedev SEへようこそ!:)
共産主義のダック

2

あなたはキャラクターが壁を含むタイルの上に立つことができることに注意しましたが、各タイルを壁自体として扱うことを考えましたか?水平または垂直の方法で壁としてタイルの半分でも?

長所:計算と配置は簡単で、衝突は簡単で、すべての計算と衝突は壁の配置の座標にのみ基づいています。

短所:実装全体、コード、グラフィックスに影響を与える可能性があります。メソッドを完全に放棄したくはありません。タイルの一部のみが壁である特別なケースも必要です(崖のある過去へのリンク)。

これは、実装をベースにして、今後、タイルを常に参照し、キャラクターの位置とタイルの種類に応じて計算を実行できることを知っている方法です。

城壁は、中央から計算を実行するだけで、通過できないボックスを描画したり、丸い岩の場合は中央から同じ計算を行うことができますが、私のキャラクターはそのように動き回ることができます丸い。


1

申し訳ありませんが、3番目の方法は実際に考える方法です。まあ、あなたはすでにそれを行う能力があるので、次に進んで、他の2つについて考えましょう。

問題は、壁がゼロ幅、2次元(3Dワールドでは高さ*長さ)の正方形であり、2つのボックスを分割していることです。それらをそのように考える必要がありますが、ダンジョンを構築するとき(特に他の人がパーツを構築する可能性がある場合)として、より単純なソリューションを使用することができます。

壁は「幅」があるため、そのコーナー(「キャップ」オブジェクト)が必要なトップダウン2Dゲームのようです。これはもっぱら「グラフィックス」なので、私は次のようなものを選びます:

タイルを含む2Dマップ(タイルのタイプなど)。

2つの壁がある2Dマップ、例 下と右(左の壁は、この左のタイルの「右の壁」になります)。

+すべての壁と「キャップ」などを描くロジック

したがって、ロジックとグラフィックスを分離します。SetWall(ThisTile、LEFT、NOWALL)-> ThisTileの左側のタイルの右壁を "NOWALL"に設定するなどの処理を行う「インターフェイス」を実行できます。

多分これはぼやけているように見えるかもしれませんが、問題は常に一方にロジック(冗長性のない実際のデータ)を、もう一方に「キャップの必要性があるかどうかを計算する「データの描画」 'など

++

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