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

Nem elérhető wRt

Pozíció meghatározása
« Dátum: 2017. Július 13. - 23:45:41 »
0
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
Í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
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
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
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
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
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
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
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
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
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
Köszönöm.

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

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
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