Szerző Téma: Pozíció meghatározása  (Megtekintve 1686 alkalommal)

Nem elérhető wRt

Pozíció meghatározása
« Dátum: 2017. július 13. - 23:45:41 »
0 Show voters
Sziasztok, meggyőződésem hogy már volt egy ehhez hasonló kérdés a fórumon, viszont én sajnos nem tudtam megtalálni, ezért is folyamodnék ehhez a módszerhez.
 
A kérdést sajnos nem tudom pontosan megfogalmazni, ezért példát írok rá.
 

new Float: Pos[3];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
CreateObject(0, Pos[0], Pos[1], Pos[2], ...);

 
Hogy ha én nem azt szeretném, hogy közvetlenül a játékos pozíciójára hozza létre az objektet, hanem például öt egységgel arrébb, akkor melyik értékhez kellene hozzáadnom ötöt?
 
Értelemszerűen a játékostól abban az irányban öt egység, amerre éppen néz, ezért nem tudom eldönteni.
 
Előre is köszönöm a hasznos válaszokat.

Pozíció meghatározása
« Válasz #1 Dátum: 2017. július 14. - 01:26:27 »
+1 Show voters
Így?
 

new Float:Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid, Pos[3]);
CreateObject(0, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, 0);

 

   Copy

Pozíció meghatározása
« Válasz #2 Dátum: 2017. július 14. - 11:45:25 »
+1 Show voters
Amit impreZZa úr írt, annak elvileg müködnie kéne, és így lehet pontos értéket megkapni. Illetve van egy másik módszer is ami ezen az elven alapul.
 
Szintén lekérdezed a FacingAngle-t és hogyha egy adott tartományban van akkor arra fele rakja az objektet. (0;-90) (-90;-180) stb... Azonban ez nem pontos érték.
 
Ezért érdemes suliban sin,cos,tg,ctg-t tanulni mert mindenhol jól jöhet :D
 
Illetve tömb helyett: new Float:Pos[4]; használj sima változókat, mivel a tömb be beletölteni a értékeket jobban terheli a rendszert mint ha sima változókba.
 
new Float:X,Float:Y,Float:Z,Float:A;
 
#EnumLogic

Nem elérhető wRt

Pozíció meghatározása
« Válasz #3 Dátum: 2017. július 14. - 15:31:26 »
0 Show voters
Valóban működik, már csak az lenne a kérdésem, hogy a matematika csodáival megoldható-e az, hogy a létrehozott objektet a CreateObject függvény utolsó három paraméterével felém forgassa el, tehát hogy velem szemben legyen?
 
Gondolom az ellentéte kell annak, amerre a játékos néz, de magamtól nem tudtam rájönni, hogy pontosan milyen értéket is kellene oda írni, illetve hogy melyik paraméternek kellene változtatni az értékét.
 

COMMAND:create(playerid)
{
new Float: Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);

GetPlayerFacingAngle(playerid, Pos[3]);

CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, 0);
return 1;
}

 
Nem gond, ha esetleg nem megoldható.
 
A 2063-as objekttel dolgoztam, ami egy polcszerűség, ezt szeretném létrehozás után automatikusan felém forgatni.
 
Előre is köszönöm ismét a hasznos válaszokat, illetve köszönöm az előzőket is.

Nem elérhető whadez

  • 719
  • DEFEATER
    • Profil megtekintése
Pozíció meghatározása
« Válasz #4 Dátum: 2017. július 14. - 16:55:09 »
+1 Show voters
Idézetet írta: Naretev date=1500025525


   
      Amit impreZZa úr írt, annak elvileg müködnie kéne, és így lehet pontos értéket megkapni. Illetve van egy másik módszer is ami ezen az elven alapul.
   
   
      Szintén lekérdezed a FacingAngle-t és hogyha egy adott tartományban van akkor arra fele rakja az objektet. (0;-90) (-90;-180) stb... Azonban ez nem pontos érték.
   
   
      Ezért érdemes suliban sin,cos,tg,ctg-t tanulni mert mindenhol jól jöhet :D
   
   
      Illetve tömb helyett: new Float:Pos[4]; használj sima változókat, mivel a tömb be beletölteni a értékeket jobban terheli a rendszert mint ha sima változókba.
   
   
      new Float:X,Float:Y,Float:Z,Float:A;
   
   
      #EnumLogic
   


xDD
« Utoljára szerkesztve: 2017. július 14. - 16:55:17 írta DEFEATER »

Pozíció meghatározása
« Válasz #5 Dátum: 2017. július 14. - 17:42:59 »
0 Show voters
Cssss.. Direkt írtam rosszat XD

Nem elérhető kos

  • 292
    • Profil megtekintése
Pozíció meghatározása
« Válasz #6 Dátum: 2017. július 14. - 19:35:16 »
0 Show voters
Idézetet írta: wRt date=1500039086


   
Idézetet írta: wRt date=1500039086
      
      
         
            Valóban működik, már csak az lenne a kérdésem, hogy a matematika csodáival megoldható-e az, hogy a létrehozott objektet a CreateObject függvény utolsó három paraméterével felém forgassa el, tehát hogy velem szemben legyen?
         
         
            Gondolom az ellentéte kell annak, amerre a játékos néz, de magamtól nem tudtam rájönni, hogy pontosan milyen értéket is kellene oda írni, illetve hogy melyik paraméternek kellene változtatni az értékét.
         
         

 
COMMAND:create(playerid)
{
new Float: Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);

GetPlayerFacingAngle(playerid, Pos[3]);

CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, 0);
return 1;
}

         
            Nem gond, ha esetleg nem megoldható.
         
         
            A 2063-as objekttel dolgoztam, ami egy polcszerűség, ezt szeretném létrehozás után automatikusan felém forgatni.
         
         
            Előre is köszönöm ismét a hasznos válaszokat, illetve köszönöm az előzőket is.
         
      
   
   
      Valóban működik, már csak az lenne a kérdésem, hogy a matematika csodáival megoldható-e az, hogy a létrehozott objektet a CreateObject függvény utolsó három paraméterével felém forgassa el, tehát hogy velem szemben legyen?
   
   
      Gondolom az ellentéte kell annak, amerre a játékos néz, de magamtól nem tudtam rájönni, hogy pontosan milyen értéket is kellene oda írni, illetve hogy melyik paraméternek kellene változtatni az értékét.
   
   

COMMAND:create(playerid)
{
new Float: Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);

GetPlayerFacingAngle(playerid, Pos[3]);

CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, 0);
return 1;
}

   
      Nem gond, ha esetleg nem megoldható.
   
   
      A 2063-as objekttel dolgoztam, ami egy polcszerűség, ezt szeretném létrehozás után automatikusan felém forgatni.
   
   
      Előre is köszönöm ismét a hasznos válaszokat, illetve köszönöm az előzőket is.
   


......ezt komolyan kérded?
 
GetPlayerFacingAngle(playerid, Pos[3]);
 
if(pos[3] > =180){pos[3] -= 180}
 
else if(pos[3]<180){pos[3]+=180}
 
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], pos[3], 0, 0);
 
de van erre más lehetőség is

Nem elérhető wRt

Pozíció meghatározása
« Válasz #7 Dátum: 2017. július 14. - 23:46:41 »
0 Show voters
Ahhoz képest, hogy lenéző hangnemben írtad, ez egy rakás fos, és még csak nem is működik.

Nem elérhető kos

  • 292
    • Profil megtekintése
Pozíció meghatározása
« Válasz #8 Dátum: 2017. július 15. - 00:09:13 »
0 Show voters
Idézetet írta: wRt date=1500068801


   
      Ahhoz képest, hogy lenéző hangnemben írtad, ez egy rakás fos, és még csak nem is működik.
   


Nems is fog ha így az egyben csak berakod :) ugyanis a degressel megváltoztatod a középpontját az objectnek.
 
Tegyük fel hogy nem forgatod rx ry rz pozícióban az objektum csavarodva fog megjelenni amint elfordulsz
 
A matematikáját azt neked kell kiszámolnod, ez csak egy elemzés.
 
 Pos[3] az rx helyére került ha ott nem jó megnézed ry vagy rz nél vannak objektumok amik nem vízszintesen vagy függőlegesen vannak alapból így az értékek változók objektumonként. zárójelben megjegyzem (igen akármelyikhez ha beilleszted a Pos[3]-mat önmagában nem lesz jó )

Nem elérhető kos

  • 292
    • Profil megtekintése
Pozíció meghatározása
« Válasz #9 Dátum: 2017. július 15. - 00:36:53 »
0 Show voters
De mivel jókedvemben vagyok, megsúgom, hogy lehetséges a degressel 
 
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, Pos[3]-180);
 



   
      ......ezt komolyan kérded?
   
   
      GetPlayerFacingAngle(playerid, Pos[3]);
   
   
      if(pos[3] > =180){pos[3] -= 180}
   
   
      else if(pos[3]<180){pos[3]+=180}
   
   
      CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], pos[3], 0, 0);
   
   
      de van erre más lehetőség is
   

[/quote]
 
A játék jobban preferálja a pozitív számokat főleg a GetPlayerFacingAngle függvénynél...
 
Ezért javaslom annak ellenére, hogy elküldtem a jó megoldást, matekozd ki a 360 at hogy sose legyen mínusz érték.
 



   
      A játék jobban preferálja a pozitív számokat főleg a GetPlayerFacingAngle függvénynél...
   
   
      Ezért javaslom annak ellenére, hogy elküldtem a jó megoldást, matekozd ki a 360 at hogy sose legyen mínusz érték.
   

[/quote]
 
Csak hogy ne bugoltassad majd későbbiekben inkább elküldöm  
 

if(Pos[3] >= 180){
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, Pos[3]-180);
}else{
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, Pos[3]+180);
}

 
Személyi tanácsom!!!!
 
CreateDynamicObject függvényt használj mindig 
« Utoljára szerkesztve: 2017. július 15. - 00:45:08 írta kos »

Nem elérhető kos

  • 292
    • Profil megtekintése
Pozíció meghatározása
« Válasz #10 Dátum: 2017. július 15. - 00:52:55 »
0 Show voters
Idézetet írta: Naretev date=1500046979


   
      Cssss.. Direkt írtam rosszat XD
   


Nem rossz a másik módszer sem... akkor kockákkal számolsz nem szögelléssel 
 
Ha pl mint most a degressnél is 5 ös távot akarunk (5m asszem az)
 
akkor 5*5 rácssal kell számolni + a 360 fok számítás ha forgatni is kellene valamerre 
 
igen egyszerű azzal is megcsinálni, és a játék is jobban preferálja a rácsozás megoldást mint a szögellést.
 
Ezt még akár Stockban is érdemes megcsinálni, mert nem kötött függvény mint jelen esetben a degress 
« Utoljára szerkesztve: 2017. július 15. - 00:57:18 írta kos »

Nem elérhető wRt

Pozíció meghatározása
« Válasz #11 Dátum: 2017. július 15. - 02:43:47 »
0 Show voters
Köszönöm.

Pozíció meghatározása
« Válasz #12 Dátum: 2017. július 15. - 19:57:34 »
0 Show voters

COMMAND:create(playerid) {
new Float:Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid, Pos[3]);
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, -atan2(Pos[0] - Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] - Pos[1] + (5.0 * floatcos(-Pos[3], degrees))));
return true;
}

 

   Copy

Nem elérhető kos

  • 292
    • Profil megtekintése
Pozíció meghatározása
« Válasz #13 Dátum: 2017. július 15. - 20:39:58 »
0 Show voters
Idézetet írta: impreZZa date=1500141454


   

COMMAND:create(playerid) {
new Float:Pos[4];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid, Pos[3]);
CreateObject(2063, Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] + (5.0 * floatcos(-Pos[3], degrees)), Pos[2], 0, 0, -atan2(Pos[0] - Pos[0] + (5.0 * floatsin(-Pos[3], degrees)), Pos[1] - Pos[1] + (5.0 * floatcos(-Pos[3], degrees))));
return true;
}

   
      
         Copy
      
   


Nem kell átesnie újra a függvényen :) elég ha berakja  Pos[3] részt a 3. 0 helyére amit elküldtem 

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal