Используйте мировые координаты
(Или, как вы говорите, плавать все.)
Координаты мира - это то, с чем вы обычно работаете, и для этого есть множество причин. Это самый простой и интуитивно понятный способ представления вашей позиции в мире и единственный способ действительно сравнить позиции любых двух сущностей в одном мире.
Вы получаете только работу, отслеживая его в отдельных блоках. Ну, одно преимущество - вы можете определить, в каком блоке он находится, но вы уже можете рассчитать его с помощью мировых координат.
Остальная часть этого ответа будет объяснением того, как рассчитать блок мира, в котором находится игрок, на основе его мировых координат.
Я напишу фрагмент кода так, как будто у вас есть двумерный векторный класс с именем Vector2
- тип вектора, который вы найдете в геометрии, а не Vector
тип списка, предлагаемыйjava.util
. Если у вас нет геометрических классов Vector, вы должны найти некоторые онлайн или написать несколько самостоятельно (кто-нибудь знает какие-либо качественные геометрические библиотеки для 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 функции> вся путаница внутриблочного отслеживания и межблочной передачи
Ваш вопрос немного абстрактен, но, возможно, вы ищете алгоритм поиска пути, я предлагаю A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Это поможет вам переместить плитку вашего персонажа на плитку, если плитка не заблокирована на местности.
источник