11. juni 2001 - 12:56Der er
11 kommentarer og 1 løsning
Kollision Detektion
Hvis jeg vil vide om 2 GIF\'er (rumskibe eller likewise) rammer hinanden hvordan håndterer jeg så smartest dette ?
Jeg kan naturligvis sammenligne deres position og tage højde for billedets kvadratiske størrelse, men findes den er måde (som ikke æder alt CPU-power) til at lave detektionen helt præcist ned på pixel-niveau ?
Der er to måder at gøre det på ... Den ene er lidt CPU-tung og den anden er mere CPU-tung....
1) som du selv har nævnt - en \'virtuel\' kasse/rektangel omkring skibet .... Denne metode hedder Bounding Box (BB)... Denne er ikke særlig CPU tung, da er der relativt få udregninger, der skal til for at detektere en kollision (hvis to BB\'ere overlapper hinanden, dvs. er inde for samme interval på den ene akse, og også er indefor et fælles interval på den anden akse, så er der en kolission .. DVS. to udregninger - rimligt simpelt... Problemet med Bounding Box, er at den kan blive urealistisk -den er kun brugbar OG realistisk, hvis skibet fylder HELE BB\'en....
2) den anden metode, er en som jeg kom frem til for et par år siden, som hedder Bit-Masking...
Konceptet går ud på at have en to-dimmesionel array, som er lige så stor, som skærmen/spillearealet. Cellerne i denne array er boolean-værdier.
Efter hver flytning på skærmen resetter du alle værdier i arrayen, så alle cellerne er true... Derefter tegner du masken for hvert objekt ind - hvor du gør den med XOR.... Samtidig med at du putter masken ind, pixel for pixel - checker du for om den er true eller false, efter du har XOR\'ed cellen .... hvis den er false : betyder det, at der ikke har været skrevet til cellen før - ergo er det sikkert for pixelen at være der.... hvis den er true : betyder det at du lige har overskrevet en anden maske - ergo må det betyde, at to objekter er igang med at kolidere....
Du kan evt. besparre din udregninger ved kun at tegne maskens kontur ind i arrayen .. men dette vil kun virke, hvis objekterne kun flytter sig 1 pixel ad gangen.....
Bit-Masking er en helt realistisk metode - men tung ... Da jeg opdagede den for et par år siden, programmerede jeg i Pascal, som IMHO er hurtigere til at foretage sådanne udregninger.
Jeg plejer nogle gange ved BB at lade objektet \"være\" måske 2-3 pixels mindre kvadratisk når kollisionen udregnes, så skal det støde lidt mere sammen for at detekte og det kan virke mere naturligt
du kan også evt. lave flere mindre bounding boxes til samme objekt. f.eks en stor til skroget og to mindre til kanoner på fly eller lign.. og så gruppere boxene..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.