, pixel niveau kollision påvisning baseret på pixel farver,,,,, 2,,,,,,,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet kollision påvisning og reaktion. at forudsige kollision punkter med matematik i as3this post er en del af en serie kaldet skyde - ' em-up.build en stage3d skyde - ' dem: score, sundhed, liv, hud og transitionsbuild en stage3d skyde - ' dem: fuld skærm chef kampe og polske i denne lektion, jeg vil følge den tilgang, der er foreslået af richard davey (tak, richard.og anvendes af ham og andre i påvisning af sammenstød mellem bitmaps med en lille ændring.jeg vil også sammenligne resultater fra forskellige tilgange til bitmap kollision påvisning ved grant skinner er performancetest sele.,,,, note: såvel som en del af den duel møde denne artikel er også en del af sammenstød, påvisning og reaktion,.,,, trin 1: oversigt, jeg beskriver den alternative tilgang i kort her..,, kontrollere, om der er nogen overlapning mellem de to bitmaps. hvis der er videre til.ellers smider ud. se, om overlapning har en uigennemsigtig pixels overlappende. hvis det bitmaps overlapper hinanden.ellers smider ud.,, trin 2: afgrænser kasser, først undersøge, om de to bitmaps "afgrænser kasser er sammenfaldende med rektangel.manuskriptet er som følger.for det første variabler. private var enemy1: bitmap, myship: bitmap; private var myshipsp: sprite; private var rec_e: rektangel, rec_m: rektangel, private var intersec: rektangel, enemy1 = nye e1, som bitmap; addchild (enemy1); myship = nye min som bitmap; myshipsp = nye addchild sprite. (myshipsp); myshipsp. addchild (myship); enemy1. x = stage.stagewidth > > 1, myshipsp. x = stage.stagewidth > > 1, enemy1. y = stage.stageheight * 0,2; myshipsp. y = stage.stageheight * 0, 8; //tegning kasser i sprite henlede (enemy1. getbounds (tidspunkt), 0); tegn (myshipsp. getbounds (tidspunkt), 0); her vi kontrollere eventuelle overlapninger mellem de kasser.se, detectvisible.as i kilden download den fuldstændige manuskript, privat funktion genopfriske e: begivenhed): ugyldig (//om omskreven firkant, hvor område rec_e = enemy1. getbounds (tidspunkt); rec_m = myshipsp. getbounds (tidspunkt); intersec = rec_e. kryds (rec_m); //træk tegnkassen både ånder. grafik. clear(); gøre (enemy1. getbounds (tidspunkt), 0); tegn (myshipsp. getbounds (tidspunkt), 0); //kun drage omskreven firkant, hvor område, hvis der er en, hvis (!intersec. isempty()) {linjer. grafik. clear(); gøre (intersec, linjer); t.text = "kryds område af røde rektangel."} andre (t.text = "ingen kryds område."}}, her er en demo.trække mindre rumskib.,, du skal ikke bekymre dig om den røde æske, der får "efterladt", når skibet er trukket ud af den anden tegnkasse.), trin 3: tegning i krydset område, så hvis der er en eller anden rubrik område, vi går over til at undersøge, om der er overlapning en pixel i området.men lad os først forsøge at henlede bitmap i dette kryds område.den fuldstændige manuskript er i detectvisible2. som privat funktion genopfriske e: begivenhed): ugyldig (//om omskreven firkant, hvor område rec_e = enemy1. getbounds (tidspunkt); rec_m = myshipsp. getbounds (tidspunkt); intersec = rec_e. kryds (rec_m); //træk tegnkassen både ånder. grafik. clear(); gøre (enemy1. getbounds (tidspunkt), 0); tegn (myshipsp. getbounds (tidspunkt), 0); //kun drage omskreven firkant, hvor område, hvis der er en, hvis (!intersec. isempty()) {linjer. grafik. clear(); gøre (intersec, linjer); //henlede krydset område og kontrol af overlappende farvede område var dem: matrix = enemy1.transform.matrix, var mym: matrix = myshipsp.transform.matrix; bdt_intersec = nye bitmapdata (intersec.width, intersec.height, falske, 0) em.tx - = intersec. x em.ty - = intersec. y mym.tx - = intersec. x; mym.ty - = intersec. y bdt_intersec. træk (enemy1, em); bdt_intersec. træk (myship, mym); bm_intersec.bitmapdata = bdt_intersec; bm_intersec. x = 10 bm_intersec. y = stage.stageheight * 0, 8 - bm_intersec.height; t.text = "kryds område af røde rektangel. \\ n"} andre (t.text = "ingen kryds område."), kan konstatere, at siden vi drager område ved hjælp af en matrix, afskalning, skævvridning og andre forandringer på begge bitmaps tages i betragtning.her er en demo, se rubrik i det nederste, venstre hjørne.,, trin 4: check for farve i krydset område, hvordan skal vi så se til højre pixel?- for det første, vi giver den farve af dette kryds i rubrik en skygge af sort (røde = 0, grøn = 0, blå = 0).så skyggen af mindre rumskib er malet i denne mørke kasse som grøn, med den blanding /add.i skyggen af større stationære rumskib vil blive malet rød, så der vil være områder af røde og grønne for rumskibe og sort, hvis der ikke er sammenfald område.hvis der imidlertid er anmodningerne fra disse to bitmaps, der overlapper, vil de blive draget i gult (røde = 255 = 255, grønne, blå = 0).vi anvender den metode, bitmapdata.getcolorboundsrect, for at kontrollere tilstedeværelsen af dette område. her er snippet, main. som, //henlede krydset område og kontrol af overlappende farvede område var dem: matrix = enemy1.transform.matrix, var mym: matrix = myshipsp.transform.matrix; bdt_intersec = nye bitmapdata (intersec.width, intersec.height falsk, 0) em.tx - = intersec. x; em.ty - = intersec. y mym.tx - = intersec. x; mym.ty - = intersec. y //ændre farve bdt_intersec. træk (enemy1, em, nye colortransform (1,1,1,1255 - 255 - 255), blendmode. tilføje); bdt_intersec. træk (myship, mym, nye colortransform (1,1,1,1, - 255255 - 255), blendmode. tilføje); bm_intersec.bitmapdata = bdt_intersec; bm_intersec. x = 10 bm_intersec. y = stage.stageheight * 08. - bm_intersec.height; t.text = "kryds område af røde rektangel. \\ n" //kontrol for tilstedeværelsen af den rigtige farve intersec_color = bdt_intersec. getcolorboundsrect (0xffffff, 0xffff00); hvis (!intersec_color. isempty()) t.appendtext (", og der er interesecting pixels i området."), bemærker, at vi undertrykker de røde og blå komponenter i 113 - max af green for den lille rumskib.på linje, 112, vi gør det samme med rumskibet med blå og grønne komponenter.,, hvor indfaldsvinkler, efter at have modtaget bemærkninger om præstationer, spørgsmål om sammenstød, påvisning, besluttede jeg at gøre noget hurtigt og beskidt test på disse metoder.jeg har skabt 20 fjendtlige rumskibe og én spiller rumskib og kontrolleret kollision detektering mellem, at en aktør skib mod andre 20.disse ånder er pakket i samme nærhed til at tvinge kollision påvisning af alle metoder til at få et fuldstændigt.den første fremgangsmåde er den mest enkle., bitmapdata, er fanget om indledning og for hvert billede, kollision påvisning kontrolleres ved hjælp af, bitmapdata. hittest(),.for det andet tilgang, bitmapdata, ajourføres hvert billede og sammenstød påvisning er baseret på disse, bitmapdata, fanget.den tredje, der henviser til den tilgang, der er foreslået i denne forelæsning., så resultatet af en af de prøver, som jeg har gjort, er som følger., –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– bitmapdata fastsat (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms. ms bitmapdata faste 168 0,17 ––––––––––––––– avg––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– bitmapdata opdateringer (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode...................... ttl ms.. avg ms bitmapdata opdateringer 5003 fem –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– skik - metoden (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms.. avg ms skik metode 4408 4.41 ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––, performancetest, giver forskellige resultater, når jeg kører test.så jeg løb det et par gange og afledte gennemsnit.konklusion: den hurtigste metode er den første, efterfulgt af den tredje og derefter den anden metode.så de væk, bitmapdata, for bitmaps, når de først er indført i fase og kontrol af, hittest, hver eneste sekund efter faktisk er effektiv, forudsat at disse ånder ikke udføre nogen forandringer, bortset fra oversættelse (f.eks. rotation, skævvridning og afskalning) over tid.ellers vil du blive tvunget til at træffe nogen anden eller tredje tilgang, og den tredje er en mere effektiv som anført af billedet ovenfor., kan du se, collisions.as, og results.as, den fuldstændige manuskript., og leder efter dyrere metoder, jeg indledte derefter søge for specifikke linjer kode det tog flere beregning.den anden og tredje metode tog længere tid, så jeg afledte flere funktioner fra dem, de enkelte brud på forskellige punkter.tjek en af de nedenfor anførte resultater. –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– misligholdelse hittest (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) omfatter grænser –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms. ms misligholdelse hitt avg- 189 0,19 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– misligholdelse hittest (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) omfatter omdanne –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms.. avg ms misligholdelse hittest 357 0, 36 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– defaudet hittest (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) omfatter hittest –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms.. avg ms misligholdelse hittest 4427 4.43 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– skik - metoden (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) indgaa grænser og omdanne –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms.. avg ms skik metode411 0,41 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– skik - metoden (1000 iterationer) spiller, version: vinde 11,1102,55 (ser) omfatter træk og grænser –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– metode..................................................................... ttl ms.. avg ms skik metode 3320 3.32 ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––, første, andet og tredje gange henviser til den anden metode på forskellige grænseværdier, og det fjerde og femte gange henviser til den tredje fremgangsmåde.se på den tredje og femte gang resultater, bitmapdata.draw, synes at være en masse beregning.og den tid, der i forbindelse med den anden fremgangsmåde synes at være dyrere i beregningen, hvilket får mig til at tro, at de størrelser, bitmapdata.draw, at operere på betyder noget.du kan se, collisions2.as, og results2.as, den fuldstændige manuskript.en ting, jeg finder en smule foruroligende uoverensstemmelse af disse prøver jeg altid får ikke den samme tid resultater, selv om de næsten med samme prioritet på alle tidspunkter.så det er godt nok til at gøre en simpel sammenligning mellem funktioner, indgåelse, tak for din tid, efter at læse dette lille tip.håber, at det har været nyttigt.forlader bemærkninger, hvis du ikke er enig med noget i denne forelæsning.jeg vil gerne reagere på feedback.,