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
При нажатии Пробел` шарик будет отскакивать от земли на нужную дистанцию:
× **ВАЖНО:** Не все объекты могут вносится в список движений. Многое количество просто падают под текстуру земли и парят вниз× **Интересно:** Если задать объекту массу опкодом 0906 игровые субъекты будут получать повреждения. Например при установки на 500000.0 за несколько подходов убивает CJ при столкновениях
Другой опкод, практически идентичный, выглядит так:
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|79905200png
600337
400`224``||metanie_obektov|1504593660
Last updated
Was this helpful?