000142. Метание объектов

Метание объектов|Всем привет! В этом уроке я хотел бы поделится новой информацией для меня - метание объектов.|wmysterio|wmysterio||||Что бы бросить объект в нужную сторону, достаточно воспользоваться опкодом:

0381: throw_object 0@ velocity_in_direction 10.0 0.0 4.0

Раньше я думал, что последние параметры это координаты куда нужно бросать объект, но, как оказалось, это далеко не так. Рассмотрим сами параметры:

Здесь: 0@ - хэндл объекта, которого нужно бросать 10.0 - сила "удала" по объекту, будет двигаться по оси X, объект отлетит на 10.0 метров 0.0 - аналогично, только для оси Y. 4.0 - аналогично, только для оси Z. Как только объект достигнет высоты в 4.0, он начнёт падать на землю

При применении этого опкода объект, как правило, ничего не делает: просто стоит на месте. Чтобы объект мог метаться нужно внести его в список движений:

0392: make_object 0@ moveable 1

Теперь объект можно метать. Давайте напишем скрипт "Шарик", в котором можно метать бильярдный шар:

{$CLEO}
thread 'SCHARIK'
04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 5.0 0.0
model.Load(3002)
038B: load_requested_models
object.Create(0@, 3002, 1@, 2@, 3@)
Object.SetImmunities(0@, 1, 1, 1, 1, 1)
marker.CreateAboveObject(1@, 0@)
0392: make_object 0@ moveable 1

while true
 if
 0AB0: 32 // space
 then
 0381: throw_object 0@ velocity_in_direction -10.0 0.0 4.0
 end
wait 0
end

0A93: end_custom_thread

При нажатии Пробел` шарик будет отскакивать от земли на нужную дистанцию:

Другой опкод, практически идентичный, выглядит так:

05A7: set_object 0@ velocity_in_direction_X -10.0 direction_Y 0.0 direction_Z 4.0

Единственное отличие от "0381": мы указываем ускорение объекта, а не силу. Из этого выходит, что объект будет "бросаться" чуть быстрее. Как многим известно, при изменении чисел при умножении итог не изменится, но похоже GTA программисты решили потролить математиков и сделали, что "СИЛАУСКОРЕНИЕ" не равно "УСКОРЕНИЕСИЛА" ( или описание не соответвует действительности ). К примеру:

0381: throw_object 0@ velocity_in_direction -5.0 0.0 4.0
05A7: set_object 0@ velocity_in_direction_X -5.0 direction_Y 0.0 direction_Z 4.0

и

05A7: set_object 0@ velocity_in_direction_X -5.0 direction_Y 0.0 direction_Z 4.0
0381: throw_object 0@ velocity_in_direction -5.0 0.0 4.0

дают разные результаты. Первый вариант идеально подходит под формулу и это визуально заметно. Второй же существенно отличается: действует как опкод "0381", но метание происходит более плавно. На скрине выше можно увидеть что-то похожее на искры. Пример убирает этот недостаток.

Также есть возможность получить текущее ускорение объекта опкодом:

059F: get_object 0@ velocity_in_direction 1@ 2@ 3@

В переменные 1@ 2@ 3@ запишутся текущие ускорения для объекта 0@ по всем 3-м осям.

× **ВАЖНО:** Метание происходит по глобальным координатам, что существенно усложняет вычисление нужных чисел для правильного броска

По такому принципу был написан "Пул" из оригинального мейна, но там очень сложный алгоритм, чтобы его объяснить подробнее. Надеюсь эта информация немного дала вам понять как метать объекты. С Вами был "wmysterio".|1803|1|0|79905200png600337400`224``||metanie_obektov|1504593660

Last updated