Добавляем новый тип монстра в SDK
Добавляем новый тип монстра в SDK Автор: Heming_Hitrowski Статья предусматривает то, что вы умеете создавать директории для модов, а также что у вас имеется Visual C++ 6.0 он полностью настроен на работу с SDK. Также данная статья предусматривает, что Вы разобрались с редактированием классов Serious Sam: TSE. © Всем привет! В этой статье я научу вас, как добавить новый тип врага в SDK. Я думаю, немало кто хотел сделать новый тип врага, поэтому я и написал эту статью. Вот примеры новых типов монстров в SDK: Новый монстр - ракетометчик (Автор: SeriousAlexej) Парочка новых биомеханоидов от Heming_Hitrowski Ну что же, приступим. Возьмем за основу файл Walker.es. Для начала, определимся, как и чем он будет стрелять. Статья повествует о том, как:
В этой статье мы научимся регулировать:
В дальнейшем вы сами сможете пополнить этот список.
Откроем наш файл Walker.es и найдем строки: enum WalkerChar { 0 WLC_SOLDIER "Soldier", // soldier 1 WLC_SERGEANT "Sergeant", // sergeant И добавим сюда наш тип монстра: 2 WLC_GENERAL "General", // general Сейчас мы добавили параметр к перечислению "Тип". Теперь в SED вы можете обнаружить новый тип монстра в поле "Character". Добавим переменные, которые вы сможете изменять прямо в редакторе: После строки 5 FLOAT m_fThreatDistance = 5.0f, Добавим: 20 FLOAT m_fShootWaitTime ''Shoot Wait time" = 0.5f, // Регулирует выстрел 2 пушки (время в секундах) 21 INDEX m_iHealthOfGeneral "Health" = 400, // Здоровье нового типа монстра 22 FLOAT m_fGenAttackRunSpeed "Speed" = 10.0f, // Скорость монстра при беге 23 INDEX m_iScore "Score" = 5500, // Очки при убийстве 24 FLOAT m_fGeneralThreatDistance "Threat Distance" = 20.0f, // Расстояние угрозы Далее мы добавим новые файлы к нашему биомеханоиду, то есть текстуру, или модель пушки. После строки 65 sound SOUND_SERGEANT_WALK "Models\\Enemies\\Walker\\Sounds\\Sergeant\\Walk.wav", добавим следующее: // ********** GENERAL ********** 80 sound SOUND_GENERAL_FIRE "Models\\Weapons\\DoubleShotgun\\Sounds\\Fire.wav", 81 texture TEXTURE_WALKER_GENERAL "Models\\Enemies\\Walker\\Walker03.tex", 82 texture TEXTURE_WALKER_GENGUN "Models\\Enemies\\Walker\\GenRocketLauncher.tex", Примечание: Чтобы удобнее ориентироваться в своем коде, вы можете ставить комментарии в стиле языка C или C++, например: // ********** GENERAL ********** 80 sound SOUND_GENERAL_FIRE "Models\\Weapons\\DoubleShotgun\\Sounds\\Fire.wav", // Огонь 81 texture TEXTURE_WALKER_GENERAL "Models\\Enemies\\Walker\\Walker03.tex", // Текстура генерала 82 texture TEXTURE_WALKER_GUN "Models\\Enemies\\Walker\\GenRocketLauncher.tex", // Текстура оружия Можно и на русском языке. Также вы можете "отложить на потом" определенный участок кода с помощью комментария в стиле языка C: /* 81 texture TEXTURE_WALKER_GENERAL "Models\\Enemies\\Walker\\Walker03.tex", 82 texture TEXTURE_WALKER_GUN "Models\\Enemies\\Walker\\GenRocketLauncher.tex", */ Далее, добавим ссылку к текстовому файлу описания нового типа врага, получаемый в инертане: После строки static DECLARE_CTFILENAME(fnmGeneral, "Data\\Messages\\Enemies\\WalkerBig.txt"); добавим код: static DECLARE_CTFILENAME(fnmSergeant, "DataMP\\Messages\\Enemies\\WalkerGen.txt"); И после case WLC_SERGEANT: return fnmSergeant; добавим case WLC_GENERAL: return fnmGeneral; С описанием покончено. Теперь мы переходим к предварительному кэшированию ресурсов( дабы консоль не ругалась :)). После строки PrecacheClass(CLASS_PROJECTILE, PRT_WALKER_ROCKET); добавим следующий участок кода: if (m_EwcChar==WLC_GENERAL) { // sounds PrecacheSound(SOUND_GENERAL_FIRE); // model's texture PrecacheTexture(TEXTURE_WALKER_GENERAL); // weapon PrecacheTexture(TEXTURE_WALKER_GENGUN); // projectile PrecacheClass(CLASS_PROJECTILE, PRT_GENERAL_LASER); } Все. Ошибки с предварительным кэшированием теперь больше не будут мучать нас в консоли. А теперь - самое интересное:
Возможно, самая вкусная часть этой статьи (-: Прописываем функцию атаки нашего монстрика: После строк: // m_fLockOnEnemyTime = 0.25f; // autocall CEnemyBase::LockOnEnemy() EReturn; } Добавим следующее: if (m_EwcChar==WLC_GENERAL) { // Если монстр - Генерал, то... StartModelAnim(WALKER_ANIM_FIRERIGHT, AOF_LOOPING); // Стартует анимация стрельбы правой пушки ShootProjectile(PRT_GENERAL_LASER, FIRE_RIGHT_ARM*m_fSize, ANGLE3D(0, 0, 0)); // Выстрел снарядом PlaySound(m_soFire1, SOUND_GENERAL_FIRE, SOF_3D); // Играть звук выстрела генерала autowait (m_fShootWaitTime); // Ожидает определенное время, заданное пользователем autocall CEnemyBase::LockOnEnemy() EReturn; StartModelAnim(WALKER_ANIM_FIRELEFT, AOF_LOOPING); // Стартует анимация стрельбы левой пушки ShootProjectile(PRT_GENERAL_LASER, FIRE_LEFT_ARM*m_fSize, ANGLE3D(0, 0, 0)); // Выстрел снарядом PlaySound(m_soFire2, SOUND_GENERAL_FIRE, SOF_3D); // Играть звук выстрела генерала } -Сохраните документ- Ctrl+S С функцией атаки практически покончено. Остался один важный момент: Чем же все-таки будет стрелять наш генерал? Мы будем использовать новый вид снаряда - PRT_GENERAL_LASER. Сейчас мы заходим в Projectile.es и прописываем там характеристики снаряда..
Зайдя в Projectile.es (он находится в категории weapons) найдем строчку: 77 PRT_METEOR "Meteor", И добавим после нее наш вид снаряда: // General Walker -> 78 PRT_GENERAL_LASER "General Laser", // <- General Walker Добавили? Отлично! Приступаем к следующему шагу, предварительному кэшированию. Не бойтесь, тучу кода мы вставлять не будем, мы вставим всего лишь одну строчку. Найдите: case PRT_CYBORG_LASER: case PRT_CYBORG_BOMB: И после этого вставьте туда наш вид Projectile. Далее, снова ищем код: case PRT_CYBORG_LASER: lsNew.ls_colColor = C_dBLUE; lsNew.ls_rFallOff = 1.5f; lsNew.ls_plftLensFlare = NULL; break; Проделайте аналогично, только с нашим новым видом.
Найдем комментарий: /************************************************************ * CYBORG LASER / PROJECTILE * ************************************************************/ И после его }; вставим функцию.. void GeneralLaser(void) { // set appearance InitAsModel(); SetPhysicsFlags(EPF_PROJECTILE_FLYING); SetCollisionFlags(ECF_PROJECTILE_MAGIC); SetFlags(GetFlags() | ENF_SEETHROUGH); SetComponents(this, *GetModelObject(), MODEL_CYBORG_LASER, TEXTURE_CYBORG_LASER, 0, 0, 0); ModelChangeNotify(); // start moving LaunchAsPropelledProjectile(FLOAT3D(0.0f, 0.0f, -60.0f), (CMovableEntity*)(CEntity*)m_penLauncher); SetDesiredRotation(ANGLE3D(0, 0, 0)); m_fFlyTime = 15.0f; // Время полета m_fDamageAmount = 100.0f; // Урон m_fSoundRange = 0.0f; m_bExplode = TRUE; // Взрывчатый? m_bLightSource = TRUE; // Освещаемый? m_bCanHitHimself = TRUE; // Может задеть сам себя? m_bCanBeDestroyed = FALSE; // Может быть уничтожен? m_fWaitAfterDeath = 0.0f; m_pmtMove = PMT_FLYING; }; Далее, дадим ссылку на функцию
Найдем: case PRT_CYBORG_LASER: CyborgLaser(); break; И добавим: case PRT_GENERAL_LASER: GeneralLaser(); break; Вот мы и вставили нашу функцию огня. Но еще не все готово. Мы поработаем над частицами..
Нам не нужен обычный лазер. Мы сделаем его взрывчатым! Следовательно, что? Правильно! Ищем комментарий: // projectile explosion И добавляем туда наш тип Projectile: case PRT_GENERAL_LASER: PlayerRocketExplosion(); break; Готово! Теперь наш лазер взрывчатый. Но и это еще не все. Снова ищем участок кода: // render particles void RenderParticles(void) { switch (m_prtType) { И после него добавим: case PRT_GENERAL_LASER: Particles_AfterBurner( this, m_fStartTime, 0.5f); break; Ну и все. Теперь при полете снаряда вы заметите частички Afterburner'a. С типом снаряда покончено окончательно. Возвращаемся к Walker.es -Сохраните документ- Ctrl+S
Найдя комментарий /************************************************************ * M A I N * ************************************************************/ Добавим наши функции. Перед if (m_EwcChar==WLC_SERGEANT) { SetHealth(750.0f); m_fMaxHealth = 750.0f; } else { SetHealth(150.0f); m_fMaxHealth = 150.0f; } добавьте строки: if (m_EwcChar==WLC_GENERAL) { SetHealth(m_iHealthOfGeneral); m_fMaxHealth = m_iHealthOfGeneral; } Все. Теперь можно регулировать здоровье в редакторе. Далее. После // set your appearance SetModel(MODEL_WALKER); Добавим характеристику нашего зверька if (m_EwcChar==WLC_GENERAL) { // Если наш монстр - Генерал, то... m_fSize = 1.0f; // Его размер - 1.0f SetModelMainTexture(TEXTURE_WALKER_GENERAL); // Текстура AddAttachment(WALKER_ATTACHMENT_ROCKETLAUNCHER_LT, MODEL_ROCKETLAUNCHER, TEXTURE_WALKER_GENGUN); // Добавить пушку 1 AddAttachment(WALKER_ATTACHMENT_ROCKETLAUNCHER_RT, MODEL_ROCKETLAUNCHER, TEXTURE_WALKER_GENGUN); // Добавить пушку 2 GetModelObject()->StretchModel(FLOAT3D(1,1,1)); ModelChangeNotify(); CModelObject *pmoRight = &GetModelObject()->GetAttachmentModel(WALKER_ATTACHMENT_ROCKETLAUNCHER_RT)->amo_moModelObject; pmoRight->StretchModel(FLOAT3D(-1,1,1)); m_fBlowUpAmount = 1E10f; m_iScore = m_iScore; m_fThreatDistance = m_fGeneralThreatDistance; } Монстр готов полностью! Теперь осталось только нажать F7 и радоваться новому биомеханоиду. Но не забывайте, что мы добавили новые файлы, а именно - 2 текстуры. Нарисуйте их. Happy Coding! Heming Hitrowski 2011. Источник: http://St-games.ucoz.net | |
Категория: SDK | Добавил: Heming (15.06.2011) | | |
Просмотров: 1262 | Комментарии: 2 | |
Всего комментариев: 2 | |
|