Come creare un rilevamento realistico delle collisioni di giochi di ruolo 2D?


9

Ho sempre desiderato creare un gioco di ruolo 2D vecchio stile come Star Ocean, Final Fantasy, Sword of Mana e persino la serie "Tales of", e immagino che molte persone lo facciano. Ma prima ancora di scrivere una sola riga di codice ho fatto molte ricerche, disegni e prove.

Ho trovato quasi tutte le risposte alle mie domande, ma c'è un problema che non sono stato in grado di risolvere: come si crea un rilevamento delle collisioni realistico ma semplice , come nei giochi che ho nominato prima?

Conosco già diversi modi per calcolare il rilevamento delle collisioni, guarda i seguenti esempi:

Esempi di rilevamento delle collisioni

Nessuno di questi soddisfa i miei bisogni.

  • Le collisioni basate su tessere sono troppo semplici e si adattano più a Zelda che a Star Ocean. Inoltre, il disegno di ogni tessera deve riempire tutto lo spazio per apparire realistico.
  • Pixel-perfect ha troppi vincoli. Se la tua tessera ha qualche pixel qua e là, molto probabilmente il giocatore rimarrà bloccato nel mezzo del nulla (cioè: in alcuni giochi rimani bloccato su una radice dell'albero di 2 pixel di larghezza).
  • E le maschere binarie usano troppa memoria e impostazioni imo.

Ho letto un sacco di documentazione ma non ho mai trovato qualcosa che mi stesse bene. E tutti i miei provini non sembravano simili a quelli con cui giocavo. Quindi, se hai buoni collegamenti o tutorial su come funziona il gioco di ruolo 2D evoluto, per favore fatemelo sapere.


2
Quale ambiente stai sviluppando per quelle maschere di collisione occupano troppa memoria? Questo non è davvero un problema per la maggior parte dei sistemi moderni e le maschere di collisione suonano davvero come quello che stai cercando.
Gregory Avery-Weir,

Sto sviluppando su PC la maggior parte del tempo con XNA, ma recentemente ho pensato di iniziare un progetto su WP7. Il problema che ho avuto con le maschere di collisione era che usando una piccola risoluzione si comportava esattamente come farebbe un pixel perfetto, facendo ad esempio il mio personaggio bloccato in un angolo. Quindi, a meno che non usi la curva di Bézier per movimenti fluidi, devi essere molto attento a come crei la maschera.
Aymeric,

Risposte:


9

I tutorial N possono essere d'aiuto qui. Devo ammettere che sono per un platform in stile arcade, ma funzioneranno altrettanto bene per un gioco di ruolo con vista dall'alto; semplicemente non applicare la gravità. La premessa sta testando la collisione in una raccolta di forme di base: cerchi, scatole di delimitazione allineate agli assi, linee, punti, eccetera.

Quindi in qualche modo decori il tuo mondo con questi (forse tramite un editor di livelli personalizzato), o li generi automaticamente (adatta una casella o un cerchio più vicini) - o entrambi (impostazione predefinita per casella / cerchio generati automaticamente e consenti a un designer di modificare) .

Dove lavoro, abbiamo realizzato diversi platform e alcuni giochi di esplorazione top-down. Li facciamo dai tempi di GBA. Usiamo spesso AABB per personaggi e oggetti, sintonizzabili in un editor di sprite - e impazziamo qui, consentendo una tonnellata di scatole per sprite, alcune con scopi diversi. Potremmo avere:

  • una o più scatole di collisione, descrivendo la forma dell'oggetto per imbattersi in cose;
  • forse molte "scatole di attacco" che nascono solo quando sei nel mezzo di un attacco (e ti animi con lo sprite), forse anche due o tre per arma, a seconda;
  • alcune "scatole vulnerabili" che subiranno danni se colpite dalle scatole di attacco altrui - per impostazione predefinita, utilizziamo la scatola di collisione, ma le scatole vulnerabili tendono a sentirsi meglio quando sono più piccole della scatola di collisione e possiamo consentire per danni in base alla posizione in questo modo
  • una o più "caselle di attivazione" sull'intelligenza artificiale che descrivono la regione di rilevamento dell'IA: attaccheranno se il giocatore si trova in questa regione, ad esempio.

I livelli sono principalmente stringhe di segmenti di linea; abbiamo un po 'di metadati per segmento per descrivere superfici dannose o scivolose, ecc.

Quindi la maggior parte del rilevamento e della risposta delle collisioni diventa AABB-vs-AABB o AABB-vs-segment. Occasionalmente lanciamo un cerchio contro qualcosa per un proiettile, anche se spesso un AABB lo farà anche qui.

Non hai bisogno di molte forme di base per rendere le cose belle e comportarsi bene - alcune lo faranno, a condizione che tu possa modificarle e iterarle.


Inoltre, non sentirti in colpa nel mescolare i sistemi insieme; la collisione basata su piastrelle può essere eccellente in alcune aree (che rappresentano la maggior parte del tuo mondo) ma orribile per le interazioni oggetto-oggetto. Va bene; usa un sistema diverso per oggetto-vs-oggetto! Scrivere per le interazioni tra i due sistemi potrebbe essere più semplice di quanto si pensi.

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.