00062. Работа со стартерами ( MAIN.SCM - Часть 1 )
Работа со стартерами ( MAIN.SCM - Часть 1 )|В этом мы рассмотрим примеры запуска нескольких миссий.|wmysterio|wmysterio||||Доброго времени суток, дорогие друзья! Как Вы уже догадались, речь пойдет о стартерах. Когда я был новичком, мне никак не удавалось запускать миссии в нужном порядке. Стартер, что был в учебнике, был для меня плохим примером, так как он был в скомпилированном виде, и с помощью него я смог запустить максимум 3 миссии.
Как я решил данную проблему? Ответ оказался очень простым! Дело было в глобальных переменных, которые были в качестве счетчика, то есть за каждую выполненную миссию мы увеличиваем счетчик на 1. Вот несколько миссий в качестве примера ( Счетчиком будет переменная "$TOTAL_MISSION" ):
В нашем арсенале есть три миссии. Как видите во всех присутствует команда "create_thread @STARTER". Значит их запускает поток с именем ":STARTER". Давайте напишем условия перехода:
:STARTER
thread 'STARTER'
wait 0
$MARKER_INDEX_T = marker.CreateIconAndSphere(15, $MISSION_T_COORD_X, $MISSION_T_COORD_Y, $MISSION_T_COORD_Z)
:STARTER_1
wait 0
if AND
not actor.Dead($PLAYER_ACTOR)
not actor.Driving($PLAYER_ACTOR)
8A0C: not player $PLAYER_CHAR on_jetpack
8741: not actor $PLAYER_ACTOR busted
then
if
$ONMISSION == 0
then
if AND
$TOTAL_MISSION == 0
0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_2
end
if AND
$TOTAL_MISSION == 1
0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_3
end
if AND
$TOTAL_MISSION == 2
0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_4
end
end
end
jump @STARTER_1
:STARTER_2
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
fade 0 1000
wait 2000
start_mission 0
end_thread
:STARTER_3
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_02' time 1000 style 2
fade 0 1000
wait 2000
start_mission 1
end_thread
:STARTER_4
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_03' time 1000 style 2
fade 0 1000
wait 2000
start_mission 2
end_thread
Как видите, мы создаём сферу и маркер, координаты которой "$MISSION_T_COORD_X", "$MISSION_T_COORD_Y", "$MISSION_T_COORD_Z". Значит нам нужно написать их ещё перед запуском стартера. Обычно скриптеры пишут их в первом потоке, то есть в потоке "MAIN" и тамже задают начальное значение "$TOTAL_MISSION". Сделаем это тоже:
Теперь сфера будет появляться в этих координатах. Но очень часто нужно сделать, что бы сфера после прохождения миссии появлялась в другой точке. Не проблема! Мы пишем переменные маркера в самой миссии ( до или после $TOTAL_MISSION += 1 ):
Таким образом, после прохождения миссии "GUN" позиция маркера изменится.
Что делать, если нужно запустить первую миссию в начале игры? То есть нажимаем "Новая игра" и сразу показывается какой то ролик из миссии или сразу идёт миссия. Например, у миссии 0 есть ролик ( просто представим, так как я кинул код без ролика ). Ответ очень прост! Вместо "create_thread @STARTER" в потоке "MAIN" пишем "start_mission 0":
// fade 1 0 меняем
fade 0 0 // на это, что бы игра моментально затемнилась, так как в миссии идёт осветление
$TOTAL_MISSION = 0
$MISSION_T_COORD_X = 2535.1055
$MISSION_T_COORD_Y = 2148.1006
$MISSION_T_COORD_Z = 10.8203
// create_thread @STARTER в место этого
start_mission 0 // запускаем миссию
end_thread
//...
Даже если миссия будет провалена мы всё равно увидим маркер, так как мы указали необходимые данные в коде провала миссии. Поэтому я закомментировал строчку "// create_thread @STARTER в место этого". Если этого не сделать, то после прохождении миссии 0 поток ":STARTER" запустится дважды, а это приведёт к нежелательным последствиям.
Я привел пример только для 3-х миссий. Что Вам нужно сделать, чтоб было больше:
Скопируйте код одной из миссий и в ставьте её в конец скрипта. Переименуйте метки и название потока. Это займет максимум 30 секунд;
Добавьте в стартер код запуска:
:STARTER_n // приставку n вы поменяйте на число
wait 0
Marker.Disable($MARKER_INDEX_T)
00BE: text_clear_all
03E6: remove_text_box
00BA: show_text_styled GXT 'MISS_04' time 1000 style 2 // указывайте название новой миссии
fade 0 1000
wait 2000
start_mission n // n - номер новой миссии
end_thread
Добавьте условие перехода на метку запуска:
if AND
$TOTAL_MISSION == n // n - увеличивайте число на 1 с каждой новой миссией
0102: actor $PLAYER_ACTOR in_sphere $MISSION_T_COORD_X $MISSION_T_COORD_Y $MISSION_T_COORD_Z radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
then
jump @STARTER_n // делаем переход на метку запуска
end
Вставляйте этот код в условие:
if
$ONMISSION == 0
then
// ваш код
end
Так же не забывайте внести их в список миссий ( DEFINE MISSIONS ).
В следующем уроке мы рассмотрим возможность выбора миссий, то есть будет несколько маркеров и в зависимости от того, куда станет игрок запустится та или иная миссия.|853|1|0||rabota_so_starterami_main_scm_chast_1|1499618018