Come affrontare il movimento RPG top down?


13

Ho un gioco che sto scrivendo in Java. È un gioco di ruolo top-down e sto cercando di gestire il movimento nel mondo. Il mondo è in gran parte procedurale e sto attraversando un momento difficile affrontare come gestire il movimento dei personaggi in tutto il mondo e apportare le modifiche allo schermo. Ho il mondo caricato in blocchi che contiene tutte le tessere.

Come affrontare il movimento del personaggio?

Sono perplesso e non riesco a capire dove dovrei andare con esso.

EDIT : Beh, ero astratto con il problema a portata di mano.

In questo momento posso solo pensare di incollare tutto rigidamente in un array 2D e salvare l'ID del blocco e l'offset del giocatore nel Blocco o potrei semplicemente "fluttuare" tutto e spostarmi tra le tessere per così dire.

Risposte:


11

Usa coordinate mondiali

(O mentre lo metti, fai galleggiare tutto.)

Le coordinate del mondo sono ciò con cui generalmente lavori e ci sono molte ragioni per questo. Sono il modo più semplice e intuitivo di rappresentare la tua posizione nel mondo e l'unico modo per confrontare realmente le posizioni di due entità nello stesso mondo.

Non ottieni altro che lavorare facendolo rintracciare all'interno di singoli blocchi. Bene, un vantaggio è che puoi determinare in quale blocco si trova, ma puoi già calcolarlo con le coordinate del mondo.


Il resto di questa risposta sarà una spiegazione di come calcolare il blocco del mondo in cui si trova un giocatore in base alle sue coordinate mondiali.

Scriverò lo snippet di codice come se avessi una classe vettoriale 2D chiamata Vector2- il tipo di vettore che trovi nella geometria, non il Vectortipo di elenco offerto da java.util. Se non hai classi Vector geometriche, dovresti trovarne alcune online o scriverne alcune tu stesso (qualcuno conosce librerie di geometria di qualità per Java?)

La classe Vector2 avrà un Xcampo e un Ycampo, che sono numeri pubblici (non importa quale tipo numerico qui).

// 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 funzioni> tutto il caos del tracciamento all'interno del blocco e del trasferimento tra i blocchi


1
Risposta migliore di quella che cercavo
WarmWaffles

0

La tua domanda è un po 'astratta ma forse stai cercando un algoritmo di ricerca del percorso, suggerisco A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Questo ti aiuterà a spostare la tessera personaggio su tessera se la tessera non è bloccata sul terreno.


1
È più di come affrontare il rendering. Salvare l'ID blocco e l'offset del giocatore in ciascun blocco?
WarmWaffles
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.