世界座標を使用する
(または、あなたがそれを置くとき、すべてを浮かせる。)
世界座標は一般的にあなたが扱うものであり、その理由はたくさんあります。これらは、世界での自分の位置を表す最もシンプルで直感的な方法であり、同じ世界の任意の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つの機能>ブロック内トラッキングとブロック間転送のすべての混乱