Вспышка от выстрелов

Материал из Valve Developer Community
Перейти к: навигация, поиск
English (en)Deutsch (de)Русский (ru)
... Icon-Important.png

Этот урок покажет вам, как создать muzzleflash которая динамически появляется и освещает всё вокруг вас, как в Counter-Strike: Source. Такие огни называются "dlights".

Этот код был разработан для любого мода на основе Orange Box, будь то сингл или мультиплеер. Также это работает с NPC, при условии, что вы сделаете работу кода.

Warning.pngПредупреждение: Некоторые "dynamic props" не будет освещены при использовании dlights.
Warning.pngПредупреждение: Слишком много dlights может привести к серьезным потерям производительности на слабых компьютерах. Програмируя такое освещения, следует использовать с осторожностью.
Note.pngПримечание: От Slam12f, а ещё лучше, если вы можете написать консольную команду для включения и выключения dlights. Это легко осуществить с помощью static ConVar.

Реализация Dlight как Muzzleflashes

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

Прежде всего откройте, c_baseanimating.cpp и найдите в функции эти строки void C_BaseAnimating::ProcessMuzzleFlashEvent()

Vector vAttachment;
QAngle dummyAngles;
GetAttachment( attachment, vAttachment, dummyAngles );

// Make an elight
dlight_t *el = effects->CL_AllocElight( LIGHT_INDEX_MUZZLEFLASH + index );
el->origin = vAttachment;
el->radius = random->RandomInt( 32, 64 ); 
el->decay = el->radius / 0.05f;
el->die = gpGlobals->curtime + 0.05f;
el->color.r = 255;
el->color.g = 192;
el->color.b = 64;
el->color.exponent = 5;

Как вы, возможно, заметили, Valve пошли немного сумасшедшим путём, и результатом оказались уродливые muzzleflash. Этот урок покажет как сделать всё красиво, так что мы изменим этот код. Замените записи выше вот этим:

			Vector vAttachment, vAng;
			QAngle angles;
			GetAttachment( attachment, vAttachment, angles );

			AngleVectors( angles, &vAng );
			vAttachment += vAng * 2;
		
			dlight_t *dl = effects->CL_AllocDlight ( index );
			dl->origin = vAttachment;
			dl->color.r = 252;
			dl->color.g = 248;
			dl->color.b = 128;
			dl->die = gpGlobals->curtime + 0.05f;
			dl->radius = random->RandomFloat( 245.0f, 256.0f );
			dl->decay = 512.0f;

Примечание

Сейчас я работаю дальше, и обновления добавят больше визуальных эффектов, чтобы создать более реалистичный и чистый взгляд на вспышку. Обновление будет работать только на Orange Box Engine. Когда я сделаю что-то новое для muzzleflash, я размещу это здесь.

Примечание от GAMERMAN12: Я обновил этот код, чтобы свет распадался после выстрела, т.к. есть эффект мигания при стрельбе из пулеметов. И она исчезает так, чтобы dlitle бфл более реалистичным. Спасибо.

Episode 2 Исправление

Если при компиляции вылезла ошибка (error C2065: 'Attachment' : undeclared identifier) замените код на вот этот:

			Vector vAttachment, vAng;
			QAngle angles;
			GetAttachment( 1, vAttachment, angles ); // устанавливаем 1 вместо "attachment"

			AngleVectors( angles, &vAng );
			vAttachment += vAng * 2;
		
			dlight_t *dl = effects->CL_AllocDlight ( index );
			dl->origin = vAttachment;
			dl->color.r = 231;
			dl->color.g = 219;
			dl->color.b = 14;
			dl->die = gpGlobals->curtime + 0.05f;
			dl->radius = random->RandomFloat( 245.0f, 256.0f );
			dl->decay = 512.0f;

Перевод --Slam12f 03:39, 13 May 2013 (PDT)