Max Payne: Часть 2. Физические объекты

Скрипты в MaxEd 2
Наша дверь — это объект динамический, но не физический. Если Вы хотите создать физический предмет, который будет взаимодействовать с окружающим миром, как коробка или бочка, то необходимо включить ему физику. Делается это в блоке Startup:
this->DO_EnablePhysics(1);
Пока объекту не назначены хитпоинты, он неуязвим. Если нужно сделать его повреждаемым, то используйте функцию:
this->DO_SetHitpoints(30);
Тут есть интересная комбинация. С помощью этих двух функций можно делать отваливающиеся объекты — всяческие таблички, дверцы, куски штукатурки и.т.д. Если записать SetHitPoints в Startup, а EnablePhysics в OnDeath, то когда хитпоинты закончатся, объект станет физическим и упадет на пол. Напомню, что у такого объекта обязательно должен быть выбран пункт Cast No Shadow.
Часто бывает нужно сделать разбиваемый объект, например, стекло. Стекло после «смерти» пропадает, и летят осколки. Делается это так:
**# в блоке Startup:**
this->DO_SetHitpoints(1);
**# в блоке OnDeath:**
this->DO_Hide(1);
this->PS_StartEffect(glass_break_1x1,"");
this->A_Play3DSound(generic, glass_break_medium, "");
Если вы делаете именно стекло, то, естественно, EnablePhysics ему включать не нужно, хотя вообще одно другому не мешает. PS_StartEffect управляет всевозможными спецэффектами, A_Play3DSound — звуками. Второй их параметр — это часть тела. Если эффект или звук привязывается не к человеку, то указывать часть тела не нужно. Если эффект зацикленный (например, огонь), то остановить его можно с помощью PS_StopAllEmissions. Кстати, попробуйте какому-нибудь персонажу задать:
this->PS_StartEffect(fire_small_nosmoke,"Bip01 L Hand");
this->PS_StartEffect(fire_small_nosmoke,"Bip01 R Hand");
Впечатляет! Ну да ладно, возвращаемся к стеклу. Небольшое замечание: очевидно, сделать стекло плоским (F3: Shift+ПКМ), верно? А вот и нет: динамический объект не может быть таковым. То есть разбиваемое стекло должно быть объемным.
Опишу еще один интересный ход. Вы, возможно, заметили, что сквозь вышеописанное стекло невозможно бросить гранату? Нет, если поставить 1 хитпоинт, то оно, конечно, разобьется, но граната отскочит обратно в комнату. Я обошел это следующим образом. Поверх стекла ставится триггер типа Bullet. Перейдите в FSM стекла (это новое стекло, а не из предыдущего примера! Его FSM должен быть пустым на данный момент) и добавьте событие death в Custom Events.
this->DO_Hide(1);
this->A_Play3DSound(generic, glass_break_medium, "");
this->PS_StartEffect(glass_break_1x1, "");
А триггеру в блоке T_Activate впишите:
Room::Glass->FSM_Switch(death);
this->T_Enable(0);
Готово! Обратите внимание, что стекло вообще не имеет хитпоинтов — пуля или граната взаимодействует только с триггером.

Просмотров: 4 269

Комментарии пока отсутcтвуют