Informatică, întrebare adresată de GustavoPop, 9 ani în urmă

Buna ! Am nevoide de putin ajutor In C# .
Ce vreau sa fac este sa creez 7 proiectile care se lanseaza in directia mouse-ului in forma de con (pun cateva poze)

So , sa explic .
>Cercul este caracterul principal
>Liniile sunt proiectilele (Sageti sa zicem)
>Vreau sa traga in directia mouse-ului dar in forma de con (adica sa nu se duca toate sagetile in acelasi punct).
Am pus si o poza cu un campion din League Of Legends , in genul ala vreau sa traga.

Aici am un mic inceput de cod :

"public void OnFinishCasting(Champion owner, Spell spell, Unit target)
{
var current = new Vector2(owner.X, owner.Y);
var to = Vector2.Normalize(new Vector2(spell.X, spell.Y) - current);
var range = to * 1150;
var trueCoords = current + range;"

Asta este doar pentru o sageata iar ea se duce inspre mouse . Aici am nevoie de ajutorul vostru.
Cum fac sa mai adaug inca 6 sageti sa zicem si sa le pun (rotesc) in asa fel incat atunci cand apas pe Q (de exemplu) sa se duca in forma de con asa cum doresc.

De mentionat : Am mai cerut cateva pareri iar ei imi sugerau sa adaug inca 6 proiectile si pe acelea sa le rotesc , dar nu stiu cum :) .

Anexe:

blindseeker90: Va fi greu sa obtii un raspuns corect, pentru ca ai nevoie de cineva care a lucrat in Unity, nu neaparat cu C#. Eu am cateva intrebari: 1) cum iei coordonatele Mouseului? 2) Rangeul este distanta la care trimiti proiectilul respectiv? 3) Ce reprezinta clasa Spell, reprezinta proiectilul? Si calculezi distanta de la proiectil la owner de ce? Pentru a-l proiecta apoi cum avanseaza in timp?
GustavoPop: Salut ! 1
GustavoPop: Stai , scuze , iti raspund concret imediat
GustavoPop: 1) Coordonatele mouse-ului sunt de la trueCoords.x si trueCoords.y
GustavoPop: 2) Da , range-ul este distanta pe care proiectilul va fi trimis
GustavoPop: 3) Clasa Spell este proiectilul
GustavoPop: Nu calculez distanta de la proiectil la owner ci de la Owner la capatul proiectilului (unde va disparea)
blindseeker90: Si proiectilul cum stie sa se duca de la Owner la punctul To in linie dreapta?

Răspunsuri la întrebare

Răspuns de blindseeker90
5
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
tan\alpha=\frac{cateta opusa}{cateta alaturata}=\frac{dist_{y}}{dist_{x}}
dar in acest caz acele distante sunt exact diferentele intre coordonatele punctelor mouse si jucator. Atunci
dist_{x}=mouse.x-jucator.x
dist_{y}=mouse.y-jucator.y
Atunci tangenta este
tan\alpha=\frac{mouse.y-jucator.y}{mouse.x-jucator.x}
Si putem afla care este unghiul din arctangenta
\alpha=arctan(tan\alpha)=unghi_pr
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
\cos{\alpha}=\frac{cateta alaturata}{ipotenuza}=\frac{dist_{x}}{range}\Rightarrow dist_{x}=\cos{\alpha}*range
\sin{\alpha}=\frac{cateta opusa}{ipotenuza}=\frac{dist_{y}}{range}\Rightarrow dist_{y}=\sin{\alpha}*range odata aflate dist_x si dist_y este simplu de gasit x,y pentru capatul proiectilului
to.x=jucator.x+dist_{x}
to.y=jucator.y+dist_{y}
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. 
Anexe:

Utilizator anonim: Bravo!
Alte întrebări interesante