Domanda

Ho un personaggio che dice, 20 per 10 pixel di grandi dimensioni e ho una mappa di collisione basata su pixel (pensa ai vermi).

Qual è il modo migliore per tracciare la collisione per il personaggio dato una velocità maggiore di 1 pixel per fotogramma. C'è una soluzione migliore che iterare attraverso ogni pixel lungo il vettore di velocità?

Lo sto facendo a Lua (Love 2D) ma una soluzione generica sarebbe l'ideale.

È stato utile?

Soluzione

Combinerei la collisione della scatola di delimitazione e la collisione della perfezione dei pixel.

Quindi tutte le entità del tuo gioco avrebbero scatole di delimitazione, solo fotogrammi pari alla larghezza e all'altezza del tuo sprite. Usa questo come test di collisione di primo livello. Dopo questo è fatto e hai una collisione, quindi usa le mappe di collisione per ottenere un livello più fine di dettagli.

Questa ottimizzazione aiuterà con la velocità e aggiunge la flessibilità al motore che non tutte le collisioni devono essere perfette per i pixel.

Per quanto riguarda l'attuale algoritmo di collisione pixel perfetto, ciò che descrivi funzionerebbe. Tuttavia, se stai andando a velocità, potresti provare questo:

Trova una maschera bit per ogni sprite (come una mappa pixel, ma solo un bit per pixel) per esempio:

00000000
00100000
01100000
01110000

Quando uno sprite si scontra con un altro, crea una nuova maschera bit dalla maschera bit più piccola della stessa dimensione di quella più grande e "offset" per la differenza di posizione tra gli sprite.

Una volta fatto questo, bit-wise "e" tutti i byte in queste due maschere. Se un risultato di byte> 0, hai una collisione.

Altri suggerimenti

La tua soluzione è la più semplice: iterare su ogni pixel.

Assicurati solo di controllare solo i "nuovi" pixel su ogni iterazione.

Supponiamo che il personaggio si sta muovendo a destra e giù allo stesso tempo:

*****   .....       .....        * = "Present"
*****   .*****      .****#       . = "Old and now empty"
*****   .*****  =>  .****#        # = "New"; check these on iteration 2
*****   .*****      .****#
         *****       #####

It. 1   It. 2      "New" pixels

Ad ogni iterazione lungo il movimento c'è poca differenza sui pixel da controllare; Solo quelli contrassegnati come "nuovi" hanno bisogno di verificare l'impatto. Controlla quelli e se non c'è collisione, continua a muoverti. Puoi usarlo per ottimizzare molti calcoli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top