Come gestisco le piattaforme mobili in un gioco platform?


15

Non voglio usare box2d o altro, voglio solo semplici piattaforme mobili (su-giù, sinistra-destra, diagonali e percorsi circolari). La mia domanda è quella di gestire l'ordine di aggiornamento / gerarchia di controllo in modo che il giocatore rimanga solidamente fissato alla piattaforma, senza rimbalzare o oscillare?

Risposte:


16

La mia soluzione sarebbe quella di trattare ogni entità fisica nella mappa di gioco come un nodo dell'albero e la mappa stessa come nodo principale . I nodi possono contenere altri nodi. Ogni nodo è contenuto (direttamente o indirettamente) all'interno del nodo della mappa.

Ad esempio, supponiamo che il tuo personaggio sia su una piattaforma. Il nodo della piattaforma contiene il nodo del personaggio. Quindi, ogni volta che la piattaforma si sposta, anche i nodi che contiene (in questo caso il personaggio) si sposteranno.

Perché ciò accada, ogni nodo dovrebbe avere una posizione (x, y) rispetto al nodo padre . Ad esempio, il tuo personaggio potrebbe trovarsi in (1,0) rispetto alla piattaforma, che potrebbe trovarsi in (10,10) in relazione alla mappa di gioco. In questo modo, se la piattaforma si muove, il tuo personaggio si muoverà implicitamente.

In questo albero gerarchico, la posizione di ogni nodo è uguale alla somma della sua posizione più ciascuna delle posizioni dei nodi principali. Diciamo che vogliamo ottenere la posizione del personaggio sulla mappa. Calcoliamo:

(posizione del personaggio) + (posizione del nodo padre) + (posizione del nodo radice) = (1,0) + (10,10) + (0,0) = (11,0)

OK, quindi per tutto il tempo il tuo personaggio è rimasto sulla piattaforma. Che ne dici di saltare? Bene, nel momento in cui salta, lo si stacca dalla piattaforma e lo si attacca al nodo contenente la piattaforma ; in questo caso, la mappa (nodo radice).

Quando atterra di nuovo, attaccalo a qualsiasi nodo su cui è atterrato.


1
Vorrei anche usare la velocità xey dal nodo per influenzare il giocatore. Esempio 1: la piattaforma si muove molto velocemente e si ferma, il giocatore ha uno slancio verso l'alto e viene lanciato. Esempio 2: la piattaforma si sta muovendo leggermente più lentamente rispetto alla caduta micidiale del giocatore. La piattaforma dovrebbe essere atterrata al sicuro invece di SPLUT
AttackingHobo

questo è un approccio interessante, ma sembra una vera e propria modifica al mio motore solo per consentire lo spostamento dei platorm. Forse se creo objectOnPlatform come componente che posso per qualsiasi oggetto che dà solo temporaneamente questo effetto?
Iain,

10

Suggerirei di trattare questo come un problema di pseudo-fisica e di risolverlo usando l'attrito del terreno.

Stai già usando la gravità per tenere il personaggio a terra, questo gestisce le situazioni in cui le piattaforme si muovono su e giù. Per gestire il movimento sinistro e destro, il terreno dovrebbe esercitare una grande quantità di attrito sul personaggio. In genere questo livello di attrito sarebbe 1,0 o 100%.

Se il personaggio è fermo, la sua velocità è 0 e invece eredita il 100% della velocità della piattaforma a causa dell'attrito. Qualcosa di simile al seguente:

character_velocity = friction * platform_velocity

Il vantaggio di questo approccio è che si presta facilmente a meccanismi di platforming aggiuntivi, come essere in grado di superare l'attrito su pendii ripidi, permettendo al tuo personaggio di scivolare. Ti consente anche di ridurre facilmente l'attrito per creare ghiaccio su cui scivolerà il personaggio.

È anche più facile affrontare problemi come pareti basse sospese che possono far cadere il tuo giocatore da una piattaforma mobile. Se trattate semplicemente il personaggio come figlio di una piattaforma genitore, ci sono buone probabilità che non interagisca molto facilmente con il resto del rilevamento delle collisioni senza molto lavoro.


0

Potresti fissare la posizione del giocatore non "assoluta nel livello" ma "relativa alla piattaforma", quindi avere una funzione che dia la sua posizione effettiva. Non mi piace però.

Probabilmente sarebbe meglio (e più semplice) legare il giocatore alla piattaforma in modo tale che quando la piattaforma si muove + x / + y, il giocatore si muova altrettanto.

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.