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
É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
Í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
Í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.