Pixel Collision Tracing
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.
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.