Рейтинг - 5.0 (5)

Всем привет! В этом уроке я хотел бы поделится новой информацией для меня - метание объектов. Что бы бросить объект в нужную сторону. достаточно воспользоваться опкодом:
  • 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
Теперь объект можно метать. Давайте напишем скрипт "Шарик", в котором можно метать бильярдный шар:
Code
{$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 программисты решили потролить математиков и сделали, что СИЛА*УСКОРЕНИЕ не равно УСКОРЕНИЕ*СИЛА. К примеру:
Code
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
и
Code
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.

SanKing   (28.08.13 18:42)
За урок спасибо, всегда хотел понять, как это делается!

Vital   (28.08.13 18:46)
Спасибо, интересно и полезно, но хотел бы попросить добавить маленький пример вычисления силы относительно координат мира. Всё это потому, что смещение, которое мы определяем разницей координат, не всегда равно желаемой силе, что же тогда делать. Некоторые, вроде бы, советовали использовать синус или косинус, но я до сих пор не могу понять (даже смотря на тригонометрический круг), как это взаимосвязано.

wmysterio   (28.08.13 19:30)
Vital, примерно силу можно получить так:
Код
059F: get_object 0@ velocity_in_direction 1@ 2@ 3@ // получаем ускорение по оси x
0907: get_object 0@ mass_to 2@ // Получаем массу объекта
006B: 2@ *= 1@  // (float)  умножаем массу на ускорение
2@ /= 10.0 // делим её на силу гравитации, в физике это число 9.8 (оно же g ) но, скорее всего, это число округляется.
0AD0: show_formatted_text_lowpriority "%f" time 5000 2@ // выводим примерную силу, с которой бросили объект.

Vital   (28.08.13 22:47)
Я имел в виду не величину силы, а то, как метнуть объект, к примеру, вперед относительно игрока, а не мира и т.п.
P.S. Хотя и может быть иногда полезно.

wmysterio   (28.08.13 22:52)
Vital, сейчас ответить не могу, так как не знаю опкода, но если высчитывать через углы(как ты писал в сообщении ниже), то возможно получится. Завтра подумаю как это сделать.

DK22Pac   (29.08.13 16:17)
Здесь есть неплохая статья по теме.
http://varistor.dyndns.org/wiki....0%BA%EE

Vital   (29.08.13 18:13)
DK22Pac, хм, там идёт привязка объекта к игроку, а это действительно помогает объекту правильно лететь относительно игрока? Просто с этим у меня всегда трудности, сложно определить, как пнуть объект, чтобы он, к примеру, летел вперёд от игрока.

HYPERMUV   (07.09.13 17:29)
Vital, могу предложить следующее:
Код
object.storepos(0@,1@,2@,3@) // берём координаты объекта
4@ = -1233.2 // задаем нужные координаты куда полетит объект
5@ = 256.3
6@ = 23.1
0063: 1@ -= 4@
0063: 2@ -= 5@
0063: 3@ -= 6@
0381: throw_object 0@ velocity_in_direction 1@ 2@ 3@ // или 05A7 не знаю пробуй
думаю должно получится, сам не тестил

HYPERMUV   (07.09.13 19:04)
Vital я попробовал с 05а7, всё получилось, предложенный метод работает, так же можно использовать для других случаев, к примеру метание машины с помощью опкода in direction, уже в сампе поиздевался над игроками rah

NaightMar   (28.12.14 12:26)

Код
{$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

Заметил, что если встать под траекторию полета мячика, то он может зарядить по персонажу, тем самым снять несколько десятков здоровья.
Этот шарик убивает лучше меня...

0
wmysterio   (28.12.14 16:14)
Всё верно. Если ещё задать массу(опкод 0906) объекту, то урон возрастает

GeniusZ   (29.08.15 17:35)
странно, но у меня объект летит вверх все время и в воздухе останавливается
Код
while 8AB0: key_pressed 50
  wait 0
end
Model.Load(3002)              
038B: load_requested_models
object.Create(0@,3002,2469.5833, -1670.5154, 13.3158)
Object.SetImmunities(0@, 1, 1, 1, 1, 1)
wait 3000
0392: make_object 0@ moveable 1
0381: throw_object 0@ velocity_in_direction 10.0 0.0 4.0
0A93: end_custom_thread


Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какая GTA Вам понравилась больше всего?
Всего ответов: 6
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Реклама