Вычисление дрифта - Printable Version
+- SA-MP Forums Archive (
https://sampforum.blast.hk)
+-- Forum: Non-English (
https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (
https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (
https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Вычисление дрифта (
/showthread.php?tid=341936)
Вычисление дрифта -
Hawkins - 12.05.2012
PHP Code:
public Drift()
{
new Float:Angle1, Float:Angle2, Float:BySpeed, s[128];
new Float:Z, Float:X, Float:Y;
new Float:SpeedX;
for(new g = 0; g < MAX_PLAYERS; g++)
{
GetPlayerPos(g, X, Y, Z);
SpeedX = floatsqroot(floatadd(floatadd(floatpower(floatabs(floatsub(X,SavedPos[ g ][ sX ])),2),floatpower(floatabs(floatsub(Y,SavedPos[ g ][ sY ])),2)),floatpower(floatabs(floatsub(Z,SavedPos[ g ][ sZ ])),2)));
Angle1 = ReturnPlayerAngle(g);
Angle2 = GetPlayerTheoreticAngle(g);
BySpeed = floatmul(SpeedX, 12);
if(IsPlayerInAnyVehicle(g) && IsCar(GetPlayerVehicleID(g)) && floatabs(floatsub(Angle1, Angle2)) > DRIFT_MINKAT && floatabs(floatsub(Angle1, Angle2)) < DRIFT_MAXKAT && BySpeed > DRIFT_SPEED)
{
if(PlayerDriftCancellation[g] > 0) KillTimer(PlayerDriftCancellation[g]);
PlayerDriftCancellation[g] = 0;
DriftPointsNow[g] += 10;
scores[g]++;
PlayerDriftCancellation[g] = SetTimerEx("DriftCancellation", 2000, 0, "d", g);
}
if(DriftPointsNow[g] > 0)
{
if(scplay[g] == 1)
{
TextDrawShowForPlayer(g,Chet[g]);
format(s, sizeof(s), "Drift: ~g~+%d$", DriftPointsNow[g]);
TextDrawSetString(Chet[g], s);
}
}
SavedPos[ g ][ sX ] = X;
SavedPos[ g ][ sY ] = Y;
SavedPos[ g ][ sZ ] = Z;
}
return 1;
}
У меня чё то этот код не прет....Мож у кого есть чё по легче?
Re: Вычисление дрифта -
iEnemY - 12.05.2012
Drift Point Counter Plugin
Re: Вычисление дрифта -
White_116 - 12.05.2012
Функция вычисления угла дрифта:
PHP Code:
stock Float:GetVehicleDriftAngle(Float:x,Float:y,Float:a)
{
new Float:unit_interval = floatsqroot(x*x + y*y);
new Float:arcsin = asin( y/unit_interval );
new Float:arccos = acos( x/unit_interval );
new Float:angle;
if(arcsin >= 0.0) angle = arccos;
else angle = 360.0 - arccos;
a += 90.0;
if(a >= 360.0) a -= 360.0;
if(angle > a) return angle-a;
else return a-angle;
}
Float
,Float:y - GetVehicleVelocity(), Float:a - поворот машины
//-------------------
IsPlayerInAnyVehicle(g) - почему бы не сделать проверку только на водителя?
если даже врезаться то очки не снимает =/
Re: Вычисление дрифта -
Hawkins - 12.05.2012
White_116 можешь пример показать использование этой функции?
Re: Вычисление дрифта -
Evansive - 12.05.2012
PHP Code:
stock Float:GetVehicleDriftAngle(vehicleid)
{
new Float:x, Float:y, Float:z;
GetVehicleVelocity(vehicleid, x, y, z);
new Float:unit_interval = floatsqroot(x*x + y*y);
new Float:arcsin = asin( y/unit_interval );
new Float:arccos = acos( x/unit_interval );
new Float:angle;
if(arcsin >= 0.0) angle = arccos;
else angle = 360.0 - arccos;
new Float:real_angle;
GetVehicleZAngle(vehicleid, real_angle);
real_angle += 90.0;
if(real_angle >= 360.0) real_angle -= 360.0;
if(angle > real_angle) return angle-real_angle;
else return real_angle-angle;
}
пы.сы: с пастебина.
Re: Вычисление дрифта -
White_116 - 12.05.2012
вот укоротил то что раньше кидал
PHP Code:
stock Float:GetVehicleDriftAngle(Float:x,Float:y,Float:a)
{
new Float:Angle = floatsqroot(x*x + y*y);
if((asin( x/Angle )*-1) <= 0.0)Angle = 360.0 - acos( y/Angle );
else Angle = acos( y/Angle );
if(Angle > a)
{
if(Angle-a>180.0)return (360.0-Angle)+a;
else return Angle-a;
}
else
{
if(a-Angle>180.0)return (360.0-a)+Angle;
else return a-Angle;
}
}
//---------------------
Исправил баг с углом, когда он был больше 180.