use vektor regioner til at gennemføre synsfelt i en flash spil

, use vektor regioner til at gennemføre synsfelt i en flash spil,,,,, andel,,,,,,,, 5,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, i denne forelæsning, vil du lære at kaste en synsfelt i et tårn på et bestemt sted.når fjenden er i tårnet er synsfelt, tårnet vil skyde på dem.vektor matematik vil blive brugt til at hjælpe med gennemførelsen af dette synsfelt.,,,, endelige resultat forpremiere, lad os tage et kig på det endelige resultat, vi arbejder hen imod.klik på tårnet på bunden af fase begynde den simulering.,, trin 1: synsfelt, jeg er sikker på, at de fleste læsere har brugt kameraer.hver kamera har en mening vinkel, der er defineret af den type linse knyttet.der er snæver og bred opfattelse vinkler.betragtning vinkler begrænse synsfeltet i en sektor.fra en top - down - holdning, de ligner nedenstående diagram.hvis du tager et billede, alt, hvad der står i grayed område vil blive fanget.,, tårnet er synsfelt i vores simulering er sådan et kamera.hvis der er en fjende i sit synsfelt, en vagt vil reagere (alarm, tag sigte og skyde osv.), trin 2: grundlæggende koncept, diagrammet ovenfor viser synsfelt i tårnet.normalt synsvinklen vil være lig på både venstre og højre.radius vil også være konsekvent i hele sektoren.så for at kontrollere, om en fjende er i tårnet er synsfelt, disse to matematiske betingelser kan anvendes, afstand mellem tårn - og fjenden er mindre end radius. vinkel fra tårnet er i syne til fjende er mindre end 30 °.,, trin 3: at definere synsfelt ved hjælp af vektor, vi skal bruge vektor matematik til at hjælpe os.i dette tilfælde vektorer i betragtning, er, vline2, og vline3,.vi kan sammenligne omfanget af vline2:,, og vline3 at validere betingelse 1 fra trin 2., sammenligne vinkel klemt mellem vline2 og vline3 at validere betingelse 2 fra trin 2.,, ved anvendelse af formlen for dot vare mellem vektorer, kan vi finde den vinkel, klemt inde mellem to vektorer.jeg har medtaget et flash - præsentation frem for at lette deres forståelse.klik på knapperne på bunden at rulle med stel. her er actionscript i, vector2d, (som jeg har brugt i tidligere tutorials, som dette), der gør arbejdet.bemærk, at linje 257 hjælper med til at afgøre, om de vil på den negative eller positive.det er imidlertid ikke nok hjælpe os her som retning er ikke vigtigt.flere oplysninger om dette emne i den næste del af denne serie., * * * metode til at opnå mindre vinkel i radianer, klemt inde fra nuværende kurs til vektor * @ param input vector2 en vektor for bundet vinklen * @ tilbage vinkel i radianer, positivt med negativ er mod uret * /offentlige funktion anglebetween (vector2: vector2d): antal (//få normaliseret vektorer var norm1: vector2d =. normalise(), var norm2: vector2d = vector2. normalise(); //- produkt af vektorer for at finde vinkel var produkt: antal = norm1. dotproduct (norm2); produkt = matematik. min (1, produkt) var vinkel: antal = matematik. acos (produkt) //sider af vinkel, hvis dette. vectorproduct (vector2) < 0) vinkel * = - 1 tilbage vinkel.}, trin 4:.gennemførelsen har jeg medtaget en præsentation nedenfor, der gennemfører begrebet synsfelt.det er gratis at klik og trække større grå cirkler rundt.observere område, der er omfattet af det synsfelt, angivet med mørkere prikker.,, løntrin 5: vigtigste actionscript,, hvis du ønsker at se actionscript for præsentationen ovenfor, føle sig fri til at åbne op, appfan.as fra udspringet download - det er bemærkninger for at gøre det lettere at forstå.jeg skal kun omfatte de vigtige indlæg, at der her betingelser. jeg har fremhævet den betingede erklæring om, at hver af de små prikker på scenen er vurderet imod det for at se, om den inden for den fremhævet område. //beregne størrelsen og vinklen var vline2: vector2d = nye vector2d (b2 - x - b1. x - y - b1, b2.. y), var vline3: vector2d = nye vector2d (b3 - x - b1. x, b3. y - b1. y) var ang: antal = matematik. abs (vline2. anglebetween (vline3) //fjerne retningsbestemte ved vinkel var magasin: antal = vline2. getmagnitude(); for hver (var - post: bold i sp) (var - vparticle1: vector2d = nye vector2d (pkt. x - b1. x, punkt. y - b1. y); //kontrol, hvis de falder ind under sektor //betingelse: størrelse mindre end mag vinkel mellem partikel ang vline2 mindre end ang, hvis (matematik. abs (vline2. anglebetween (vparticle1) < ang & & mag > vparticle1. getmagnitude()) (item.col = 0x000000;} //hvis uden for segment, oprindelige farve andre item.col = 0xcccccc; punkt på dagsordenen. draw();}, trin 6. variationer, at tilføje variation til brugen af synsfelt, vi kan gennemføre en fjern og nær svækkelse.vi gik bare igennem svækkelse.i alt dæmpning, fjender, der er længere væk (længere end videre dæmpning i afstand) ikke kan ses af tårnet.i nærheden af dæmpning, fjender, der er for tæt på (mindre end i nærheden af dæmpning) ikke kan ses af tårnet.det lyder måske irrationelt, men tænk på tårnet sidder på en høj klippe, mens fjenden sniger sig lige under klippen. okay, måske er du ikke overbevist, så her er et andet eksempel på anden anvendelse.en vagt, bærer et kort sværd, en bue og pile.når fjenden er for langt væk, vil han holde øje med ham.når fjenden kommer på skydebanen, han skyder med pile.når fjenden kommer for tæt på, han slås med korte sværd.du kan selv gennemføre forskellige typer vagter: bueskytter og sværdkæmpere.fjender på skydebanen behandles af bueskytter, mens de tæt på behandles af sværdkæmpere., ved at forstå de betingelser, der blev indført i trin 2, ændringer kan indføres i vores simulering eller spil.,, trin 7: definere synsfelt betingelser, jeg har medtaget et flash - præsentation nedenfor til at demonstrere forskellige tilfælde, og de tilsvarende betingelser.klik på knapperne for at undersøge de forskellige sager,.,, trin 8: programmering synsfelt, betingelser, som er en stump kode for gennemførelse af de betingelser, der er fastsat i trin 7.du kan have på hele kildekoden, region2.as, til at tjekke hele gennemførelsen. //kontrol udført hver frame privat funktion flytte e: mouseevent): ugyldig (//beregne vektor fra vagt fjende var g_e: vector2d = nye vector2d (fjende. x - vagt. x, fjende. - vagt. y) var vinkel: antal = r3. anglebetween (g_e); //betingelser var withinsector: boolean = math2. 13 (matematik. abs (vinkel) < sektor var withinr3: boolean = g_e. getmagnitude() < r3. getmagnitude(), var withinr2: boolean = g_e. getmagnitude() < r2. getmagnitude(), var withinr1: boolean = g_e. getmagnitude() < r1. getmagnitude(); //forskel, f.eks. tilfælde, hvis (f.eks. = = 0) (hvis (withinsector & & withinr3) (t1.text = "inden for fov"} andre t1.text = "ud over fov"} andre, hvis (f.eks. = = 1) (hvis (withinsector & & withinr3 & &!withinr1) (t1.text = "i mellem. nfar og i nærheden af dæmpning"} andre t1.text = "ud over fov"} andre, hvis (f.eks. = = 2) (hvis (withinsector) (hvis (withinr1) t1.text = "sværd angreb" andre, hvis (withinr2) t1.text = "arrow skyde" andre, hvis (withinr3) t1.text = "hold iagttage"} andre t1.text = "ud over fov"}} //, der f.eks. tilfælde i forbindelse med ændringer i sammenhæng menu privat funktion swap (e: contextmenuevent): ugyldig (//- f.eks. hvis (e.target.caption = = & quot; grundlæggende fov & quot;) eksempel = 0. andre, hvis (e.target.caption = = & quot; langt /nær dæmpning & quot;) eksempel = 1; andre, hvis (e.target.caption = = & quot; overholde /pil /sværd & quot;) eksempel = 2; //træk region med angivelse af tilsektion område drawregion();}, trin 9: gennemførelse, her er en gennemførelse af idéer, jf. trin 6.klik på den sorte ring og få det rundt om fase for at kontrollere, om det ligger inden for det synlige område.højreklik på scenen til pop forbindelse menu, så vælg fra "grundlæggende fov", "langt /nær dæmpning" og "overholde /pil /sværd" for at undersøge de forskellige eksempler,.,, trin 10: scenario, nu at vurdere, hvad vi har lært, at vi skal skabe en simulering..her er scenariet: en tårnet er udstationeret i den ene ende af scenen.dets rolle er at fjerne så mange tropper, der indtager sin plads som muligt.selvfølgelig, det bliver nødt til at se disse tropper (inden for synsfelt) med henblik på at skyde lasere - og farvel tropper.da det kan kun skyde en stråle af laser på enhver instans, det kommer til at vælge den bedste fjende i sigte. på den anden side tropper vil forsøge at succes over på den anden side.de bliver nødt til at krydse en flod, og, som de ved, vil de sætte farten ned.disse tropper skal respawn på toppen af scenen, når de dør eller går ud af scenen.,, trin 11: grundlæggende opstilling, gennemførelse af dette eksempel bliver svær kode.den grundlæggende struktur er som følger.på initialisering vi vil drage de grafiske elementer (flod, tropper, tårn) og position, så pænt.ved at klikke på lilla tårnet, informationskampagne vil begynde.på hvert billede, vi vil se dem ret i henhold til adfærd af hvert element. offentlige funktion scene1() {maketroops(); makeriver(); maketurret(); tårnet. addeventlistener (mouseevent.mouse_down, start); funktion start (): ugyldig (fase. addeventlistener (event.enter_frame, flytte)}} privat funktion flytte e: begivenhed):. (behaviourtroops(); behaviourturret();), nedenfor, er de variable størrelser i denne klasse, private var floden: sprite; private var tropper: vector. < kugle - > private var troopvelo: vector. < vector2d > private var tårnet: sprite; private var fieldofview: sprite; private var. lineofsight: vector2d = nye vector2d (0 - 300); //synsretning nordvendt private var sectorofsight: antal = 20 //acplus halvdelen af sektor i grader, trin 12: træk og holdning - floden, tegning og positionsbestemmelses - floden.ret simpelt. privat funktion makeriver(): ugyldig (floden = nye sprite. addchild (floden); //angive placeringen & gøre grafik flod med (floden) (x = 0, y = 150 og grafik. beginfill (0x22bbdd, 0, 2); grafik. drawrect (0, 0, 500. 50) og grafik. endfill();}}, trin 13: træk og holdning styrker, at tropper vil være enkel.men jeg ville gerne have et "v" oplysninger om tropper.så jeg holdning hæren på bunden af "v" først, efterfulgt af tropper på begge sider af vingen.du vil måske justere center holdning gennem center, og afstanden mellem tropper gennem xapart, og yapart,.bemærk, at tropper, og den tilsvarende, troopvelo, deler de samme indeks.All troops are heading south., private function makeTroops():void { \ttroops = new Vector.<Ball>;\t\t//Initiate troops \ttroopVelo = new Vector.<Vector2D>;\t//initiate velocity \t \t//local variables \tvar center:Vector2D = new Vector2D(stage.stageWidth * 0.5, 150); \tvar xApart:int = 20; var yApart:int = 15; \t \t//Locating troops & velocities \tvar a:Ball = new Ball; stage.addChild(a); troops.push(a); \ta.x = center.x; a.y = center.y; \t//troops heading south \tvar aV:Vector2D = new Vector2D(0, 1); troopVelo.push(aV);\t \t \tfor (var i:int = 1; i < 11; i++) { \t\tvar b:Ball = new Ball; stage.addChild(b); troops.push(b); \t\tb.x = center.x + i * xApart; b.y = center.y - i * yApart; \t\tvar bV:Vector2D = new Vector2D(0, 1); troopvelo. tryk (bv) var c: bold = ny bold. fase. addchild (c); tropper. skub (c) c.x = center. x - * xapart; c.y = center. - jeg * yapart; var cv: vector2d = nye vector2d (0, 1); troopvelo. tryk (cv)), punkt 14: træk og holdning, det her vil vi gøre, holdning og orient tårnet og dets synsfelt, ansigt til ansigt med nord mod fjenden.bemærk, at sigtelinje er nordvendt. privat funktion maketurret(): ugyldig (//instantiate, find, orient tårnet tårnet = nye sprite. fase. addchild (det); tårnet. x = stage.stagewidth * 0, 5, tårnet. y = stage.stageheight; turret.rotation = - 90; turretrot = 2; //rotationshastighed //henlede det grafiske var w: int = 30 var h: int = 10; tårnet. grafik. beginfill (0x9911aa); tårnet. grafik. linestyle (2); tårnet. grafik. til (0 - h /2); tårnet. grafik. og gratis linjetil (w - h /2); tårnet. grafik. og gratis linjetil (w h /2); tårnet. grafik. og gratis linjetil (0, h /2); tårnet. grafik. og gratis linjetil (0 - h /2); tårnet. grafik. endfill(); //om data for synsfelt er grafik var point1: vector2d = nye vector2d (0, 0) var punktt2: vector2d = nye vector2d (1, 0), var point3: vector2d = nye vector2d (0, 0); point1. polære (lineofsight. getmagnitude(), math2. radianof (sectorofsight)); point2. setmagnitude (lineofsight. getmagnitude() /matematik. - (math2. radianof (sectorofsight)); point3. polære (lineofsight. getmagnitude(), math2. radianof (- sectorofsight)); //instantiate, find, orient synsfelt fieldofview = nye sprite. addchild (fieldofview); fieldofview. x = tårnet. x; fieldofview. y = tårnet. y. fieldofview.rotation = - 90; //henlede tårnet er synsfelt fieldofview. grafik. beginfill (0xff9933, 0,1); fieldofview. grafik. linestyle (1); fieldofview. grafik. til (0, 0); fieldofview. grafik. og gratis linjetil (point1. x, point1. y); fieldofview.graphics.curve- point2. x, point2. y, point3. x, point3. y); fieldofview. grafik. og gratis linjetil (0, 0); fieldofview. grafik. endfill();}, en lille detalje om, at den i syne.jeg har medtaget image under for en præcisering:,, trin 15: troppers adfærd, tropper vil være animeret over tid.her er deres adfærd.bemærk, at de sidste to linier er kommenteret.If you would like dead troops to be removed from animation, you may uncomment them., //troops' behaviour private function behaviourTroops():void { \t//for each troop \tfor (var i:int = 0; i < troops.length; i++) { \t\t \t\t//If troop reach bottom of screen, respawn on top of screen \t\tif (troops[i].y > stage.stageHeight) { \t\t\ttroops[i].y = 0; troops[i].x = Math.random() * (stage.stageWidth - 100) + 100; \t\t} \t\t//if wading through river, slow down \t\t//else normal speed \t\tif (river.hitTestObject(troops[i])) troops[i].y += troopVelo[i].y*0.3; \t\telse troops[i].y += troopVelo[i].y \t\t \t\t//If troop is dead ( alpha < 0.05 ), respawn on top of screen \t\tif (troops[i].alpha < 0.05) { \t\t\ttroops[i].y = 0; troops[i].x = Math.random() * (stage.stagewidth - 100) + 100 soldater [i]. kol = 0xcccccc; tropper [i]. draw(); tropper [i]. alpha = 1; //fase. removechild (tropper [i]); tropper. splejsning (- 1); //troopvelo. bind i, 1)}}}, trin 16: det er adfærd, tårnet vil vogte sin stilling ved at panorere sit synsfelt, men inden for bestemte vinkler.her, jeg har defineret - vinkel på mellem - 135 - 45 (ved hjælp af flash vinkler).hvis der er en fjende i sigte, det vil angribe den.men hvis der er mere end en fjende, kommer det til at vælge de nærmeste til at angribe. //- tårn adfærd privat funktion behaviourturret(): ugyldig (//rotér det inden for rammerne af - 135 & - 45, hvis (turret.rotation > - 45) turretrot = - 2 andre, hvis (turret.rotation < - 135) turretrot = 2 //skyde nærmeste fjende i sigte, grafik. clear(); hvis (enemywithinsight()!= null) (//nærmeste fjende i sigte var målet: bold = enemywithinsight(); target.col = 0. mål. draw(); //bliver sort & target.alpha - = 0,2; //helbred forværres //orient tårn til fjende var turret2target: vector2d = nye vector2d (mål. x - x, tårn. målet. y - tårnet. y); turret.rotation = math2. 13 (turret2target. getangle()); //henlede laser vej til fjende grafik. linestyle (2); grafik. til (tårnet. x, tårnet. y); grafik. og gratis linjetil (mål. x, mål. y)} //nr. fjende i sigte, fortsat scanning andet (turret.rotation + = turretrot) //- synsfelt og synsvidde af tårnet i henhold til kanontårn rotation fieldofview.rotation = tårnet. lineofsight.seta rotation.ngle (math2. radianof (tårnet. skift)}, skridt 17: nærmeste fjende, det vil finde den nærmeste fjende inden for sit synspunkt og reagere ved at skyde en laser på det.for at se hvordan det finder det nærmeste fjende, tjek actionscript gennemførelse under. //tilbage den nærmeste fjende i sigte, privat funktion enemywithinsight(): bold {var closestenemy: bold = ugyldig; var closestdistance: antal = lineofsight. getmagnitude(); for hver (var - post: bold i tropper) (var - turret2item: vector2d = ny vector2d (pkt. x - tårnet. x, punkt. y - tårnet. y); //se om fjende er inden for rækkevidde, //1.inden for sektoren for //2.inden for rækkevidde for //3.tættere på, end de nuværende nærmeste fjende var c1: boolean = matematik. abs (lineofsight. anglebetween (turret2item) < math2. radianof (sectorofsight) var c2: boolean = turret2item. getmagnitude() < lineofsight. getmagnitude(); var c3: boolean = turret2item. getmagnitude() < closestdistance; //, hvis alle betingelser opfyldt, ajourføre closestenemy hvis (c1 & & c2 & & c) (closestdistance = turret2item. getmagnitude(); closestenemy = post;}} tilbage closestenemy;}, gå 18: iværksættelse af simulering, nu må du tryk ctrl + træde i flashdevelop og overholde denne simulation.klik tårnet for at starte den demo nedenfor.,, skridt 19: et skridt videre, så vi kan gøre brug af denne forståelse:,, gennemføre en synsfelt for fjender, gennemføre mere tårne. indføre ændring af synsfelt, som forklaret i trin 9.,,, - - og så videre. dette vil forhåbentlig udløse nogle idéer og måske hjælpe på din næste simulering eller spil, indgåelse, tak fordi du læste.som sædvanlig vil smide en kommentar til at lade mig vide, om det har været nyttigt til dig.jeg vil skrive den næste lektion i at se, hvordan fjender kan holde ud af tårnet er synsfelt ved "skjulte" bag forhindringer.bliv hængende.

Field of view: narrow and wide
Mathematical conditions to determine item within FOV
Image depicting scenario 1
Image to clarify points in drawing FOV



Previous:
Next Page: