Jak radzić sobie z odgórnym ruchem RPG?

13

Mam grę, którą piszę w Javie. Jest to odgórna gra RPG i staram się poradzić sobie z ruchem na świecie. Świat jest w dużej mierze proceduralny i mam trudności z zajęciem się sposobem poruszania się postaci na całym świecie i renderowania zmian na ekranie. Mam świat załadowany w blokach, które zawierają wszystkie kafelki.

Jak poradzić sobie z ruchem postaci?

Jestem zakłopotany i nie mogę się zorientować, gdzie powinienem iść.

EDYCJA : Cóż, byłem abstrakcyjny, biorąc pod uwagę ten problem.

W tej chwili mogę myśleć tylko o sztywnym umieszczeniu wszystkiego w tablicy 2D i zapisaniu identyfikatora bloku i przesunięcia odtwarzacza w bloku. Mogłem po prostu „unosić” wszystko i poruszać się między płytkami, żeby tak rzec.

WarmWaffles
źródło

Odpowiedzi:

11

Użyj współrzędnych świata

(Lub, jak to ująłeś, unoś wszystko.)

Współrzędne świata są tym, z czym zwykle pracujesz, i jest wiele powodów. Są to najprostszy i intuicyjny sposób reprezentowania twojej pozycji na świecie i jedyny sposób naprawdę porównania pozycji dowolnych dwóch bytów w tym samym świecie.

Nic nie zyskujesz poza pracą, śledząc go w poszczególnych blokach. Cóż, jedną zaletą jest to, że możesz określić, w którym bloku on jest, ale możesz już to obliczyć za pomocą współrzędnych świata.


Pozostała część tej odpowiedzi będzie wyjaśnieniem, w jaki sposób obliczyć blok świata, w którym znajduje się gracz, na podstawie jego współrzędnych.

Napiszę fragment kodu tak, jakbyś miał klasę wektorów 2D o nazwie Vector2- rodzaj wektora, który znajdziesz w geometrii, a nie Vectortyp listy oferowany przez java.util. Jeśli nie masz żadnych klas geometrycznych Vector, powinieneś znaleźć je online lub napisać je sam (ktoś zna jakieś biblioteki geometrii jakości dla Java?)

Klasa Vector2 będzie miała Xpole i Ypole, które są liczbami publicznymi (nie ma znaczenia, który typ liczbowy tutaj).

// 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 funkcje> cały bałagan śledzenia wewnątrz bloku i przesyłania między blokami

doppelgreener
źródło
1
Lepsza odpowiedź, niż szukałem
WarmWaffles,
0

Twoje pytanie jest nieco abstrakcyjne, ale być może szukasz algorytmu znajdowania ścieżki, proponuję A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Pomoże to przenieść kafelek postaci na kafelek, jeśli kafelek nie jest zablokowanym terenem.


źródło
1
To więcej o tym, jak radzić sobie z renderowaniem. Czy zapisuję identyfikator bloku i przesunięcie odtwarzacza w każdym bloku?
WarmWaffles,