Расширенное использование таймеров (HPL2)

Материал из CSM Wiki
Перейти к навигации Перейти к поиску

Таймеры настроены на ожидание в течение выбранного периода времени перед выполнением определенных команд. В предисловиях к пользовательским историям я видел слишком быстрые заставки. Например, игрок лежит в своей постели и встает. Естественно, это должно занять немного больше времени, если это специально не сделано. Например, если игрок просыпается от разбитого стекла или странных звуков.

Вот как может выглядеть простой таймер:

void OnStart()
{
	SetPlayerCrouching(true);
	SetPlayerActive(false);
	FadeOut(0);
	FadeIn(3);
	AddTimer("", 3, "Intro");
}
void Intro(string &in asTimer)
{
	SetPlayerCrouching(false);
	SetPlayerActive(true);
	PlaySoundAtEntity("", "react_sigh.snt", "Player", 0, false);
}

Этот скрипт не имеет никакого «аромата». Предполагается, что введение заставит игрока почувствовать интерес или беспокойство по поводу того, что будет впереди. Я не пытаюсь сказать, что люди, которые пишут свои собственные истории, не имеют опыта, я говорю, что они должны попытаться рискнуть чем-то большим и лучшим. Это все приводит к расширенному использованию таймеров.

Вот как может выглядеть расширенный таймер:

void OnStart() 
{
	PlaySoundAtEntity("", "break_glass_bottle.snt", "Player", 0, false);
	SetPlayerActive(false); 
	SetPlayerCrouching(true); 
	FadeOut(0); 
	FadeIn(3);
	AddTimer("T1", 3, "Intro");
	AddTimer("T2", 6, "Intro");
	AddTimer("T3", 8, "Intro");
	AddTimer("T4", 10, "Intro"); 
	AddTimer("T5", 12, "Intro"); 
} 
void Intro(string &in asTimer)
{
	string x = asTimer;
	if (x == "T1")
	{
		PlaySoundAtEntity("", "react_sigh.snt", "Player", 0, false);
		FadeOut(3);
	} 
	else if (x == "T2") 
	{
		FadeIn(3);
		PlaySoundAtEntity("", "react_breath.snt", "Player", 0, false);
		StartPlayerLookAt("ScriptArea_1", 2, 2, ""); 
	}
	else if (x == "T3")
	{
		StopPlayerLookAt();
		StartPlayerLookAt("ScriptArea_2", 2, 2, "");
	}
	else if (x == "T4") 
	{
		PlaySoundAtEntity("", "react_breath_slow.snt", "Player", 0, false);
		StopPlayerLookAt();
	}
	else if (x == "T5")
	{
		SetPlayerCrouching(false);
		SetPlayerActive(true);
	}
}

Давайте разберем этот скрипт.

В void OnStart () игрок не может двигаться или смотреть туда, куда ему заблагорассудится. Экран полностью тёмный и изображение проявляется через 3 секунды. Здесь добавляются 5 таймеров с локальными именами от Т1 до Т5. Эти имена будут использоваться, чтобы отличать каждый таймер при использовании в функции Intro.

В void Intro (string & in asTimer) строковая переменная x равна значению таймера. Таким образом, по прошествии 3 секунд вызывается функция таймера Intro, в которой asTimer будет T1. Это позволяет оператору if видеть, какой таймер вызвал функцию, поэтому, если имя локального таймера T1, он будет воспроизводить звук и исчезать с экрана, достигая полностью черного цвета за 3 секунды. Остальные сделаны таким же образом.

Расширенный таймер позволяет организовать таймеры в одну функцию вместо множества функций.