Функция задания скорости авто
#1

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

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

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;

Reply
#2

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

Как быть ,)
Reply
#4

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

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

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

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

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

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;

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


Forum Jump:


Users browsing this thread: 2 Guest(s)