¿Cómo abordo el movimiento RPG de arriba hacia abajo?


13

Tengo un juego que estoy escribiendo en Java. Es un juego de rol de arriba hacia abajo y estoy tratando de manejar el movimiento en el mundo. El mundo es en gran parte procesal y estoy teniendo dificultades para abordar cómo manejar el movimiento de los personajes en todo el mundo y mostrar los cambios en la pantalla. Tengo el mundo cargado en bloques que contiene todas las fichas.

¿Cómo abordo el movimiento del personaje?

Estoy perplejo y no puedo entender a dónde debo ir con él.

EDITAR : Bueno, yo era abstracto con el tema en cuestión.

En este momento solo puedo pensar en pegar rígidamente todo en una matriz 2D y guardar la ID del bloque y el desplazamiento del jugador en el Bloque o podría simplemente "flotar" todo y moverme entre las fichas, por así decirlo.

Respuestas:


11

Usar coordenadas mundiales

(O como lo pones, flota todo).

Las coordenadas mundiales son con lo que generalmente trabajas, y hay muchas razones para eso. Son la forma más simple e intuitiva de representar su posición en el mundo, y la única forma de comparar realmente las posiciones de dos entidades en el mismo mundo.

No ganas nada más que trabajo haciendo que lo rastreen dentro de bloques individuales. Bueno, una ventaja es que puedes determinar en qué bloque está, pero ya puedes calcular eso con coordenadas mundiales.


El resto de esta respuesta será una explicación de cómo calcular el bloque mundial en el que se encuentra un jugador según sus coordenadas mundiales.

Escribiré el fragmento de código como si tuviera una clase de vector 2D llamada Vector2: el tipo de vector que encuentra en geometría, no el Vectortipo de lista ofrecido por java.util. Si no tiene clases de vectores geométricos, debería encontrar algunas en línea o escribirlas usted mismo (¿alguien conoce alguna biblioteca de geometría de calidad para Java?)

La clase Vector2 tendrá un Xcampo y un Ycampo, que son números públicos (no importa qué tipo numérico aquí).

// 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 funciones> todo el desorden del seguimiento dentro del bloque y la transferencia entre bloques


1
Mejor respuesta de la que estaba buscando
WarmWaffles

0

Su pregunta es un poco abstracta, pero tal vez esté buscando un algoritmo de búsqueda de ruta, sugiero A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Esto te ayudará a mover tu ficha de personaje a ficha si la ficha no es terreno bloqueado.


1
Es más sobre cómo abordo el renderizado. ¿Guardo la ID del bloque y el desplazamiento del jugador en cada bloque?
WarmWaffles
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.