Salut prieteni. Principalul punct culminant al acestui tutorial este precis detectarea loviturii unui laser generat. Acest tip de AI este util în realizarea de jocuri de acțiune, în special în cazul informațiilor de securitate cu aparate foto, arme laser etc. Așa că puneți racheta pe spate, începerea inversă?
Să aruncăm o privire asupra rezultatului final pe care îl vom strădui:
Deschideți Flash și creați un nou document Flash (ActionScript 3.0).
Setați dimensiunea etapelor la orice rezoluție standard. Mina este de 500 x 350 px.
Setați rata de cadre la 24 fps.
Salvați fișierul într-un dosar la alegere.
Să creați acum un generator cu laser.
Desenați un cerc cu raza 20, adică 40 x 40. De asemenea, umpleți-l cu o anumită culoare gradientă radială.
Acum trebuie să convertim acest cerc într-un simbol Flash, astfel încât să îl putem controla cu ActionScript.
Selectați cercul și apăsați F8 sau mergeți la Modificați> Conversie la simbol. Selectați Clip video pentru tipul de simbol. De asemenea, setați punctul de înregistrare la centru astfel încât generatorul laser să se rotească din centrul său. Tip laserGenerator_MC
în câmpul de nume de instanță și apoi, nu în ultimul rând, bifați "Export pentru ActionScript" în grupul "Advanced", astfel încât să putem accesa generatorul laser din clasa de documente pe care o vom întâlni în curând.
După ce ați setat toate opțiunile de mai sus, apăsați pe OK. Apăsați OK din nou pentru caseta de dialog care afișează avertismentul pentru definiția clasei. Aceasta va crea o definiție de clasă pentru generatorul laser în timpul rulării.
Acum nu avem nevoie laserGenerator_MC
simbol pe stadiu, deoarece este disponibil în panoul Bibliotecă cu numele identificatorului laserGenerator_MC
. Prin urmare, ștergeți acest simbol din scenă. Stadiul dvs. ar trebui să fie acum gol.
Acum, că vom adăuga o gură la acest generator pentru a crea ceva simt al unui dispozitiv. În panoul de bibliotecă faceți dublu clic pe laserGenerator_MC
pictograma simbol (partea stângă a numelui simbolului) pentru a intra în modul de editare. Adăugați gura la el, după cum se arată mai jos.
Simțiți-vă liber să adăugați propriul design.
Notă: Nu modificați poziția cercului deoarece trebuie să îl rotim în jurul centrului.
După adăugarea unei guri la generator, ieșiți din modul de editare simbol și reveniți la linia de timp principală.
Racheta dvs. a părăsit terenul. Dispozitivul de generare a laserului este gata și așteaptă să funcționeze.
Pentru a adăuga o dramă la scena noastră, avem nevoie de ActionScript. Pentru a acționa inteligent avem nevoie de clasa de documente.
În acest pas vom crea o structură de bază a clasei noastre de documente.
Pentru explicații detaliate despre clasa de documente consultați acest sfat rapid.
Deci, creați un nou fișier ActionScript 3.0. Tastați următorul cod:
pachet public class Laser_HitDetection funcția publică Laser_HitDetection () // code constructor
Salvați această clasă de documente ca Laser_HitDetection.as în același folder în care ați salvat FLA pentru acest tutorial. Dă-i drumul. Clasa de documente de bază este pregătită.
În fișierul FLA accesați panoul Proprietăți pentru Document și introduceți numele clasei în câmpul Clasă de documente disponibil în grupul "Publicați".
Acum suntem gata să comunicăm cu FLA prin acest lucru Laser_HitDetection.as clasa de documente.
Vom crea un exemplu de generator de la bibliotecă și o vom plasa în centrul scenei.
Modificați Laser_HitDetection.as clasa de documente după cum se arată mai jos (linii evidențiate):
pachet import flash.display.Sprite; clasa publică Laser_HitDetection extinde Sprite var laserGun: Sprite; // Instanța laseruluiGenerator_MC // Funcția publică a constructorului Laser_HitDetection () CreateLaserGun (); // Obțineți și plasați generatorul laser din funcția publică a bibliotecii CreateLaserGun (): void laserGun = laser nouGenerator_MC (); // Obțineți-l din biblioteca addChild (laserGun); // Plasați generatorul laser în centrul laserului stageGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;
Dacă încercați acum filmul, veți vedea pistolul nostru laser amplasat frumos în centrul scenei.
CreateLaserGun ()
metodăÎn codul de mai sus am folosit spiriduș
pentru a crea o instanță a obiectului Sprite care va conține laser. Pentru aceasta, declarăm variabila ca:
var laserGun: Sprite;
Apoi am adăugat o nouă metodă "CreateLaserGun ()"în care am atribuit o instanță de laserGenerator_MC
de la bibliotecă la cele de mai sus laserGun
var ca:
laserGun = noul laserGenerator_MC ();
După adăugarea pe scenă, l-am așezat în centrul scenei ca:
laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;
În cele din urmă, am apelat această metodă din metoda constructorului din clasa de documente ca:
// Funcția publică a constructorului Laser_HitDetection () CreateLaserGun ();
Racheta se accelerează cu împingere totală. Vom activa această arma laser foarte curând, care va proiecta laserul. Înainte de asta vom adăuga unele obstacole. Sa mergem.
Pentru a experimenta detectarea loviturilor, avem nevoie de câteva obstacole plasate pe scenă. Deci, pe scenă trageți diferite forme asemănătoare suprafețelor convexe-concave, alpinism și marginile drepte, după cum se arată mai jos:
Acum vom pune toate aceste forme într-un singur simbol. Selectați toate formele simultan și apăsați F8 sau mergeți la Modificați> Conversie la simbol. Selectați Clip film ca tip de simbol. Denumiți acest simbol obstacles_MC
în câmpul cu numele de nume. Setați punctul de înregistrare la centru. Verificați, de asemenea, "Export pentru ActionScript", pentru a putea accesa din clasa noastră de documente.
După ce am făcut conversia în MovieClip, avem obstacles_MC
în biblioteca cu același nume de identificator. Similare ca laserGenerator_MC
nu avem nevoie de acest simbol pe scenă, deci ștergeți-l din scenă. Stadiul tău este gol.
Felul în care ne-am așezat pe noi laserGenerator_MC
pe scena, la centru, în mod similar vom plasa obstacles_MC
simbol pe scena. Modificați clasa de documente după cum se arată mai jos:
pachet import flash.display.Sprite; clasa publică Laser_HitDetection extinde Sprite var laserGun: Sprite; // Instanța laserGenerator_MC var obstacles: Sprite; // Starea obstacolelor_MC // Funcția publică a constructorului Laser_HitDetection () CreateLaserGun (); CreateObstacles (); // Obțineți și plasați generatorul laser din funcția publică a bibliotecii CreateLaserGun (): void laserGun = laser nouGenerator_MC (); // Obțineți-l din biblioteca addChild (laserGun); // Plasați generatorul laser în centrul laserului stageGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2; // Obțineți și puneți obstacole în calea funcției publice a bibliotecii CreateObstacles (): void obstacles = obstacles new_MC (); // Obțineți-l din bibliotecă addChild (obstacole); // Așezați obstacole în centrul treptei obstacles.x = stage.stageWidth / 2; obstacles.y = stage.stageHeight / 2;
Testați filmul pentru a vedea obstacolele plasate în jurul pistolului laser.
Racheta dvs. atinge viteza terminală. Acum este momentul să activați arma cu laser. Trebuie să genereze laserul din el. Să facem asta acum.
Cum vom imita laserul? Orice ghici ?? Ce zici de folosirea unor membri ai clasei Graphics tipuri de linii ()
, MoveTo ()
, lineTo ()
. Dacă sunteți familiarizat cu aceste metode, atunci munca dvs. este ușoară. Pentru cei care nu cunosc aceste metode, suntem întotdeauna cu voi. Să le vedem în detaliu.
Vom adăuga o nouă metodă ProjectLaser ()
. Să ne modificăm Laser_HitDetection
clasa de documente după cum se arată mai jos:
// Pachet constructor import flash.display.Sprite; clasa publică Laser_HitDetection extinde Sprite var laserGun: Sprite; // Instanța laserGenerator_MC var obstacles: Sprite; // Instanța obstacolelor_MC var laser: Sprite; var startX: Număr; // x punctul de plecare al laserului var startY: număr; // y punctul de plecare al laserului var endX: număr; // x punctul final al laser var endY: Număr; // punctul final al laserului // funcția publică a constructorului Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser (); // Obțineți și plasați generatorul laser din funcția publică a bibliotecii CreateLaserGun (): void laserGun = laser nouGenerator_MC (); // Obțineți-l din biblioteca addChild (laserGun); // Plasați generatorul laser în centrul laserului stageGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2; // Obțineți și puneți obstacole în calea funcției publice a bibliotecii CreateObstacles (): void obstacles = obstacles new_MC (); // Obțineți-l din bibliotecă addChild (obstacole); // Așezați obstacole în centrul treptei obstacles.x = stage.stageWidth / 2; obstacles.y = stage.stageHeight / 2; // Proiectați un laser de la dispozitivul generator de laser funcția publică ProjectLaser (): void laser = new Sprite (); addChild (laser); // Setați originea laserului ca centru al armei laser startX = laserGun.x; startY = laserGun.y; // Setați punctul final al laserului endX = startX + 230; endY = startY; // Desenați laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY);
Testați filmul.
Racheta este chiar acolo în cer. Arma laser a început proiectarea laserului. Cum sa întâmplat asta? Să încercăm să înțelegem codul de mai sus în pasul următor.
În etapa de mai sus am proiectat cu succes un laser. Pentru aceasta am realizat următoarele sarcini:
În primul rând, am declarat cinci variabile noi:
var laser: Sprite; var startX: Număr; // x punctul de plecare al laserului var startY: număr; // y punctul de plecare al laserului var endX: număr; // x punctul final al laser var endY: Număr; // punctul final al laserului
În al doilea rând, am adăugat o nouă metodă ProjectLaser ()
:
funcția publică ProjectLaser (): void laser = Sprite nou (); addChild (laser); // Setați originea laserului ca centru al armei laser startX = laserGun.x; startY = laserGun.y; // Setați punctul final al laserului endX = startX + 230; endY = startY; // Desenați laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY);
ProjectLaser ()
MetodăÎn metoda de mai sus am creat mai întâi un obiect Sprite gol pentru a ține laserul și, de asemenea, l-am adăugat în scenă după cum se arată mai jos:
laser = Sprite nou (); addChild (laser);
Întrucât am vrut ca laserul să înceapă să se proiecteze de la arma laser, îi atribuim valoarea X a armei laser startx
și valoarea Y la starty
așa cum se arată mai jos:
startX = laserGun.x; startY = laserGun.y;
(Mai târziu, am furnizat aceste valori către moveTo (startX, startY)
metodă pe care o vom întâlni în curând.)
Apoi am definit endX
și Endy
:
endX = startX + 230; endY = startY;
Valorile atribuite variabilelor de mai sus sunt valori temporare. Am folosit-o doar pentru a arăta proiecția de bază a unui laser. În etapele următoare vom modifica aceste valori prin aplicarea unor matematice simple. Aceste valori sunt esențiale pentru detectarea perfectă a laserului. Vom studia mai târziu în această sesiune.
Și acum partea importantă a acestei metode. Desenarea unei linii drepte în obiectul laser sprite pentru a imita laserul proiectat.
Mai întâi am tratat stilul liniei care urmează să fie trasată după cum se arată mai jos:
laser.graphics.lineStyle (1, 0xFF0000);
Această metodă lineStyle () este utilizată pentru a controla stilul cursei obiectului desen, cum ar fi linia, dreptunghiul, ovalul etc. Puteți oferi maximum opt argumente pentru această metodă. Dacă nu este specificat, valorile implicite sunt atribuite în schimb. Pentru exemplul nostru avem nevoie doar de două argumente. Primul argument este grosimea liniei (adică 1), iar al doilea argument este culoarea liniei (adică,. 0xFF0000
, care este roșu).
Pentru o explicație detaliată a acestei metode, consultați documentul de ajutor Adobe pe metoda "lineStyle (args?)".
Apoi am plasat punctul de plecare al liniei după cum se arată mai jos:
laser.graphics.moveTo (startX, startY);
startx
și starty
se asigură că punctul de plecare trebuie să fie centrul pistolului laser.
După aceea am finalizat linia:
laser.graphics.lineTo (endX, endY);
Amintiți-vă că aceste endX și endY sunt valori temporare doar pentru a arăta proiecția. Avem nevoie de ele să se ajusteze dacă există un obstacol în calea laserului. Vom face acele matematici în pașii următori.
Deci, am tras o linie de la (startx
, starty
) la (endX
, Endy
).
Racheta merge și merge. Vedeți acele peisaje, peisaje?
Acum, e timpul pentru o acțiune reală. Detectarea cu obstacole.
Acum suntem echipați cu un pistol cu laser. Avem, de asemenea, mai multe obstacole. Suntem la nivelul în care putem adăuga detectarea loviturilor, care va adăuga cu siguranță semnificația la scenă.
S-ar putea să vă gândiți că această detectare a loviturilor foarte precise va necesita matematică complexă. Dacă da, atunci greșești. Pur și simplu folosește metoda hitTestPoint () construită în ActionScript împreună cu a pentru
buclă. Matematica complexă în spatele detecției perfectă a loviturilor este tratată prin această metodă. Trebuie doar să utilizați această metodă și a pentru
buclă într-un mod inteligent.
Vom face câteva schimbări importante în clasa noastră de documente, în principal ProjectLaser ()
metodă și câteva veri noi, respectați-o și aplicați cu atenție. Să o modificăm așa cum este arătat:
Mai întâi adăugați aceste versiuni noi:
var rad: Numărul = Math.PI / 180; // folosit pentru a calcula unghiul în radiani var maxDist: număr = 250; // distanța maximă care urmează să fie parcursă de către laser var adjustedDist: Number; // distanța maximă nouă în cazul în care există vreun obstacol
Apoi modificați ProjectLaser ()
adăugați pentru
cum este arătat mai jos (rețineți că acum endX
și Endy
sunt înăuntru pentru
buclă):
// Proiectați un laser de la dispozitivul generator de laser funcția publică ProjectLaser (): void laser = new Sprite (); addChild (laser); // Setați originea laserului ca centru al armei laser startX = laserGun.x; startY = laserGun.y; pentru (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++) //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos ( laserGun.rotation * rad ) * adjustedDist; endY = laserGun.y + Math.sin ( laserGun.rotation * rad ) * adjustedDist; //calculate hit test if ( obstacles.hitTestPoint ( endX, endY, true ) ) break; //Draw laser laser.graphics.lineStyle( 1, 0 x FF0000 ); laser.graphics.moveTo( startX, startY ); laser.graphics.lineTo ( endX, endY );
Testați filmul.
bum? Sunt sigur. Privind la acest efect, vă inspirați să creați un joc Flash având inteligență de securitate. Perfect AI, pentru a dezvolta un joc interesant în Flash.
Mai întâi de toate am adăugat noi vars la clasa de document așa cum este arătat:
Inițial, un unghi, în radiani
var rad: Numărul = Math.PI / 180; // Se utilizează pentru a calcula unghiul în radiani
Varul de mai sus este folosit în formula pentru a calcula un unghi în radiani.
Formula este, radiani = grade * Math.PI / 180
. Mai multe informații aici. Am folosit această formulă în codul nostru, în următoarele rânduri:
endX = laserGun.x + Math.cos (laserGun.ro * rad) * adjustedDist; endY = laserGun.y + Math.sin (laserGun.ro * rad) * adjustedDist;
În laserGun.ro * rad
, grade = laserGun.rotation
, și rad = Math.PI / 180
.
În al doilea rând, am creat un var pentru distanța maximă care trebuie călătorită de laser:
var maxDist: număr = 250; // distanța maximă care trebuie parcursă de către laser
Acest var decide distanța maximă de parcurs de către laser. Deoarece nu este necesar să trageți laser dincolo de zona vizibilă, definim un punct finit frumos. Acest var va face ceea ce este necesar.
În al treilea rând, avem un var pentru distanța curentă a laserului în momentul intersecției cu orice obstacol.
var adjustedDist: Număr; // distanța maximă nouă în cazul în care există vreun obstacol
Atunci când orice obstacol vine în calea laserului, laserul este blocat mai degrabă decât călătorind la distanța maximă.
Distanța după blocarea unui laser nu este decât distanța ajustată în funcție de situație.
pentru
buclă și hitTestPoint ()
fiecare joacă un rol important în calcularea acestei distanțe.
În al patrulea rând, am modificat ProjectLaser ()
adăugând metoda ActionScript hitTestPoint ()
împreună cu a pentru
buclă. Am reatribuit endX
și Endy
variabile.
pentru (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++) //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos ( laserGun.rotation * rad ) * adjustedDist; endY = laserGun.y + Math.sin ( laserGun.rotation * rad ) * adjustedDist; //calculate hit test if ( obstacles.hitTestPoint ( endX, endY, true ) ) break;
Ciclul pentru asigură că distanța ajustată va fi mărită până la distanța maximă. S-ar putea să vă gândiți "Care este distracția în a face o distanță ajustată egală cu distanța maximă?"
De fapt, această distanță ajustată este permisă să se potrivească cu distanța maximă în mod natural, dar imediat ce atinge orice obstacol (care este detectat de hitTestPoint ()
) această distanță este marcată ca distanță maximă pentru situația actuală. Mulțumită hitTestPoint ()
pentru a face sarcina atât de simplă.
De asemenea, am reasignat endX
și Endy
valori ca:
endX = laserGun.x + Math.cos (laserGun.ro * rad) * adjustedDist; endY = laserGun.y + Math.sin (laserGun.ro * rad) * adjustedDist;
Funcțiile de trigonometru Math.cos ()
și Math.sin ()
sunt folosite pentru a calcula unghiul de rotație a arzătorului cu laser cu laser.
În formă simplă, aceasta are grijă de țintirea cu laser a armei cu laser. Este important ca laserul și laserul să fie ambele în sincronizare. Deci, ori de câte ori pistolul cu laser este rotit, laserul va urma rotația.
Pentru mai multe informații despre trigonometrie, citiți acest sfat rapid.
În cele din urmă, punctul culminant al scenei:
dacă (obstacles.hitTestPoint (endX, endY, true)) break;
hitTestPoint ()
metoda necesită trei parametri, dintre care primul și al doilea parametru sunt necesari, iar al treilea (shapeFlag
) va fi lăsată ca valoare prestabilită (adică. fals
) dacă nu este specificat.
În exemplul nostru, shapeFlag
este setat sa Adevărat
deoarece dorim detectarea loviturilor cu privire la forma exactă a obiectului țintă (adică,. obstacole
). Dacă această valoare este setată la fals
detecția loviturilor are loc în raport cu caseta de legare a obiectului respectiv și nu cu forma exactă.
Primul și al doilea parametru ai hitTestPoint ()
definiți un punct (x, y) la care să verificați intersecția cu obiectul afișajului. În cazul nostru obstacole
este obiectul afișat și endX
și Endy
reprezintă punctul de intersecție pe scenă.
Neclar? Dreapta. Pentru a simplifica, vom pune logica în ordine după cum urmează:
pentru
buclă permite proiecția laserului să continue (prin actualizarea endX
și Endy
) în cazul în care se află la o distanță maximă.hitTestPoint ()
este în așteptare pentru a rupe pentru
buclă imediat ce vede intersecția. Odata ce pentru
buclă este rupt, endX
și Endy
sunt înghețate.endX
și Endy
sunt transmise către graphics.lineTo ()
metodă.Pentru a adăuga rotația la arma laser trebuie să efectuăm câteva schimbări majore:
ProjectLaser ()
metodă.HitTest ()
.laser.graphics.clear ()
în pentru
buclă.import flash.events.Event
Mai întâi vom restructura ProjectLaser ()
prin deplasarea întregii logici de detectare a loviturilor într-o nouă metodă HitTest ()
.
Apoi vom adăuga laser.graphics.clear ()
declarație înainte laser.graphics.lineStyle (1, 0xFF0000)
declarație în interiorul pentru
buclă a metodei noi HitTest ()
. Aceasta va elimina vechea proiecție a laserului din stadiul când arma laser va începe să se rotească.
Să vedem cum va avea grijă de toate cele patru schimbări majore:
funcția publică ProjectLaser (): void laser = Sprite nou (); addChild (laser); // Setați originea laserului ca centru al armei laser startX = laserGun.x; startY = laserGun.y; // Hit test public HitTest (): void pentru (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++) //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos(laserGun.rotation * rad) * adjustedDist; endY = laserGun.y + Math.sin(laserGun.rotation * rad) * adjustedDist; //calculate hit test if (obstacles.hitTestPoint(endX,endY,true)) break; //Draw laser laser.graphics.clear(); //Removes the old laser projection laser.graphics.lineStyle( 1, 0xFF0000 ); laser.graphics.moveTo( startX, startY ); laser.graphics.lineTo ( endX, endY );
S-ar putea să te întrebi de ce am făcut astfel de schimbări majore? Singurul motiv este ENTER_FRAME
eveniment.
Pentru a aplica o rotație continuă, vom adăuga o nouă metodă, LaserGunRotare (evt: Eveniment)
care este activat de ENTER_FRAME
eveniment (adică se execută de 24 de ori pe secundă, deoarece rata de cadre este de 24 de cadre pe secundă). Când se utilizează acest eveniment, trebuie să fiți atenți să adăugați numai acele proprietăți pe care dorim să le modificăm pe o perioadă de timp. Evitați să introduceți acele valori care rămân constante pe parcursul executării.
În cazul nostru, dacă observați vechi ProjectLaser ()
metoda, are:
laser = Sprite nou (); addChild (laser); // Rotate Laser Gun
Imaginați-vă dacă adăugați instrucțiunile de mai sus într-o metodă care utilizează ENTER_FRAME
eveniment; atunci un nou obiect laser Sprite va fi creat și adăugat la etapa repetată - de 24 de ori pe secundă.
Acest lucru este absolut inutil. Prin urmare, am restructurat ProjectLaser ()
și a adăugat o nouă metodă HitTest ()
. Puteți redenumi ProjectLaser ()
metoda de a InitializeLaser ()
deoarece nu mai proiectează laserul. Acum creează doar suportul gol pentru laser și definește punctul de pornire al acestuia. Proiecția este tratată printr-o metodă nouă, HitTest ()
.
Acum, să vedem noua metodă LaserGunRotare (evt: Eveniment)
. Înainte de aceasta, adăugați următoarea declarație de import la începutul clasei de documente:
importul flash.events.Event;
Și adăugați următoarea metodă:
// Funcție publică rotunjită cu laser LaserGunRotation (evt: Event): void laserGun.rotation + = 0.5; HitTest ();
De asemenea, nu uitați să numiți această metodă cu un ENTER_FRAME
eveniment în interiorul funcției constructorului după cum se arată mai jos:
// Funcția publică a constructorului Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser (); addEventListener (Eveniment.ENTER_FRAME, LaserGunRotation);
Aceasta o face să ruleze LaserGunRotation ()
de 24 de ori pe secundă.
Testați filmul.
Racheta a pătruns deja în nori. Vedeți frumosul Pământ.
În acest pas vom adăuga un control pentru a regla acuratețea detectării hit-ului. Acest lucru este important deoarece nu aveți nevoie de detectarea exactă a loviturilor de fiecare dată; este posibil să aveți nevoie de un nivel mediu de detectare a loviturilor. Acest lucru va ajuta, de asemenea, la reducerea consumului CPU în momentul detectării hit-urilor.
Vom introduce o nouă variabilă toleranţă
la fel de:
var toleranță: numărul = 1;
Apoi vom modifica pentru
buletinul de incrementare ca:
pentru (adjustedDist = 0; adjustedDist < maxDist; adjustedDist += tolerance)
Acum bucla va arata ca:
pentru (adjustedDist = 0; adjustedDist < maxDist; adjustedDist += tolerance) //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos(laserGun.rotation * rad) * adjustedDist; endY = laserGun.y + Math.sin(laserGun.rotation * rad) * adjustedDist; //calculate hit test if (obstacles.hitTestPoint(endX,endY,true)) break;
Aceasta înseamnă că, în loc să verificăm o coliziune la fiecare pixel al liniei laser, verificăm doar o coliziune la fiecare alt pixel sau la fiecare al treilea pixel etc..
Reducerea valorii pentru "toleranță" va crește precizia detectării loviturilor, dar va necesita mai multă putere CPU. Încercați să experimentați diferite valori pentru "toleranță".
Prieteni, este timpul să părăsești racheta și să deschizi parașutul. Terenul se află în siguranță pe teren și începeți să utilizați tehnica de mai sus în jocurile și aplicațiile Flash. se bucura!
În acest tutorial am văzut în principal utilizarea perfectă a hitTestPoint ()
și a pentru
pentru a crea o detecție precisă a loviturilor fără a utiliza matematică complexă.
Acest efect poate fi folosit într-un joc de tip de securitate unde sunt necesare aparate foto și pistoale cu laser.