Szerző Téma: [TuT]Térgeometria: Körbe menni a játékos körül  (Megtekintve 2588 alkalommal)

GroX

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Dátum: 2011. Május 23. - 20:05:47 »
+1
Még egy számítgatós lecke tõlem...
A lecke lényege: Egy játékos (de lehet akár pont is) körül egy kör formának a pozícióit kiszámolgatjuk.
Feltétlennül szükséges függvények:
- floatsin
- floatcos
Rövid lesz.
Elõször is lekérjük a játékos nézetét. Ha pontról van szó, és nem játékosról, akkor csak szimplán megadjuk ezt 0-nak.
 
new Float:a;
GetPlayerFacingAngle(playerid,a);

 
Pont esetén csak: new Float:a = 0;
Lekérjük a játékos pozícióját. Pont esetében a pozíció adott.
 
new Float:P[3]; //Lebegõpontos tömb a pozícióhoz
GetPlayerPos(playerid,P[0],P[1],P[2]); //Lekérés

 
Pontnál csak tudni kell a koordinátákat, és belehelyezni egy ugyanilyen tömbbe, de nem muszály.
Most jön a lényeg. Az X pozíciónak a Szinuszát kiszámítjuk a játékos nézetével. Az Y pozíciónak pedig a Kosziniszát számoljuk ki, szintén a játékos nézetének segítségével. Ezzel megkapjuk a játékos elõtti pozíciót. Esetleg megszorozhatjuk valamennyivel, hogy távolabb legyen. Ezt függvénybe helyezzük. Példának most a játékost a körbe fogjuk mozgatni, a kezdõ pozíciójától kezdve.
 
SetPlayerPos(playerid,P[0] - 2 * floatsin(-a,degrees), P[1] - 2 * floatcos(-a,degrees), P[2]);

 
A struktúra a következõ: Pozíció (változó) - távolság * szögfüggvény(a nézet ellentetje, számolási módszer)
FIGYELMEZTETÉS: Mivel most kivonunk, így minél nagyobb számmal szorzod a számítást, annál KÖZELEBB lesz a távolság!
Magyarul elõször megszorozzuk a távolsággal a kiszámolt pozíciót, ami a nézethez képest elõl van, majd a játékos koordinátájának egy elemébõl (tehát X, és aztán Y) kivonjuk ezt.
És ezt mind egy timerrel kell csinálni, vagy akár ciklussal, mikor hogy. Már a pozíció beállítását is abban kell.
A pozíció beállítása után úgymond megváltoztatjuk a játékos nézetét, de mégsem. Csak a VÁLTOZÓJÁNAK az értékét fogjuk. (ugyanabban a ciklusban, timerben)
FIGYELMEZTETÉS: Mint mondtam, NEM KÉRJÜK LE ÚJRA, csak a változó értékét megváltoztatjuk, a játékosnak meg NEM változtatjuk a nézetét, csak a VÁLTOZÓÉT (tehát csak egyszer kellett lekérni, azt eltároltuk már).
 
a += 1;

 
A nézet változójához hozzáadtunk egyet. 0.5-el sokkal simább a kör, de több idõt is igényel, ráadásul most egész számmal számoljunk inkább.
És ezután újra beállítjuk, de ezt egy ciklus, timer segítségével. Tehát, NEM írjuk be újra a SetPlayerPos -t, hanem csak lefuttatjuk újra a ciklust amibe már beleírtuk (vagy esetleg timer).
Ha ciklust használunk, és 1-el növeljük mindig a nézetünk értékét, akkor célszerû a ciklus feltétel értékét 360-ra állítani, mivel ugyebár 360 fokos egy kör, és 360 pont kell gyakorlatilag, tehát 360x kell számolnunk :).
 
for(new f=0; f < 360; f++) //Ciklus létrehozása
{
    //a nemrég említett SetPlayerPos, ugyanazokkal a számításokkal
    SetPlayerPos(playerid,P[0] - 2 * floatsin(-a,degrees), P[1] - 2 * floatcos(-a,degrees), P[2]);
    a += 1; //hozzá adunk egyet a nézet változójához, így \"félig\" megadtuk a következõ pozíciót
}

 
Timernél szinte ugyanez, csak ott az idõt is meg kell adnunk, és meg kell néznünk, hogy 360-at elérte-e már a változónk.
 
public MovePlayer(playerid)
{
    //a nemrég említett SetPlayerPos, ugyanazokkal a számításokkal
    SetPlayerPos(playerid,P[0] - 2 * floatsin(-a,degrees), P[1] - 2 * floatcos(-a,degrees), P[2]);
    //ha 360-at elérte a változó, megszakítjuk a timert, hogy ne számoljon feleslegesen tovább
    if(a >= 360) return KillTimer(timer),0;
    a += 1; //hozzá adunk egyet a nézet változójához, így \"félig\" megadtuk a következõ pozíciót

 
És persze be kell állítanunk az idõzítõt, de fontos hogy adjunk neki azonosítót, hogy ki tudjuk iktatni, ha már nem kell. A timer idejét annyira állítsátok, amilyen gyakran akarjátok, hogy lépegessen.
 
timer = SetTimerEx(\"MovePlayer\",1000,1,\"i\",playerid);

 
Ennyi lenne errõl, szerintem eléggé érthetõ.

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #1 Dátum: 2011. Május 23. - 20:40:18 »
0
Szép leírás, az elején bele akartam kötni valamibe, de aztán tisztáztad, szóval lenyeltem. :) Egyébként egy konkrét példát írhatnál, hogy mire tudod ezt hasznosítani a \"mindennapokban\". ;)

Gang[St]e[R]

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #2 Dátum: 2011. Május 23. - 20:42:48 »
0
Valóban jó leírás, de az 1 másodprec alapján, és a szorzások alapján így ahogy van picit úgy fog menni a játékos mintha laggolna. De nagyon nehezen lehet pontosan beállítani, de leírásnak hasznos :)

GroX

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #3 Dátum: 2011. Május 23. - 20:48:14 »
0
\" post=\"140181\" timestamp=\"1306176168\"]
Valóban jó leírás, de az 1 másodprec alapján, és a szorzások alapján így ahogy van picit úgy fog menni a játékos mintha laggolna. De nagyon nehezen lehet pontosan beállítani, de leírásnak hasznos :)
 
[/quote]
Ja, az azért van, mert csak állítjuk a játékos pozícióját, és nem mozgatjuk. Ezt nem lehet megoldani addig, amíg nem lesz mozgató függvény a SAMP-ban. Amúgy az 1 mp az kicsit nagy idõ, szóval azért is laggolhat.

Gang[St]e[R]

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #4 Dátum: 2011. Május 23. - 21:05:23 »
0
Idézetet írta: Fade シ date=1306176494\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"8294\" data-ipsquote-contentclass=\"forums_Topic

link=topic=12254.msg140181#msg140181 date=1306176168]
Valóban jó leírás, de az 1 másodprec alapján, és a szorzások alapján így ahogy van picit úgy fog menni a játékos mintha laggolna. De nagyon nehezen lehet pontosan beállítani, de leírásnak hasznos :)
 
Ja, az azért van, mert csak állítjuk a játékos pozícióját, és nem mozgatjuk. Ezt nem lehet megoldani addig, amíg nem lesz mozgató függvény a SAMP-ban. Amúgy az 1 mp az kicsit nagy idõ, szóval azért is laggolhat.
 
[/quote]
Amúgy meg szerintem SetPlayerVelocity-vel is bugos lenne, max akkor nem, ha megfelelõ idõnként forgatnánk.
Ha már a mozgatásról van szó, ha tudnád NPC-nél mire beindul.. NPC-nél majdnem minden bugos és ott a legnehezebb szépen iránytani, Iceaac ,sajátom és Eps NPC-je sem tökéletes mivel a SetPlayerVelocity fügvény is hibás Botoknál :S Bár tuttommal mind 3-man SetPlayerPos-al csináltuk.
« Utoljára szerkesztve: 2011. Május 23. - 21:07:29 írta GangSteR] »

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #5 Dátum: 2011. Május 23. - 21:09:50 »
0
SCM szkripting forever.

Gang[St]e[R]

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #6 Dátum: 2011. Május 23. - 21:13:13 »
0
De a nagyon profik, Epsilon, ZeRo, KoWaZ(vagy ki) megtudnátok SetPlayerVelocity-vel és megfelelõ idönközönkénti forgatással oldani ,hogy gyönyörüen menjen nem laggolva nem? Bár ahoz nagyon sok teszt kellene.

Nem elérhető ZeRo

  • 4620
  • Ex Globális Moderátor
    • Profil megtekintése
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #7 Dátum: 2011. Május 23. - 21:15:35 »
0
\" post=\"140205\" timestamp=\"1306177993\"]
De a nagyon profik, Epsilon, ZeRo, KoWaZ(vagy ki) megtudnátok SetPlayerVelocity-vel és megfelelõ idönközönkénti forgatással oldani ,hogy gyönyörüen menjen nem laggolva nem? Bár ahoz nagyon sok teszt kellene.
 
[/quote]
Szerintem túlságosan terhelné a szervert, és a szinkronizáció miatt még az sem lenne tökéletes.. Itt csak a SA:MP fejlesztõire lehet számítani.

Gang[St]e[R]

  • Vendég
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #8 Dátum: 2011. Május 23. - 21:19:34 »
0
Idézetet írta: ZeRo date=1306178135\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"8294\" data-ipsquote-contentclass=\"forums_Topic

link=topic=12254.msg140205#msg140205 date=1306177993]
De a nagyon profik, Epsilon, ZeRo, KoWaZ(vagy ki) megtudnátok SetPlayerVelocity-vel és megfelelõ idönközönkénti forgatással oldani ,hogy gyönyörüen menjen nem laggolva nem? Bár ahoz nagyon sok teszt kellene.
 
Szerintem túlságosan terhelné a szervert, és a szinkronizáció miatt még az sem lenne tökéletes.. Itt csak a SA:MP fejlesztõire lehet számítani.
 
[/quote]
Meglehetne oldani ,de nagyon laggító és macerás lenne az igaz.

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #9 Dátum: 2011. Június 03. - 23:29:43 »
0
Szép leírás.
De azt bírom a legjobban, hogy aztse tudom h hogyan mûködinek ezek a szögfüggvények xD.
 
E: LOL, nem is kicsi bump Semmi, keverem a márciust & májust xD
« Utoljára szerkesztve: 2011. Június 04. - 09:44:07 írta kurta999 »

[TuT]Térgeometria: Körbe menni a játékos körül
« Válasz #10 Dátum: 2011. December 28. - 18:57:42 »
0
Hy.Ezzel meglehet csinálni azt ugye, hogy a játékos kamerája a játékos körül mozogjon? Mint ennél a GM addonnál: http://forum.sa-mp.com/showthread.php?t=90880
Edit: Gondolom igen.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal