Szerző Téma: Kocsi jobbrább tétele  (Megtekintve 1096 alkalommal)

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Kocsi jobbrább tétele
« Dátum: 2012. április 27. - 16:45:22 »
0 Show voters
Üdv!
Hogy lehetne azt megoldani, hogy ha adott X,Y,Z koordináta a kocsit mindig kicsit jobbrább rakja le? Pl. egy út közepére lerakott kocsit pár egységgel jobbra tegyen le, hogy a sávban legyen? Nem hiszem hogy ezt megoldhatnám csak X+valamennyi, Y+valamennyivel, hisz pl. egy kelet-nyugati irányú úton máshogyan kell rakni, mint egy észak-déli irányúnál.
Megvan a kocsi szöge ami beállítódik akkor, amikor fordul az adott pont felé, ha ez segít.
Válaszotokat elõre is köszönöm,
krisk
« Utoljára szerkesztve: 2012. április 28. - 06:41:53 írta krisk »

Kocsi jobbrább tétele
« Válasz #1 Dátum: 2012. április 27. - 17:30:04 »
0 Show voters
Próbáld ezt átalakítani jármûvekhez:
 
// ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ [ GetXYInFrontOfPlayer ] ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ // Created by Y_Less
stock
GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
{
new
    Vehicle_ID = GetPlayerVehicleID(playerid),
Float:a;
if(Vehicle_ID)
{
    GetVehiclePos(Vehicle_ID,x,y,a);
    GetVehicleZAngle(Vehicle_ID, a);
} else {
GetPlayerPos(playerid, x, y, a);
GetPlayerFacingAngle(playerid, a);
}
x += (distance * floatsin(-a, degrees));
y += (distance * floatcos(-a, degrees));
}

 
Ez vissza adja elég pontosan egy jármû vagy egy játékos elõtti pozíció-t.
A jobb és bal oldali irányt meg a szög (angle) 90 vagy 270 fokkal történõ növelésével tudnád behatárolni.
Ha feltételezed hogy a 0 fok irányába nézel akkor az óramutató járásával megegyezõ irányba 90 fokra van a jobb oldal és 270 fokkal növelve van a bal oldal, 180 fokkal a hátrafelé.
Kísérletezz.  :D

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Kocsi jobbrább tétele
« Válasz #2 Dátum: 2012. április 27. - 18:21:07 »
0 Show voters
Én ehhez síkhülye vagyok, máskülönben nem kértem volna segítséget.
Megadok több infót, ha tényleg ezzel kell, akkor nekiállok kísérletezni.
 

stock PullVehicleIntoDirection(vehicleid, Float:x, Float:y, Float:z, Float:speed)//Thanks to Miguel for supplying me with this function, I have edited it a bit
{
new
        Float:distance,
        Float:vehicle_pos[3];
    GetVehiclePos(vehicleid, vehicle_pos[0], vehicle_pos[1], vehicle_pos[2]);
#if defined USE_SMOOTH_TURNS
new Float: oz = atan2VehicleZ(vehicle_pos[0], vehicle_pos[1], x, y);
new Float: vz;
GetVehicleZAngle(vehicleid, vz);
if(oz < vz-180) oz = oz+360;
if(vz < oz-180) vz = vz+360;
new Float: cz = floatabs(vz - oz);
#else
SetVehicleZAngle(vehicleid, atan2VehicleZ(vehicle_pos[0], vehicle_pos[1], x, y));
#endif
    x -= vehicle_pos[0];
    y -= vehicle_pos[1];
    z -= vehicle_pos[2];
    #if defined DEPRECATE_Z
    distance = floatsqroot((x * x) + (y * y));
    x = (speed * x) / distance;
    y = (speed * y) / distance;
    GetVehicleVelocity(vehicleid, vehicle_pos[0], vehicle_pos[0], z);
    #else
    z+=0.11;
    distance = floatsqroot((x * x) + (y * y) + (z * z));
    x = (speed * x) / distance;
    y = (speed * y) / distance;
    z = (speed * z) / distance;
    #endif
#if defined USE_SMOOTH_TURNS
if(cz > 0)
{
new Float: fz = cz*0.0015;
if(vz < oz) SetVehicleAngularVelocity(vehicleid, 0.0, 0.0, fz);
if(vz > oz) SetVehicleAngularVelocity(vehicleid, 0.0, 0.0, -fz);
}
#endif
    SetVehicleVelocity(vehicleid, x, y, z);
}
forward Float:atan2VehicleZ(Float:Xb,Float:Yb,Float:Xe,Float:Ye);// Dunno how to name it...
stock Float:atan2VehicleZ(Float:Xb,Float:Yb,Float:Xe,Float:Ye)
{
new Float:a = floatabs(360.0 - atan2( Xe-Xb,Ye-Yb));
if(360 > a > 180)return a;
return a-360.0;
}

 
Ez maga a kód amivel kéne nekem a kocsit az adott pont felé varázsolnom (minden konstans deklarálva van). Az X,Y,Z koordinátákra nagyon szépen odaállítja a kocsit, ha kell, viszont nekem az kéne, hogy a ponttól (ami a sáv közepe) a megfelelõ jobboldali sávba helyezze a játékost. A szöget csak akkor tudom meg, mikor már kiszámítja a függvényben, ezt esetleg tudnám manipulálni valahogy. Hogy hogyan, azt nem tudom.
A probléma, hogy a trigometria konkrétan az a tudományág, amihez sík hülye vagyok, ami nem jön valami jól, ha az ember ilyen dolgot csinál.
Amit szeretnék csinálni, az a \"like that\" képen látható. Amit eddig sikerült, de nem akarom, az a not like that. A nyíl mutatja hogy merre ment az autó...
http://imagerz.com/QFdDX1VSBl8
« Utoljára szerkesztve: 2012. április 27. - 18:55:29 írta krisk »

Kocsi jobbrább tétele
« Válasz #3 Dátum: 2012. április 27. - 20:02:07 »
0 Show voters
A trigonometria nekem se az erõsségem de azt se tudom mi akar lenni ami a képen van.
Valami életszerû példa rá talán?
Most azt írod hogy a jármûvet már megfelelõ pozícióba állítja és a játékost kellene a kocsi jobb oldalára tenni?
Elsõ kérdésben meg azt vettem ki hogy a jármûveket kell jobbra tenni.
Újra átolvastam és ezt vettem ki belõle:
Valami olyasmit szeretnél hogy halad egy gépjármû egy sávban és hirtelen át dobná a másik sávba, ami tõle jobbra helyezkedik el?
Ha azt mondod hogy neked sikerült az a \"not like that\" akkor csak az elfordulási szöggel van a probléma.
Az igazság az hogy nincs ötletem hogy mire is jó ez az egész.  :angel:

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Kocsi jobbrább tétele
« Válasz #4 Dátum: 2012. április 27. - 21:14:59 »
0 Show voters
Szóval maga a lényeg.
Van nekem egy rakat pontom, amik a GTA:SA-ban lévõ utak íveit mutatják meg, csomópontokkal és összekötésekkel. Ez gyakorlatilag egy gráf, és minden csomópontnak felel meg egy-egy ilyen általam \"pont\"nak nevezett dolog. Ezek össze vannak kötve, és a SAban ezek segítségével mozognak az autók. Az én tervem az, hogy ezenek az utakon NPCket fogok vezettetni.
A probléma ezzel az, hogy mindegyik ilyen pont az út közepén, a záróvonalon helyezkedik el, ami ugye nem optimális, mert senki nem akarja, hogy az NPCk a szerveren a záróvonalon menjenek. Ezért azt találtam ki, hogy az helyett hogy 2 hónapon át az összeset újrateszem, inkább valahogyan megoldom, hogy az adott, záróvonalon lévõ X,Y,Z koordináták helyett, amik a valódi pontokat mutatják, eltolom õket jobbra, hogy a tényleges sávban legyen az autó. Tehát az út közepén lévõ valódi pontok koordinátái helyett a tõlük kicsit jobbra lévõ pontokat kapná meg a script, és oda vezetné az autót.
------
EDIT: A megoldás
[pawn]
new Float:zangle;
GetVehicleZAngle(vehicleid,zangle);
zangle = ((zangle - 90.0) < 0.0) ? (360.0 + (zangle - 90.0)) : (zangle - 90.0);
x += (2 * floatsin(-zangle, degrees)); // 2=táv az elmozdításhoz
y += (2 * floatcos(-zangle, degrees)); //ugyanez
[/pawn]
« Utoljára szerkesztve: 2012. április 27. - 21:30:16 írta krisk »

Kocsi jobbrább tétele
« Válasz #5 Dátum: 2012. április 27. - 22:02:41 »
0 Show voters
Így már sokkal világosabb a dolog és a pont az a megoldás amit elsõnek javasoltam.
De megpróbálhatod úgyis hogy nem figyelsz a szög értékekre hogy kisebb-e mint 0 vagy nagyobb-e mint 360 fok. A samp belsõleg kezeli ezeket, ki próbálhatod SetVehicleZAngle(vehicleid, 520.00); majd lekérdezed a szög adatot.
Edit:
De ebben az utolsóban lehet hogy tévedek mert pontos szög adat kelhet floatsin és floatcos szögfüggvényekhez.
Edit:
Ugyanaz amit írtál csak kicsit átláthatóbb.
 
new Float:zangle;
GetVehicleZAngle(vehicleid,zangle);
zangle -= 90.0000;
zangle = (zangle < 0.0) ? (360.0 + zangle) : zangle);
x += (2 * floatsin(-zangle, degrees)); // 2=táv az elmozdításhoz
y += (2 * floatcos(-zangle, degrees)); //ugyanez

 
Akkor a jobbra irány az óramutató járásával ellentétes irányba lenne 90 fokkal?
Hát ezt majd meglesem, most fogalmam sincs hogy jobbra vagy balra vannak-e a fok beosztások sa-mp -ben.  ;D
« Utoljára szerkesztve: 2012. április 27. - 22:15:21 írta ɐʞzssǝlosz »

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Kocsi jobbrább tétele
« Válasz #6 Dátum: 2012. április 28. - 06:41:34 »
0 Show voters
Idézetet írta: ɐʞzssǝlosz date=1335556961\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"20687\" data-ipsquote-contentclass=\"forums_Topic
Így már sokkal világosabb a dolog és a pont az a megoldás amit elsõnek javasoltam.
De megpróbálhatod úgyis hogy nem figyelsz a szög értékekre hogy kisebb-e mint 0 vagy nagyobb-e mint 360 fok. A samp belsõleg kezeli ezeket, ki próbálhatod SetVehicleZAngle(vehicleid, 520.00); majd lekérdezed a szög adatot.
Edit:
De ebben az utolsóban lehet hogy tévedek mert pontos szög adat kelhet floatsin és floatcos szögfüggvényekhez.
Edit:
Ugyanaz amit írtál csak kicsit átláthatóbb.
 
new Float:zangle;
GetVehicleZAngle(vehicleid,zangle);
zangle -= 90.0000;
zangle = (zangle < 0.0) ? (360.0 + zangle) : zangle);
x += (2 * floatsin(-zangle, degrees)); // 2=táv az elmozdításhoz
y += (2 * floatcos(-zangle, degrees)); //ugyanez

 
Akkor a jobbra irány az óramutató járásával ellentétes irányba lenne 90 fokkal?
Hát ezt majd meglesem, most fogalmam sincs hogy jobbra vagy balra vannak-e a fok beosztások sa-mp -ben.  ;D
 
Az óramutató járásával megegyezõ irányban rendre Észak, Kelet, Dél, Nyugat. Asszem SetPlayerFacingAngle szóciknél a wikin is otvan.
Minden esetre megoldva, zárok.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal