SA-MP Forums Archive
Функция задания скорости авто - 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=486432)



Функция задания скорости авто - Mexanizm93 - 08.01.2014

Здравствуйте уважаемые пользователи.

Есть функция задания скорости авто но в ней есть две проблемы.

1 проблема:
Если машина подлетит с бугра или возвышенности, находясь на включённом ограничителе(функция включена), то начинает плавно лететь, пока не приземлится.

2 проблема:
Машина становится трудро управляемой при ограничителе. Сложно повернуть руль проще говоря.

Дело в том, что я не очень понимаю как работает эта функция.
Надеюсь на вашу помощь.


Сама функция:
PHP код:
forward SetVehicleSpeed(vehid,speed);
public 
SetVehicleSpeed(vehid,speed)
{
    new 
Float:angl,Float:spd[3],Float:curvector,Float:coord[3];
    switch(
speed)
    {
    case 
35:curvector 0.589365;
    case 
40:curvector 0.631516;
    case 
45:curvector 0.67;
    case 
50:curvector 0.705142;
    }
    
GetVehicleVelocity(vehid,spd[0],spd[1],spd[2]);
    
PlanarZAngle(spd[0],spd[1],angl);
    new 
Float:zangle atan(spd[2]/(spd[0]*spd[0]+spd[1]*spd[1]));
    new 
Float:newRad curvector*floatcos(zangle,degrees);
    
coord[0] = newRad*(-1)*floatsin(angl,degrees);
    
coord[1] = newRad*floatcos(angl,degrees);
    
SetVehicleVelocity(vehidcoord[0],coord[1],spd[2]);
    return 
1;




Re: Функция задания скорости авто - Mutha_X - 08.01.2014

Лол, ты поставил множитель на вертикальное ускорение, конечно же ты будешь лететь как фанера над Парижем.


Re: Функция задания скорости авто - Mexanizm93 - 08.01.2014

Как быть ,)


Re: Функция задания скорости авто - White_116 - 08.01.2014

Quote:
Originally Posted by Mexanizm93
Посмотреть сообщение
Как быть ,)
Никак, пинг + постоянное задание ускорения + нет учёта нажатие клавиши + нет учёта касания колёс поверхности (парения в воздухе).
Функция подходит только для разового(редко) задания скорости но никак для постояной(частого).


Re: Функция задания скорости авто - Urukhay - 09.01.2014

Quote:
Originally Posted by White_116
Посмотреть сообщение
Никак, пинг + постоянное задание ускорения + нет учёта нажатие клавиши + нет учёта касания колёс поверхности (парения в воздухе).
Функция подходит только для разового(редко) задания скорости но никак для постояной(частого).
Про касание колес поверхности по подробнее... Как проверить?


Re: Функция задания скорости авто - Mexanizm93 - 10.01.2014

Дак я и спрашиваю как её сделать для постоянного использования ?


Re: Функция задания скорости авто - Stepashka - 10.01.2014

Quote:
Originally Posted by Mexanizm93
Посмотреть сообщение
Дак я и спрашиваю как её сделать для постоянного использования ?
Ни как.


Re: Функция задания скорости авто - Mexanizm93 - 10.01.2014

Плохо.. Может ещё нибудь кто поможет. Тему пока не буду закрывать.


Re: Функция задания скорости авто - SDraw - 10.01.2014

Quote:
Originally Posted by White_116
Посмотреть сообщение
+ нет учёта касания колёс поверхности (парения в воздухе).
А вот этого вообще не определяется в SAMP'e. В другом - да, тут - нет.
Единственная проблема - это пинг. Чем у игрока выше пинг, тем позже он получит новые данные, и уже в текущий момент у него может быть другая позиция и ротация машины, и мы ему пихаем данные из прошлого, которое уже нафиг не нужно. Предугадать никак.
У меня есть код, который хорошо работает на локальном сервере. На остальных будет беда, описанная выше.
PHP код:
#define FILTERSCRIPT
#include <a_samp>
public OnPlayerUpdate(playerid)
{
    if(
IsPlayerInAnyVehicle(playerid))
    {
        new 
veh GetPlayerVehicleID(playerid);
        new 
Float:vz[3];
        
GetVehicleVelocity(veh,vz[0],vz[1],vz[2]);
        new 
Float:rad floatsqroot(vz[0]*vz[0]+vz[1]*vz[1]);
        new 
Float:speed rad*100;
        if(
speed 80)
        {
            new 
Float:org_vect 0.787197;
            new 
Float:xyangle;
            
PlanarZAngle(vz[0],vz[1],xyangle);
            new 
Float:zangle atan2(vz[2],rad);
            new 
Float:newRad org_vect*floatcos(zangle,degrees);
            
SetVehicleVelocity(veh,newRad*(-1)*floatsin(xyangle,degrees),newRad*floatcos(xyangle,degrees),floatsin(zangle,degrees)*org_vect);
            
SendClientMessage(playerid,-1,"> Speed was decreased.");
        }
    }
    return 
1;
}
stock PlanarZAngle(Float:x,Float:y,&Float:ang)
{
 new 
Float:angl atan(floatdiv(y,x));
 if(
>= 0.0 && >= 0.0 || >= 0.0 && <= 0.0ang angl 270.0;
 else if(
<= 0.0 && >= 0.0 || <= 0.0 && <= 0.0ang angl 90.0;
 return 
1;

Длину вектора подбираем для каждой скорости сами.