00086. Движения объектов и эффектов

Движения объектов и эффектов|Опять возвращаемся к объектам. На этот раз мы будем их перемещать. Всё это нужно, что бы мы могли двигать эффекты.|wmysterio|wmysterio||||Думаю во многих модах вы видели, когда к эффекты, например огня, двигаются. Отсюда и вопрос - как заставить их двигаться, ведь нет опкодов для перемещения эффектов. Именно для этого мы вернёмся к движению объектов.

Рассмотрим, уже вам известные опкоды, для перемещения объектов:

01BC: put_object $OBJ at 2413.5225 -1659.0372 13.3828
034E: move_object 0@ to 2413.5225 -1659.0372 20.3828 speed 0.5 1.0 1.0 flag 0

Опкод "034E" отличается тем, что перемещение происходит плавно. Единственный минус, что этот опкод используется, как условие и использовать нужно только в циклах, например: в "while" или в блоках условий. Здесь:

Здесь: 0@ - хендл объекта 2413.5225 -1659.0372 13.3828 - координаты, куда должен переместится объект 0.5 1.0 1.0 - скорость перемещения: 1-й параметр - по оси X, 2-ой - по оси Y, 3-й - по оси Z. Если поставить все значения в 0.0, то никакого перемещения не будет, так как итерация равна нулю. Тоесть, если к координатам прибавить эти нули, то координаты не поменяют свои значения 0 - флаг. Если 0, то объект будет перемещаться до тех пор, пока не будет в заданной точке. Если поставить 1, то перемещение может прекратится ещё до заданных координат. Чем это объянить я не знаю, поэтому используем 0

Давайте напишем пример с перемещением объекта:

{$CLEO}
0000:

var
0@: object
end

:NAME
thread 'NAME'
wait 0
0@.Create(1248, 2505.4763, -1677.182, 13.3773)
wait 3000

while 834E: not move_object 0@ to 2413.5225 -1659.0372 13.3828 speed 0.25 0.25 0.0 flag 0 
wait 0
end 

0A93: end_custom_thread

Аналогично перемещаются и эффекты. Суть в том, что мы должны прицепить эффект к объекту. Давайте допишем парочку строчек к нашему примеру:

{$CLEO}
0000:
 
var
0@: object
end
 
:NAME
thread 'NAME'
wait 0
0@.Create(1248, 2505.4763, -1677.182, 13.3773)
wait 3000
066E: create_particle "nitro" attached_to_object 0@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0 flag 1 handle_as 1@ //
064C: make_particle 1@ visible //
 
while 834E: not move_object 0@ to 2413.5225 -1659.0372 13.3828 speed 0.25 0.25 0.0 flag 0 
wait 0
end 
 
0A93: end_custom_thread

Таким образом, при перемещении объекта будет перемещаться и эффект. Так как эффекта почти не видно из за объекта, нужно как то замаскировать его :) Не вопрос! Есть опкод, который делает невидимым объект:

0750: set_object 0@ visibility 0

Здесь: 0@ - хендл объекта 0 - установить видимость. Если 0 - невидимый, 1 - видимый

А так же сделаем немного медленнее перемещение, что бы эффект был заметнее:

{$CLEO}
0000:
 
var
0@: object
end
 
:NAME
thread 'NAME'
wait 0
0@.Create(1248, 2505.4763, -1677.182, 13.3773)
wait 3000 
066E: create_particle "nitro" attached_to_object 0@ with_offset 0.0 0.0 0.0 rotation 0.0 0.0 0.0 flag 1 handle_as 1@ 
064C: make_particle 1@ visible 
0750: set_object 0@ visibility 0 //
 
while 834E: not move_object 0@ to 2413.5225 -1659.0372 13.3828 speed 0.15 0.15 0.0 flag 0 
wait 0
end 
 
0A93: end_custom_thread

Обратите внимание на то, что делать невидимым объект нужно после того, как создали и запустили эффект. В противном случаи эффект может скрыться вместе с объектом :)

Используя эти возможности вы можете как-то усовершенствовать эти знания, добавив, например, вращение объекта по осям. Ваше задание - проверить как будет лететь эффект, если задавать в цикле меняющийся угол поворота поворота объекта. Для достижения нужного результата установите в опкоде "066E" оффсет "0.0 1.0 0.0". Результат вас удивит.

P. S. Можно делать невидимыми не только объекты, но и транспорт и даже актёров!

  • 0338: set_car $CAR visibility 0

  • 0337: set_actor $ACTOR visibility 0

Эффект действует на всех актёров, кроме СЖ.|1791|1|0|53422508jpg500300400`240``||dvizhenija_obektov_i_ehffektov|1500712228

Last updated