Movimento RPG top down con correzione?


27

Spero che tutti abbiamo giocato a Zelda: A Link to the Past, per favore correggimi se sbaglio, ma voglio emulare quel tipo di movimento di personaggi 2D dall'alto verso il basso con un tocco di correzione. È stato fatto in altri giochi, ma ritengo che questo riferimento sia il più facile da mettere in relazione. Più specificamente il tipo di movimento e correzione di cui sto parlando è:

  • Il movimento fluttuante non si limita al movimento basato su tessere come Pokemon e altri giochi in cui un tocco del pad di movimento ti sposta di un quadrato in quella direzione cardinale. Questo movimento fluttuante dovrebbe essere in grado di ottenere un movimento diagonale.
  • Se cammini verso ovest e raggiungi un muro diagonale in modo nord-est / sud-ovest, verrai corretto in un movimento sud-ovest anche se continui a tenere la sinistra (ovest) sul controller. Questo dovrebbe funzionare per entrambe le diagonali correggendo in entrambe le direzioni.
  • Se sei a pochi pixel dal camminare dritto in una porta o in un corridoio, sei corretto nel camminare attraverso la sala o giù per il corridoio, vale a dire urtare un angolo ti fa spingere nella sala / porta.

Ho cercato modi efficaci per raggiungere questo obiettivo e non ho avuto fortuna. Per essere chiari, sto parlando del movimento del personaggio umano, non del movimento di un NPC. Le loro risorse sono disponibili su questo tipo di movimento? Equazioni o algoritmi spiegati su una wiki o qualcosa del genere?

Sto usando XNA Framework, c'è qualcosa per aiutarci in questo?

Risposte:


23

Bene, il primo punto elenco è facile. Devi semplicemente archiviare e manipolare la posizione del personaggio in coordinate globali o pixel anziché coordinate basate su piastrelle. Se avessi un problema con questo, potrebbe essere dovuto a una scelta confusa di rappresentazione per il tuo mondo e lo spazio delle piastrelle, quindi forse dovresti pubblicare maggiori dettagli al riguardo / porre una domanda separata e specifica.

Per il secondo punto, l'approccio più diretto sarebbe quello di prendere il vettore di movimento (normalizzato) del giocatore e aggiungerlo al vettore normale del muro, quindi rinormalizzare. Il segno dei componenti del vettore risultante indicherà come il muro si collega al movimento del giocatore mentre il vettore stesso indica quale direzione il giocatore può ora muovere.

Per il terzo punto, supponendo che tu abbia rettangoli di collisione sia per il muro che per il giocatore, dovresti essere in grado di determinare la quantità di contatto del rettangolo di collisione del giocatore con il rettangolo di collisione del muro. Se, ad esempio, il giocatore si sta muovendo a destra e colpisce un muro verticale, si confrontano le estensioni dell'asse Y dei rettangoli di collisione - se se l'estensione del giocatore supera l'estensione del muro di una certa soglia, si dice che il 75% dell'Y del giocatore estensione dell'asse, quindi "imbroglia" il giocatore verso la porta.

Ho fatto un bel numero di ipotesi qui su come il tuo modello a oggetti appare nel tuo codice e quali tecniche hai scelto, in gran parte a causa della generalità della tua domanda. Ho provato a suggerire approcci semplici (anche se forse non ottimali) per lo stesso motivo. Se puoi fornire informazioni più specifiche, in questa domanda o in una nuova, posso provare a fornire maggiori dettagli o un'idea migliore.


Sì, far girare il personaggio non era un problema. Solo per assicurarsi che la gente vedesse che era un requisito. Mi hai dato la risposta chiave: piastrelle con vettori! Non posso credere di non averci pensato. Grazie.
Corey Ogburn,

In zelda , c'era solo un angolo in cui potevano trovarsi, quindi non era necessario calcolare i vettori normali, era solo un caso speciale nel codice.
BlueRaja - Danny Pflughoeft

Non capisco come dai a una tessera un vettore. Come sarebbe?
prova il

Una tessera presumibilmente ha già dati come la sua grafica, che sia passabile o meno, ecc. Questo è solo un altro campo. Ad esempio: struct Tile {vector2 normal; ...} Il valore del normale dovrebbe venire con i dati che definiscono la tessera
Josh,

@JoshPetrie Revisting this. Una piastrella che può essere scontrata in più direzioni non dovrebbe avere più vettori? Non sono sicuro di capire come una tessera possa avere un singolo vettore.
prova l'

4

Come possibile risposta per il secondo punto è proiettare il vettore di movimento del giocatore lungo il vettore del muro usando un prodotto punto (ab * normalizzato (b)). Quindi ottieni un vettore che ti dice fino a che punto spostare il giocatore nella direzione del muro, e se sposti il ​​giocatore di quel vettore, ottieni una "diapositiva" lungo il muro. Ha funzionato bene per me in un precedente progetto di gioco.


3

Ottima risposta per Josh, ma aggiungerò alcuni suggerimenti: - Per maggiori informazioni su come scivolare contro i muri, controlla la mia domanda - da questa risposta sono riuscito a farlo funzionare davvero bene. - Se non sbaglio, quando si sale sullo schermo il collegamento faciliterà l'allineamento all'intero quadrato della griglia orizzontale più vicino. In questo modo quando arrivi alle porte hai maggiori probabilità di essere correttamente allineato (potrebbe essere sbagliato). - Per facilitare l'accesso alle porte, assicurati che la scatola di collisione del tuo personaggio sia molto più piccola della larghezza della porta.


O forse la scatola delle collisioni può essere un cerchio?
Oskar Duveborn,

2

Per correggere l'ingresso di porte, è possibile rendere l'oggetto di collisione per la porta leggermente più grande dell'immagine della porta. Ciò comporterebbe lo stesso effetto proposto da Josh, ma senza dover calcolare la vicinanza al rettangolo di collisione del muro.

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.