3

私は何年もの間 Web 開発を行ってきましたが、ゆっくりとゲーム開発に関与するようになりました。現在のプロジェクトでは、このアイソメトリック マップがあり、アルゴリズムを使用してどのフィールドがクリックされているかを検出する必要があります。ちなみに、これはすべてJavascriptを使用したブラウザにあります。

マップこの
ように見えます。フィールド (タイル) の構造とそれらの ID を示すためにいくつかの数字を追加しました。すべてのフィールドには中心点 (x、y の配列) があり、描画時の 4 つのコーナーの基になります。 ご覧のとおり、これはひし形ではなく、ジグザグ マップであり、角度がありません (上から見た図)。これが、すべての記事と計算が通常ひし形に基づいていることを考えると、自分で答えを見つけることができない理由です。角度付き。

数字
これはダイナミック マップであり、すべてのサイズと数字を変更して新しいマップを生成できます。
大量のデータではないことはわかっていますが、マップはマップとフィールド サイズに基づいて生成されます。
- マップ サイズ: x:800 y:400
- フィールド サイズ: 80x80 (コーナー間)
- すべてのフィールドの中心位置 (x,y)

目標
特定のイベント (クリック、移動など) でマウスがどのフィールドにあるかをクライアント (ゲーム) に伝えるアルゴリズムを考え出すこと。

免責事項
私はすでに自分で実用的な解決策を思いついたことを述べたいと思いますが、より良い方法でそれを書くことができると100%確信しています(私の解決策にはネストされたif文とループがたくさん含まれています)、そしてそれが私がここで尋ねる理由です。

これは私の解決策の例です。基本的に、最も近い4つの既知の位置にコーナーがある正方形を見つけ、次に最も近い2つのフィールド間の最小の正方形に基づいて結果を取得しますそれは意味がありますか?

私が何かを逃したかどうか尋ねてください。

4

3 に答える 3

2

これが私が思いついたものです、

function posInGrid(x, y, length) {
xFromColCenter = x % length - length / 2;
yFromRowCenter = y % length - length / 2;
col = (x - xFromColCenter) / length;
row = (y - yFromRowCenter) / length;
if (yFromRowCenter < xFromColCenter) {
    if (yFromRowCenter < (-xFromColCenter))--row;
    else++col;
} else if (yFromRowCenter > xFromColCenter) {
    if (yFromRowCenter < (-xFromColCenter))--col;
    else++row;
}
return "Col:"+col+", Row:"+row+", xFC:"+xFromColCenter+", yFC:"+yFromRowCenter;
}

X と Y は画像の座標で、長さはグリッドの間隔です。

現在、テスト用に文字列を返します。結果は行と列である必要があり、それらは私が選択した座標です。タイル 1 の座標は (1,0) タイル 2 は (3,0)、タイル 10 は ( 0,1)、タイル 11 は (2,1) です。私の座標を 1 行または 2 行で番号付きのタイルに変換できます。

テスト用の JSFiddle http://jsfiddle.net/NHV3y/

乾杯。

編集: return ステートメントを変更し、デバッグに使用したいくつかの変数を残しました。

于 2011-04-11T09:19:43.807 に答える
0

私が過去に使用したヒット検出のピクセルパーフェクトな方法(OpenGLで、しかし概念はここにもあります)は、さまざまなオブジェクトがさまざまな色で識別されるシーンのオフスクリーンレンダリングです。

このアプローチでは、2倍のメモリと2倍のレンダリングが必要ですが、任意に複雑なシーンのヒット検出は、単純なカラールックアップで実行されます。

グリッド内のセルを検出したいので、おそらくより効率的な解決策がありますが、単純さと柔軟性のためにこれについて言及したいと思います。

于 2011-04-10T13:30:44.680 に答える
-1

これは以前に解決されました、私のメモを調べさせてください...

ここにいくつかの良いリソースがあります:

Laserbrain Studiosから、アイソメプログラミングの基礎

ここに投稿されたスレッドのJavaでの有用な記事

これが役に立ったら教えてください、そしてあなたのゲームで頑張ってください!

このコードは、不均一な間隔が与えられた場合のグリッド内の位置を計算します。かなり速いはずです。ほとんどすべての操作は、1つのループを使用して数学的に実行されます。問題の他の部分については後で考えます。

def cspot(x,y,length):
    l=length
    lp=length+1
    vlist = [ (l*(k%2))+(lp*((k+1)%2)) for k in range(1,y+1) ]
    vlist.append(1)
    return x + sum(vlist)
于 2011-04-10T13:32:54.633 に答える