¿Qué debo hacer para evitar que mis monstruos salgan de las plataformas?

8

Tengo una pregunta que me está volviendo loco porque creo que debería ser bastante fácil encontrar un tutorial al respecto. Actualmente estoy usando XNA y Farseer para crear un juego de plataformas simple. Estoy a punto de terminar, pero quiero que mis monstruos sean más inteligentes. En este caso, eso significa que no quiero que mis monstruos se caigan de los acantilados.

En pocas palabras, quiero algo que verifique el área frente a mi "monstruo" para determinar cuándo el monstruo debe cambiar de dirección. ¿Podrían ustedes señalarme en la dirección correcta?

¿Qué se supone que debo usar? Debe existir una solución simple o un algoritmo simple para verificar esto, ¿no?

Daniel Figueroa
fuente

Respuestas:

17

Nunca antes había trabajado con XNA y creo que aparecerán mejores soluciones que las mías. Pero una solución alternativa que podría funcionar es que podrías poner un objeto invisible en los extremos de los acantilados y el monstruo podría verificar la colisión con ese objeto. Si choca, entonces cambia de dirección.

gmemario
fuente
2
Simple y elegante, +1
Valmond
Esa es una buena solución. Farseer admite " sensores ", así que úsalos en los acantilados.
bummzack
Realmente me gusta tu respuesta, así que no quiero contender. También podría usar el mosaico inferior izquierdo / derecho (dependiendo de la dirección del movimiento), que es una solución más 'obvia'.
Jonathan Dickinson
1
El problema principal con una solución como esta es que tienes que colocar un obstáculo para cada acantilado. Si hay pocos en el juego, entonces puede estar bien, pero de lo contrario, puede llevar mucho tiempo y puede perderse algunos acantilados.
AlbeyAmakiir
44
@AlbeyAmakiir Bueno, también puedes cambiar esto y poner un sensor en la parte inferior delante del jugador (que se mueve con el jugador). Tan pronto como este sensor deja de registrar colisiones, estás en un acantilado.
bummzack
7

Una forma ingenua de implementarlo es mediante el uso de raycasting.

Calcule dónde estará su monstruo en un poco de tiempo (probablemente un cuadro). Desde esa posición (o si quieres ser más robusto, esa posición +/- el área límite de tu enemigo) haz un rayo hacia abajo. Si no golpea algo dentro de un rango apropiado (dependiendo de dónde comience su emisión de rayos verticalmente, la altura del personaje, su "tamaño de paso" deseado, etc.) puede darse cuenta de que hay un acantilado donde el personaje quiere estar, y decide cambiar de dirección apropiadamente.

Tétrada
fuente
1

Con mi IA, simplemente verifico si hay una plataforma debajo y en la dirección de su viaje (sin usar un sistema de mosaico, solo un maravilloso sistema de colisión). Si no lo hay, o si golpea un bloque sólido, obtiene una mirada confusa y gira.

De esta manera, puede tener mapas dinámicos y aún tener una IA que funcione (término usado libremente).

ultifinitus
fuente
0

Sospecho que está utilizando un mapa de mosaicos, en cuyo caso la solución sería hacerlo en función de los índices de mosaicos. Debes encontrar en qué mosaico está actualmente tu monstruo, con las siguientes fórmulas:

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Una vez que sepa esto, debe encontrar en qué dirección X va (para verificar si hay bloques por delante):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Ahora tiene una dirección X normalizada para trabajar.

A continuación, querrá verificar los bloques para ver si debe cambiar de dirección:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Tienes la idea general. Asegúrate de regresar TileCollision.Impassable(o lo que sea) si los índices de mosaico están fuera del mapa, para evitar que tu programa se bloquee con un índice no válido, y también evita que los monstruos salgan del mapa.

Supongo que realmente depende de la forma en que manejas los mosaicos, pero esta es la solución que funcionó para mí.

Basado en los tutoriales de http://www.sgtconker.com/ (aunque el sitio web está inactivo mientras escribo esto)

Jesse Emond
fuente
0

Establece una caja en el exterior de la plataforma que esté en una capa separada, y haz que los monstruos lo comprueben para que no se caigan, pero el jugador aún puede hacerlo.

Darren
fuente
Creo que esta es la misma respuesta que dio Gilson.
Richard Marskell - Drackir
ya lo ves bien
Darren