Cosa devo fare per impedire ai miei mostri di uscire dalle piattaforme?


8

Ho una domanda che mi sta facendo impazzire perché penso che dovrebbe essere abbastanza facile trovare un tutorial su di esso. Attualmente sto usando XNA e Farseer per creare un semplice gioco platform. Sto per finirlo, ma voglio che i miei mostri siano più intelligenti. In questo caso ciò significa che non voglio che i miei mostri cadano dalle scogliere.

Per dirla semplicemente, voglio qualcosa che controlli l'area di fronte al mio "mostro" per determinare quando il mostro dovrebbe cambiare direzione. Ragazzi, potreste indicarmi la giusta direzione?

Cosa dovrei usare, dovrebbe esserci una soluzione semplice o un semplice algoritmo per controllare questo, no?

Risposte:


17

Non ho mai lavorato con XNA prima e penso che sembreranno soluzioni migliori delle mie. Ma una soluzione alternativa che potrebbe funzionare è che potresti mettere un oggetto invisibile agli estremi delle scogliere e il mostro potrebbe verificare la collisione con quell'oggetto. Se si scontra, cambia direzione.


2
Semplice ed elegante, +1
Valmond,

Questa è una buona soluzione. Supporta " sensori " più deboli , quindi usali sulle scogliere.
bummzack,

Mi piace molto la tua risposta, quindi non voglio contestarla. Potrebbe anche usare la tessera in basso a sinistra / a destra (a seconda della direzione del movimento), che è una soluzione più "ovvia".
Jonathan Dickinson,

1
Il problema principale con una soluzione come questa è che devi porre un ostacolo per ogni scogliera. Se ce ne sono pochi nel gioco, allora potrebbe essere ok, ma per il resto, potrebbe richiedere molto tempo e potresti perdere alcune scogliere.
AlbeyAmakiir,

4
@AlbeyAmakiir Bene, puoi anche scambiarlo e posizionare un sensore in basso davanti al giocatore (che si muove con il giocatore). Non appena questo sensore smette di registrare le collisioni, sei su una scogliera.
Bummzack,

7

Un modo ingenuo di implementarlo è usando il raycasting.

Calcola dove sarà il tuo mostro in un po 'di tempo (probabilmente un frame). Da quella posizione (o se vuoi essere più robusto, quella posizione +/- l'area di delimitazione del tuo nemico) effettua un raycast verso il basso. Se non colpisce qualcosa all'interno di un intervallo appropriato (a seconda di dove inizi il tuo raycast in verticale, l'altezza del personaggio, la "dimensione del passo" desiderata, ecc.) Puoi immaginare che c'è una scogliera dove il personaggio vuole essere, e decidere di cambiare direzione in modo appropriato.


1

Con la mia IA, controllo semplicemente se c'è una piattaforma sotto e int nella direzione della sua corsa (non usando un sistema di tessere, solo un sistema di collisione groovy). Se non c'è - o se colpisce un blocco solido, ottiene uno sguardo confuso e si gira.

In questo modo puoi avere mappe dinamiche e avere ancora un'intelligenza artificiale funzionante (termine usato in modo approssimativo).


0

Ho il sospetto che tu stia usando una mappa delle tessere, nel qual caso la soluzione sarebbe quella di farlo in base agli indici delle tessere. Devi trovare su quale tessera il tuo mostro si trova attualmente, con le seguenti formule:

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

Una volta che li conosci, devi trovare in quale direzione X stai andando (per verificare la presenza di blocchi avanti):

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

Ora hai una direzione X normalizzata con cui lavorare.

Successivamente, ti consigliamo di controllare i blocchi in giro per vedere se dovresti cambiare direzione:

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

Hai un'idea generale. Assicurati di tornare TileCollision.Impassable(o qualsiasi altra cosa) se gli indici delle tessere si trovano all'esterno della mappa, per evitare che il tuo programma si blocchi con un indice non valido e impedisca anche ai mostri di uscire dalla mappa.

Immagino che dipenda davvero dal modo in cui gestisci le piastrelle, ma questa è la soluzione che ha funzionato per me.

Basato sui tutorial su http://www.sgtconker.com/ (anche se il sito Web non funziona mentre lo scrivo)


0

Posiziona una scatola all'esterno della piattaforma che si trova su un livello separato e fai controllare i mostri, in modo che non cadano ma il giocatore può ancora.


Penso che questa sia la stessa risposta che Gilson ha dato.
Richard Marskell - Drackir

stai guardando bene
Darren,
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.