Răspuns :
Mentionez de la inceput: solutia data de mine este in C++,foloseste structuri in loc de clase, si nu este o solutie completa, doar una care tine de principiul matematic.
Consider ca axa care uneste jucatorul(owner) si mouseul este axa principala pe care va merge un proiectil, iar celelalte 6 proiectile vor fi trimise in mod simetric in plan fata de traiectoria principala. In acest cazi avem nevoie de urmatoarele date de intrare:
1) Coordonatele actuale ale jucatorului
2)Coordonate mouse
3)Unghiul total al conului in care se face tragerea
4)Distanta la care dispare proiectilul
Daca cunoastem distanta unghiului total si avem 6 traiectorii de trasat, atunci traiectoriile vor fi intre ele la o distanta de unghi/6
dist_unghi=unghi_total/6
Pentru ca sunt simetrice fata de unghiul axei principale, pe care il notam cu pr, o sa avem atunci dist_unghi inmultit cu numere de la -3->3, din unghiul principal. Presupunand ca unghiul total initial este de 120 de grade, iar unghiul axei principale determinate de jucator si mouse este de 60 de grade, atunci avem:
dist_unghi=120/6=20 grade
unghi_axa_0=unghi_pr-3*20=60-60=0;
unghi_axa_1=unghi_pr-2*20=60-40=20
...
unghi_axa_3=unghi_pr-0*20=60-60=0
....
unghi_axa_4=unghi_pr+2*20=60+40=100;
unghi_axa_5=unghi_pr+3*20=60+60=120
deci observi ca axa 3 este axa principala, iar restul sunt la unghiuri de distanta egala simetrice fata de axa principala.
Acum, trebuie sa rezolvam problema aflarii unghiului principal(al axei principale intre jucator si mouse). Aceasta este descris in imaginea 2
Aici, noi stim care sunt coordonatele (x,y) pentru jucator si mouse. Unghiul principal este cel notat cu alfa. Cateta de-alungul axei Ox este notata distx, iar de-alungul axei Oy este disty. Putem afla tangenta unghiului respectiv
[tex]tan\alpha=\frac{cateta opusa}{cateta alaturata}=\frac{dist_{y}}{dist_{x}}[/tex]
dar in acest caz acele distante sunt exact diferentele intre coordonatele punctelor mouse si jucator. Atunci
[tex]dist_{x}=mouse.x-jucator.x[/tex]
[tex]dist_{y}=mouse.y-jucator.y[/tex]
Atunci tangenta este
[tex]tan\alpha=\frac{mouse.y-jucator.y}{mouse.x-jucator.x}[/tex]
Si putem afla care este unghiul din arctangenta
[tex]\alpha=arctan(tan\alpha)=unghi_pr[/tex]
Deci stim acum unghiul traiectoriei respective. Mai trebuie sa aflam punctul in care dispare. Pentru asta, mai stim si distanta la care dispare, adica daca te uiti in figura 2, ipotenuza triunghiului dreptunghic respectiv. Stiind ipotenuza si unghiul alfa, poti afla valorile catetelor distx si disty
[tex]\cos{\alpha}=\frac{cateta alaturata}{ipotenuza}=\frac{dist_{x}}{range}\Rightarrow dist_{x}=\cos{\alpha}*range[/tex]
[tex]\sin{\alpha}=\frac{cateta opusa}{ipotenuza}=\frac{dist_{y}}{range}\Rightarrow dist_{y}=\sin{\alpha}*range[/tex] odata aflate dist_x si dist_y este simplu de gasit x,y pentru capatul proiectilului
[tex]to.x=jucator.x+dist_{x}[/tex]
[tex]to.y=jucator.y+dist_{y}[/tex]
Dar traiectoria este greu de desenat din 2 puncte. Obtii mai multa acuratete daca ai mai multe puncte intermediare prin care sa trasezi. Cum arata in figura 1, pe traiectoria principala, mai multe puncte pot fi desenate si apoi trasata axa. Pentru puncte intermediare, tot ce facem este sa impartim rangeul(distanta) in distante egale si apoi sa gasim punctele corespondente intermediare.
Programul de l-am scris mai jos este facut cu un exemplu dat cu partea de introducere de date comentata. Poti sa modifici programul si sa urmaresti cum evolueaza lucrurile in functie de diverse valori ale mouseului,jucatorului, numarului de puncte.
Consider ca axa care uneste jucatorul(owner) si mouseul este axa principala pe care va merge un proiectil, iar celelalte 6 proiectile vor fi trimise in mod simetric in plan fata de traiectoria principala. In acest cazi avem nevoie de urmatoarele date de intrare:
1) Coordonatele actuale ale jucatorului
2)Coordonate mouse
3)Unghiul total al conului in care se face tragerea
4)Distanta la care dispare proiectilul
Daca cunoastem distanta unghiului total si avem 6 traiectorii de trasat, atunci traiectoriile vor fi intre ele la o distanta de unghi/6
dist_unghi=unghi_total/6
Pentru ca sunt simetrice fata de unghiul axei principale, pe care il notam cu pr, o sa avem atunci dist_unghi inmultit cu numere de la -3->3, din unghiul principal. Presupunand ca unghiul total initial este de 120 de grade, iar unghiul axei principale determinate de jucator si mouse este de 60 de grade, atunci avem:
dist_unghi=120/6=20 grade
unghi_axa_0=unghi_pr-3*20=60-60=0;
unghi_axa_1=unghi_pr-2*20=60-40=20
...
unghi_axa_3=unghi_pr-0*20=60-60=0
....
unghi_axa_4=unghi_pr+2*20=60+40=100;
unghi_axa_5=unghi_pr+3*20=60+60=120
deci observi ca axa 3 este axa principala, iar restul sunt la unghiuri de distanta egala simetrice fata de axa principala.
Acum, trebuie sa rezolvam problema aflarii unghiului principal(al axei principale intre jucator si mouse). Aceasta este descris in imaginea 2
Aici, noi stim care sunt coordonatele (x,y) pentru jucator si mouse. Unghiul principal este cel notat cu alfa. Cateta de-alungul axei Ox este notata distx, iar de-alungul axei Oy este disty. Putem afla tangenta unghiului respectiv
[tex]tan\alpha=\frac{cateta opusa}{cateta alaturata}=\frac{dist_{y}}{dist_{x}}[/tex]
dar in acest caz acele distante sunt exact diferentele intre coordonatele punctelor mouse si jucator. Atunci
[tex]dist_{x}=mouse.x-jucator.x[/tex]
[tex]dist_{y}=mouse.y-jucator.y[/tex]
Atunci tangenta este
[tex]tan\alpha=\frac{mouse.y-jucator.y}{mouse.x-jucator.x}[/tex]
Si putem afla care este unghiul din arctangenta
[tex]\alpha=arctan(tan\alpha)=unghi_pr[/tex]
Deci stim acum unghiul traiectoriei respective. Mai trebuie sa aflam punctul in care dispare. Pentru asta, mai stim si distanta la care dispare, adica daca te uiti in figura 2, ipotenuza triunghiului dreptunghic respectiv. Stiind ipotenuza si unghiul alfa, poti afla valorile catetelor distx si disty
[tex]\cos{\alpha}=\frac{cateta alaturata}{ipotenuza}=\frac{dist_{x}}{range}\Rightarrow dist_{x}=\cos{\alpha}*range[/tex]
[tex]\sin{\alpha}=\frac{cateta opusa}{ipotenuza}=\frac{dist_{y}}{range}\Rightarrow dist_{y}=\sin{\alpha}*range[/tex] odata aflate dist_x si dist_y este simplu de gasit x,y pentru capatul proiectilului
[tex]to.x=jucator.x+dist_{x}[/tex]
[tex]to.y=jucator.y+dist_{y}[/tex]
Dar traiectoria este greu de desenat din 2 puncte. Obtii mai multa acuratete daca ai mai multe puncte intermediare prin care sa trasezi. Cum arata in figura 1, pe traiectoria principala, mai multe puncte pot fi desenate si apoi trasata axa. Pentru puncte intermediare, tot ce facem este sa impartim rangeul(distanta) in distante egale si apoi sa gasim punctele corespondente intermediare.
Programul de l-am scris mai jos este facut cu un exemplu dat cu partea de introducere de date comentata. Poti sa modifici programul si sa urmaresti cum evolueaza lucrurile in functie de diverse valori ale mouseului,jucatorului, numarului de puncte.
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile și inspiraționale. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, suntem aici pentru a vă ajuta. Ne face plăcere să vă revedem și vă invităm să adăugați site-ul nostru la favorite pentru acces rapid!