トップダウンRPGの動きに取り組むにはどうすればよいですか?


13

Javaで書いているゲームがあります。それはトップダウンRPGであり、私は世界の動きを処理しようとしています。世界の大部分は手続き型であり、私は世界中のキャラクターの動きを処理し、画面に変更をレンダリングする方法に取り組むのに苦労しています。私はすべてのタイルを含むブロックにロードされた世界を持っています。

キャラクターの動きにどのように取り組むのですか?

私は困惑し、どこに行けばいいのかわかりません。

編集:まあ私は手元の問題で抽象的だった。

今のところ、すべてを厳密に2D配列に固定し、ブロック内のブロックIDとプレーヤーオフセットを保存することしか考えられません。

回答:


11

世界座標を使用する

(または、あなたがそれを置くとき、すべてを浮かせる。)

世界座標は一般的にあなたが扱うものであり、その理由はたくさんあります。これらは、世界での自分の位置を表す最もシンプルで直感的な方法であり、同じ世界の任意の2つのエンティティの位置を実際に比較する唯一の方法です。

あなたは彼が個々のブロック内で追跡されるようにすることで、仕事以外の何も得ません。さて、1つの利点は、彼がどのブロックにいるかを判断できることですが、ワールド座標で既に計算できます。


この回答の残りの部分では、プレイヤーのワールド座標に基づいて、プレイヤーがいるワールドブロックを計算する方法について説明します。

コードスニペットは、2D ベクトルクラスという名前があるように記述します。Vector2これは、でVector提供されるリストタイプではなく、ジオメトリで見つけるベクトルの種類ですjava.util。ジオメトリックベクタークラスがない場合は、オンラインで見つけるか、自分で書く必要があります(Javaの高品質なジオメトリライブラリを知っている人はいますか?)

Vector2クラスには、パブリック番号であるXフィールドとYフィールドがあります(ここでどの数値タイプでもかまいません)。

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2つの機能>ブロック内トラッキ​​ングとブロック間転送のすべての混乱


1
私が探していたよりも良い答え
-WarmWaffles

0

あなたの質問は少し抽象的ですが、おそらくパス検索アルゴリズムを探しています。A*(http://en.wikipedia.org/wiki/A*_search_algorithm)をお勧めします。これは、タイルが地形をブロックしていない場合にキャラクタータイルをタイルに移動するのに役立ちます。


1
レンダリングに取り組む方法の詳細です。各ブロックにブロックIDとプレーヤーオフセットを保存しますか?
ウォームワッフル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.