Перейти к содержанию

Лимит скорости передвижения


Antonshka

Рекомендуемые сообщения

Привет, сделал лимит скорости передвижения автомобиля, посредством Velocity X и Y, но почему-то иногда машина движется с разной скоростью.

К примеру, если выставить максимальное допустимое Velocity 5, то в этом случае если X будет равен 0, а Y будет равен 5, скорость будет 10 км/ч. А если Х будет равен 0.5, а Y будет равен 4.5, то скорость будет 8 км/ч.

Словом, когда одна из осей равна 0, а другая равна максимально допустимой, тогда скорость машины наибольшая.

 

Код для лимита

Спойлер

fld dword ptr [r10+rax] // Velocity Х
fabs
fld dword ptr [r10+rax+8] // Velocity Y
fabs
faddp
fcomp dword ptr [Car_Speed_Limit_Value] // (float)5
push rax
fstsw ax
sahf
pop rax
jbe @f
call Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down
@@:
popfq
jmp BACKWrite_Car_Velocity_XYZ_scr_1


Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down://Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down
fld dword ptr [r10+rax]
fdiv dword ptr [Car_Speed_Limit_Value_For_Sub] // (float)1.03
fstp dword ptr [r10+rax]
fld dword ptr [r10+rax+8]
fdiv dword ptr [Car_Speed_Limit_Value_For_Sub]
fstp dword ptr [r10+rax+8]
ret

 

 

@imaginary насколько я помню, ты знакома с координатами и с тем что с ними связано не понаслышке.

Вот здесь такая задача, - сделать лимит скорости передвижения объекта, независимо от направления его движения.

 

Мне даже не столько важно найти решение, как посоревноваться с тобой и с другими участниками. Посоревноваться, подумать вместе, вместе искать решение. Это интересно.

Как когда/то мы искали с @Garik66 способ сделать обход античита для ассасина, или искали способ сделать декриптор imul.

 

Ссылка на комментарий
Поделиться на другие сайты

Может попробовать подключить к этому вычислению косинус и синус Yaw машины ?. Опять же, нужно чтобы скорость ограничивалась и когда машина едет назад...

Ссылка на комментарий
Поделиться на другие сайты

Решение придумалось. Нужно вычислять дистанцию, используя только Velocity X и Y (Z не нужно). Далее просто сравнивать полученную дистанцию с максимально заданной.

 

 

Спойлер

fld dword ptr [r10+rax] // Velocity X
fmul st(0)
fld dword ptr [r10+rax+8] // Velocity Y
fmul st(0)
faddp st(1),st(0)
fsqrt
fcomp dword ptr [Car_Speed_Limit_Value] // Максимальная допустимая скорость, она же максимальная допустимая дистанция
push rax
fstsw ax
sahf
pop rax
jbe @f
call Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down
@@:
popfq
jmp BACKWrite_Car_Velocity_XYZ_scr_1


Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down://Write_Car_Velocity_XYZ_scr_1_Right_Adress_Car_Speed_Limit_Reset_Down
fld dword ptr [r10+rax]
fdiv dword ptr [Car_Speed_Limit_Value_For_Sub] // Делитель для уменьшения Velocity - (float)1.02
fstp dword ptr [r10+rax]
fld dword ptr [r10+rax+8]
fdiv dword ptr [Car_Speed_Limit_Value_For_Sub]
fstp dword ptr [r10+rax+8]
ret

 

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.