Comment aborder le mouvement RPG de haut en bas?


13

J'ai un jeu que j'écris en Java. C'est un RPG de haut en bas et j'essaie de gérer le mouvement dans le monde. Le monde est en grande partie procédural et j'ai du mal à gérer la façon de gérer les mouvements des personnages dans le monde et de rendre les modifications à l'écran. J'ai le monde chargé en blocs qui contient toutes les tuiles.

Comment aborder le mouvement des personnages?

Je suis perplexe et je n'arrive pas à comprendre où je dois aller.

EDIT : Eh bien, j'étais abstrait avec le problème à portée de main.

À l'heure actuelle, je ne peux que penser à tout coller de manière rigide dans un tableau 2D et à enregistrer l'ID du bloc et le décalage du lecteur dans le bloc ou je pourrais simplement "flotter" tout et me déplacer entre les tuiles pour ainsi dire.

Réponses:


11

Utiliser les coordonnées mondiales

(Ou comme vous le dites, faites tout flotter.)

Les coordonnées mondiales sont ce avec quoi vous travaillez généralement, et il y a beaucoup de raisons à cela. Ils sont le moyen le plus simple et intuitif de représenter votre position dans le monde, et le seul moyen de vraiment comparer les positions de deux entités dans le même monde.

Vous ne gagnez rien d'autre que du travail en le faisant suivre dans des blocs individuels. Eh bien, un avantage est que vous pouvez déterminer dans quel bloc il se trouve, mais vous pouvez déjà le calculer avec les coordonnées du monde.


Le reste de cette réponse sera une explication de la façon de calculer le bloc du monde dans lequel se trouve un joueur en fonction de ses coordonnées mondiales.

J'écrirai l'extrait de code comme si vous aviez une classe de vecteurs 2D nommée Vector2- le type de vecteur que vous trouvez en géométrie, pas le Vectortype de liste proposé par java.util. Si vous n'avez pas de classes vectorielles géométriques, vous devriez en trouver en ligne ou en écrire vous-même (quelqu'un connaît des bibliothèques de géométrie de qualité pour Java?)

La classe Vector2 aura un Xchamp et un Ychamp, qui sont des nombres publics (peu importe le type numérique ici).

// 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 fonctions> tout le désordre du suivi intra-bloc et du transfert inter-bloc


1
Meilleure réponse que je ne cherchais
WarmWaffles

0

Votre question est un peu abstraite mais vous cherchez peut-être un algorithme de recherche de chemin, je suggère A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Cela vous aidera à déplacer votre tuile personnage vers la tuile si la tuile n'est pas un terrain bloqué.


1
Il s'agit plus de savoir comment aborder le rendu. Dois-je enregistrer l'ID de bloc et le décalage du joueur dans chaque bloc?
WarmWaffles
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.