Как мне справиться с движением сверху вниз RPG?

13

У меня есть игра, которую я пишу на Java. Это ролевая игра сверху вниз, и я пытаюсь справиться с движением в мире. Мир в значительной степени процедурный, и мне трудно решать, как управлять движением персонажей по всему миру и отображать изменения на экране. У меня есть мир, загруженный в блоках, который содержит все плитки.

Как мне справиться с движением персонажа?

Я в тупике и не могу понять, куда мне идти с этим.

РЕДАКТИРОВАТЬ : Ну, я был абстрактным с проблемой под рукой.

Прямо сейчас я могу думать только о жестком закреплении всего в 2D-массиве и сохранении идентификатора блока и смещения игрока в блоке, или я могу просто «плавать» все и, так сказать, перемещаться между тайлами.

WarmWaffles
источник

Ответы:

11

Используйте мировые координаты

(Или, как вы говорите, плавать все.)

Координаты мира - это то, с чем вы обычно работаете, и для этого есть множество причин. Это самый простой и интуитивно понятный способ представления вашей позиции в мире и единственный способ действительно сравнить позиции любых двух сущностей в одном мире.

Вы получаете только работу, отслеживая его в отдельных блоках. Ну, одно преимущество - вы можете определить, в каком блоке он находится, но вы уже можете рассчитать его с помощью мировых координат.


Остальная часть этого ответа будет объяснением того, как рассчитать блок мира, в котором находится игрок, на основе его мировых координат.

Я напишу фрагмент кода так, как будто у вас есть двумерный векторный класс с именем 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 функции> вся путаница внутриблочного отслеживания и межблочной передачи

doppelgreener
источник
1
Лучший ответ, чем я искал
WarmWaffles
0

Ваш вопрос немного абстрактен, но, возможно, вы ищете алгоритм поиска пути, я предлагаю A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Это поможет вам переместить плитку вашего персонажа на плитку, если плитка не заблокирована на местности.


источник
1
Это больше о том, как мне решать рендеринг. Сохранять ли идентификатор блока и смещение игрока в каждом блоке?
WarmWaffles