Пятница, 03.05.2024, 04:38
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Приводить ли сайт в чувство?
Всего ответов: 736

Начало » Статьи » Туториалы по программированию (HL1)

Динамический звук шагов монстров
В разделе «Туториалы» -CJ- просил русскую версию тутора ( http://articles.thewavelength.net/574/ ). Этот тутор называется Dynamic NPC Stepping Sound. Очень интересная функция. Для тех кто ещё не понял объясню: в хл1 есть эвент (event 1004), который позволяет воспроизводить звук при рисовании анимации модели. Примером являются звуки шагов монстра (учёных, барни и т.д.) Так вот, все знают, что по какой бы поверхности не бежал или не шёл монстр (будь эта поверхность металл, грязь, вентиляция или просто бетон), звуки шагов всегда одинаковые. В данном туторе описывается, как сделать так, чтобы звук шагов соответствовал поверхности, по которой идёт монстр. Если вы хотите, сохранить старый эвент 1004, ведь он нужен в моделях не только для шагов, но и для других звуков, то придётся не только кодить, но и моделить (но это не обязательно). Просто перевести тутор было бы глупо, поскольку он просто не работает. Я его слегка изменил и добился полной работоспособности. Значит так, для начала откроем monsters.cpp и добавим новый заголовочный файл:

/*

===== monsters.cpp ==================================================
======

Monster-related utility code

*/

#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "nodes.h"
#include "monsters.h"
#include "animation.h"
#include "saverestore.h"
#include "weapons.h"
#include "scripted.h"
#include "squadmonster.h"
#include "decals.h"
#include "soundent.h"
#include "gamerules.h"

#include "player.h" //
Это понадобится нам для задекларирования новых определений

Ниже сразу после заголовочных файлов создадим новую строчку:

extern "C" char PM_FindTextureType(char *name);//Это понадобится нам для определения типов текстур

Далее перед строчкой void CBaseMonster :: HandleAnimEvent( MonsterEvent_t *pEvent ) создаём новую функцию:

float NPC_Step(CBaseMonster *pMonster)
{
char chTextureType;
float fvol;
float fvolbar;
char szbuffer[64];
char *rgsz[4];
const char *pTextureName;
TraceResult ptr;
float fattn = ATTN_NORM;
int cnt;

UTIL_TraceLine(pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0,0,16),dont_ignore_monsters,ENT(pMonster->pev),&ptr);
CBaseEntity *pEntity = CBaseEntity::Instance(ptr.pHit);

chTextureType = 0;
if(pEntity)
pTextureName = TRACE_TEXTURE( ENT(pEntity->pev), pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0, 0, 16) );
else
pTextureName = TRACE_TEXTURE( ENT(0), pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0, 0, 16) );

if ( pTextureName )
{
// strip leading '-0' or '+0~' or '{' or '!'
if (*pTextureName == '-' || *pTextureName == '+')
pTextureName += 2;

if (*pTextureName == '{' || *pTextureName == '!' || *pTextureName == '~' || *pTextureName == ' ')
pTextureName++;
// '}}'
strcpy(szbuffer, pTextureName);
szbuffer[CBTEXTURENAMEMAX - 1] = 0;

// get texture type
chTextureType = PM_FindTextureType((char *)pTextureName);
}

fvol=1.0;
//Это громкость шагов монстра

Можно задать свою громкость для каждого монстра:

if(FClassnameIs(pMonster,"monster_scientist"))fvol=0.5;//Учёный, громкость 0.5

if(FClassnameIs(pMonster,"monster_human_grunt"))fvol=1.0;
//Морпех, громкость 1.0

Можно сделать, чтобы громкость изменялась в зависимости от активности монстра,
ведь при беге топот громче, чем при ходьбе. Для этого вместо fvol=1.0; вставляем вот это:

switch(pMonster->m_Activity)
{
case ACT_WALK:
fvol=0.7;
//Ходьба, громкость 0.7 break;
case ACT_RUN:
fvol=1.0;
//Бег, громкость 1.0
break;
default:
fvol=0.5;
//Дефолт, при любых других активностях громкость будет равна 0.5
break;
}

Можно в принципе добавить и другие активности, но зачем это надо? Ведь при ACT_IDLE монстр стоит на месте,
а при ACT_DIESIMPLE помирает. Ни в одном из случаев он не шагает. Разве что есть некоторые модели где
монстр переминается с ноги на ногу или перед смертью заступает вперёд, а потом падает. Но у нас же есть дефолт:-).

Сама функция добавлена, осталось разобраться со звуками шагов.
Вот самый простой вариант. Монстры топают все одинаково, точно так же как игрок:

switch (chTextureType)
{
default:
case CHAR_TEX_CONCRETE: fvolbar = 0.6;
rgsz[0] = "player/pl_step1.wav";
rgsz[1] = "player/pl_step2.wav";
cnt = 2;
break;
case CHAR_TEX_METAL: fvolbar = 0.3;
rgsz[0] = "player/pl_metal1.wav";
rgsz[1] = "player/pl_metal2.wav";
cnt = 2;
break;
case CHAR_TEX_DIRT: fvolbar = 0.1;
rgsz[0] = "player/pl_dirt1.wav";
rgsz[1] = "player/pl_dirt2.wav";
rgsz[2] = "player/pl_dirt3.wav";
cnt = 3;
break;
case CHAR_TEX_VENT: fvolbar = 0.3;
rgsz[0] = "player/pl_duct1.wav";
rgsz[1] = "player/pl_duct2.wav";
cnt = 2;
break;
case CHAR_TEX_GRATE: fvolbar = 0.5;
rgsz[0] = "player/pl_grate1.wav";
rgsz[1] = "player/pl_grate4.wav";
cnt = 2;
break;
case CHAR_TEX_TILE: fvolbar = 0.2;
rgsz[0] = "player/pl_tile1.wav";
rgsz[1] = "player/pl_tile3.wav";
rgsz[2] = "player/pl_tile2.wav";
rgsz[3] = "player/pl_tile4.wav";
cnt = 4;
break;
case CHAR_TEX_SLOSH: fvolbar = 0.0;
rgsz[0] = "player/pl_slosh1.wav";
rgsz[1] = "player/pl_slosh3.wav";
rgsz[2] = "player/pl_slosh2.wav";
rgsz[3] = "player/pl_slosh4.wav";
cnt = 4;
break;
}


Но есть другой вариант. Можно сделать, чтобы у каждого монстра были свои индивидуальные шаги.
Ведь морпех тащит на спине рюкзак весом в 40 кг. и ещё кучу всякой дряни. Его шаги явно будут
отличаться от шагов учёного.(Вспомните Day Of Defeat: когда там бежишь, за спиной брякает снаряжение)
вот этот вариант:

if(FClassnameIs(pMonster,"monster_human_grunt"))
{
switch(chTextureType)
{
case CHAR_TEX_METAL: fvolbar = 0.3;
rgsz[0] = "hgrunt/hg_metal1.wav";
rgsz[1] = "hgrunt/hg_metal2.wav";
cnt = 2;
break;
case CHAR_TEX_DIRT: fvolbar = 0.1;
rgsz[0] = "hgrunt/hg_dirt1.wav";
rgsz[1] = "hgrunt/hg_dirt2.wav";
rgsz[2] = "hgrunt/hg_dirt3.wav";
cnt = 3;
break;
}

Ну, наконец, когда вы задали громкость и звуки, допишем функцию:


UTIL_EmitAmbientSound(ENT(0), pMonster->pev->origin, rgsz[RANDOM_LONG(0,cnt-1)], fvol, fattn, 0, 96 + RANDOM_LONG(0,0xf));

return fvolbar;
}


Теперь нам надо создать новый эвент, во время исполнения которого будут звучать шаги.
Спускаемся ниже к функции void CBaseMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
и куда-нибудь в неё втыкаем новый эвент:

case SCRIPT_EVENT_STEP:
NPC_Step(this);
break;

Теперь идём в файл scriptevent.h и перед последней сторчкой #endif указываем наш новый эвент:

#define SCRIPT_EVENT_STEP 2000

Цыфра может быть любой, кроме 1000, 1001, 1002, 1003, 1004, 5004, 1, 2, 3, 4, 5,
вобщем не должна совпадать с номерами уже существующих эвентов. Рекомендую оставить 2000
потому что такого эвента в обычном хл1 нет. Если же вдруг в вашем моде есть event 2000,
то придётся выбрать другой номер.

И ещё. Если вы не хотите или не можете моделить, то можно сделать, чтобы при исполнении
старого эвента 1004 звучали шаги монстров.

Вернитесь в monsters.cpp и замените:

case SCRIPT_EVENT_SOUND: // Play a named wave file
EMIT_SOUND( edict(), CHAN_BODY, pEvent->options, 1.0, ATTN_IDLE );
break;


На вот это:

case SCRIPT_EVENT_SOUND: // Play a named wave file
if(FStrEq(pEvent->options,"common/npc_step1.wav"))//если в опцыях эвента(в модели) стоит звук npc_step1.wav то добавляется ещё и закодированный звук шагов
NPC_Step(this); //аналогично пишем || Event->options,"common/npc_step2.wav || pEvent->options,"common/npc_step3.wav и т.д.
else EMIT_SOUND( edict(), CHAN_BODY, pEvent->options, 1.0, ATTN_IDLE );//если в опцыях другой звук, то шаги нам не нужны
break;


Я лично этого не делал, а просто добавил новый эвент в модели, так что за работоспособность ручаться не могу

Ну вот, наконец и помоделим:

Нам нужно добавить новый эвент 2000 в модель(если вы изменили старый эвент 1004 этого делать не надо, но
учтите, что не у всех моделей в шагах и беге есть эвент 1004: У hgrunt.mdl нет, а у barney.mdl есть)

Итак открываем *.qc файл модели, к примеру scientist.qc

Заменяем в действиях ходьбы или бега эвент 1004 меняем на эвент 2000:

До:

$sequence "walk" "walk" LX fps 20 loop ACT_WALK 1 { event 1004 0 "common/npc_step1.wav" } { event 1004 8 "common/npc_step3.wav" }
$sequence "walk_scared" "walk_scared" LX fps 20 loop ACT_WALK_SCARED 1 { event 1004 0 "common/npc_step1.wav" } {event 1004 8 common/npc_step3.wav"}


После:

$sequence "walk" "walk" LX fps 20 loop ACT_WALK 1 { event 2000 0 } { event 2000 8 }
$sequence "walk_scared" "walk_scared" LX fps 20 loop ACT_WALK_SCARED 1 { event 2000 0 } { event 2000 8 }


И далее аналогично. В других моделяхгде нет эвента 1004, например в hgrunt.mdl, создайте эвент 2000 для нужного кадра.
Скомпильте модель и наслаждайтесь.


Источник: http://www.hlfx.ru/forum/showthread.php?s=5ac665d08b0b17fd1b0b22cbbbc86ced&threadid=620
Категория: Туториалы по программированию (HL1) | Добавил: DetLeR (16.08.2007) | Автор: Ku2zoff
Просмотров: 2429 | Рейтинг: 0.0 |

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7