Як вирішити рух RPG?


13

У мене є гра, яку я пишу на Java. Це RPG зверху вниз, і я намагаюся впоратися з рухом у світі. Світ значною мірою є процедурним, і мені важко вирішувати, як керувати рухом персонажів по всьому світу та відображати зміни на екрані. У мене світ завантажений в блоки, які містять усі плитки.

Як вирішити рух персонажа?

Я спотикається і не можу зрозуміти, куди мені піти з цим.

EDIT : Добре, що я був абстрактним з питань, що стояв.

Зараз я можу лише думати про жорстке вставлення всього в 2D масив і збереження ідентифікатора блоку та зміщення програвача в блоці, або я міг просто "плавати" все і рухатись між плитками, так би мовити.

Відповіді:


11

Використовуйте світові координати

(Або, як ви сказали, пливіть все.)

Світові координати - це те, з чим ти зазвичай працюєш, і для цього є маса причин. Вони є найпростішим та інтуїтивно зрозумілим способом представлення своєї позиції у світі та єдиним способом реального порівняння позицій будь-яких двох сутностей в одному світі.

Ви нічого не отримуєте, окрім роботи, відстежуючи його в окремих блоках. Що ж, одна з переваг полягає в тому, щоб ви визначили, у якому блоці він знаходиться, але ви вже можете це обчислити за світовими координатами.


Решта цієї відповіді буде поясненням того, як обчислити світовий блок, на якому грає, грунтуючись на його світових координатах.

Я напишу фрагмент коду так, як якщо б у вас був названий двовимірний векторний клас 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
Це скоріше, як я вирішувати візуалізацію. Чи зберігати ідентифікатор блоку та компенсацію програвача у кожному блоці?
WarmWaffles
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.