Вспышка от выстрелов
Этот урок покажет вам, как создать muzzleflash которая динамически появляется и освещает всё вокруг вас, как в Counter-Strike: Source. Такие огни называются "dlights".
Этот код был разработан для любого мода на основе Orange Box, будь то сингл или мультиплеер. Также это работает с NPC, при условии, что вы сделаете работу кода.
Реализация 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)