Come gestisco il rilevamento isometrico delle collisioni?


14

Vorrei creare un platform isometrico in stile run-jump. Il giocatore dovrebbe essere in grado di saltare sopra le piattaforme sopra il pavimento, colpire il lato di oggetti ecc.

Userò un motore di gioco 2D, quindi non mi piacerebbe emulare la collisione 3D completa per le dimensioni che non sto usando.

Sto pensando che gli oggetti nel gioco debbano essere posizionati usando: X, Y, larghezza, altezza e Z per la profondità.

Utilizzando questi valori, come devo rilevare le collisioni?


So che questa è una domanda generale, ma vorrei risposte più dettagliate o collegamenti a buone risorse di apprendimento.
jdeseno,

Risposte:


19

2 opzioni:

  • Potresti trattarlo come un gioco 3D con una fotocamera ortografica fissa. Quindi è possibile utilizzare qualsiasi risorsa / libro / tutorial / libreria di giochi 3D standard. Anche se reso in 2D con sprite, la matematica per il movimento ecc. Sarebbe comunque 3D dietro la scena. Questo ti darebbe i risultati più accurati.

  • Potresti trattarlo come un gioco 2D dall'alto verso il basso, con una proprietà di altezza aggiunta. Ad esempio, immagina una griglia 2D in cui ogni riquadro ha un valore di altezza. Quando ti sposti da una tessera all'altra, lasci che un personaggio passi a una tessera particolare solo se i suoi piedi sono al di sopra o uguali all'altezza di quella tessera, ma se saltano e la gravità li abbassa sopra una tessera, tu lasciali rimanere lì. Con un po 'più di lavoro potresti farlo in modo da poter camminare sotto i ponti ecc.


4

Ci sono molti modi per semplificare questo. Ad esempio, se non si consentivano i livelli (ad esempio un ponte su cui si può camminare sopra e sotto, è possibile eseguire tutto il rilevamento delle collisioni nelle dimensioni X / Y, dove si filtra il set di collisioni su qualsiasi altezza + profondità o più alto.


2

Se il gioco si basa su una griglia rettangolare, questa griglia definisce i tuoi assi X / Y. E Z può essere usato per l'altezza.

Le collisioni sono quindi più o meno facili come qualsiasi gioco basato su tessere 2D.

Quindi devi solo convertire dalla griglia in coordinate dello schermo isometriche per il rendering. Questo è abbastanza semplice, ma potrebbe essere necessario pensare al calcolo dei valori di "profondità", ai fini dell'ordinamento (rendering della scena isometrica da dietro a fronte)


L'uso di Z per l'altezza va contro l'istinto, ma è la cosa giusta da fare nei giochi 2D dall'alto verso il basso. quindi puoi riutilizzare il codice tra i giochi side-on e top-down.
Iain,

2

Cercando su Google trovo questa demo: http://planetskill.com/iso/

WASD per muoversi. Barra spaziatrice per saltare

Implementa solo la collisione con l'asse su / giù, ma aggiungere l'altra collisione dovrebbe essere facile:

Se la posizione su / giù del passaggio successivo è superiore al massimo, non spostarti. Ciò dovrebbe anche consentire di implementare il salto in modo semplice.

Codice di esempio qui: http://gist.github.com/478997


2

Tutti i precedenti. Isometrica è solo una griglia tridimensionale tratteggiata, quindi trattala come una piastrella 2D e pensa a un modo per codificare la profondità. Come lo faresti in un normale gioco 2d (essere in grado di andare dietro o davanti ai blocchi quando si "salta"? Memorizzeresti una profondità per riquadro (buffer di profondità-> buffer z) o utilizzeresti più livelli oppure, se desideri più elaborato, implementeresti un callback per tiletype (o mapposition) e saresti in grado di fare quello che vuoi, controllare la profondità, controllare l'equipaggiamento, deformare il giocatore in giro, far muovere lentamente il lettore verso l'alto, formattare HD.


Buona risposta Kaj - essendo questo il nocciolo della questione, sono sorpreso che nessun altro l'abbia sollevato. Questa è sempre la cosa che confonde i neofiti sull'isometria, per quanto riguarda la fisica.
Ingegnere

1

Bene, potresti avere un livello di collisione separato sopra il tuo livello che non è visibile e usarlo per verificare la collisione. Puoi anche usarlo per più livelli fintanto che sai su quale livello è il giocatore;)

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.