Главная » Статьи » SDK

Добавляем новый тип монстра в SDK
Добавляем новый тип монстра в SDK
Автор: Heming_Hitrowski



Статья предусматривает то, что вы умеете
создавать директории для модов, а также что у вас имеется Visual C++ 6.0
он полностью настроен на работу с SDK. Также данная статья
предусматривает, что Вы разобрались с редактированием классов Serious
Sam: TSE. ©


Всем привет! В этой статье я научу вас, как добавить новый тип врага в SDK. Я думаю, немало кто хотел сделать новый тип врага, поэтому я и написал эту статью. Вот примеры новых типов монстров в SDK:


Новый монстр - ракетометчик (Автор: SeriousAlexej)

Парочка новых биомеханоидов от Heming_Hitrowski

Ну что же, приступим.

Возьмем за основу файл Walker.es. Для начала, определимся, как и чем он будет стрелять.
Статья повествует о том, как:
  • Создать нового биомеханоида
  • Создать собственную функцию атаки
  • Создать новый вид Projectile
И многое другое..

В этой статье мы научимся регулировать:

  • Очки при убийстве (мелочь, а приятно)
  • Расстояние при выстреле
  • Скорость выстрелов
  • Скорость ходьбы
  • Количество здоровья у врага.

В дальнейшем вы сами сможете пополнить этот список.

  • Часть 1. Добавляем новый тип врага

Откроем наш файл 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);
      }



Все. Ошибки с предварительным кэшированием теперь больше не будут мучать нас в консоли.
А теперь - самое интересное:

  •  Часть 2. Редактируем функцию атаки

Возможно, самая вкусная часть этой статьи (-: Прописываем функцию атаки нашего монстрика:

После строк:

//      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 и прописываем там характеристики снаряда..

  • Часть 3. Создаем новый вид Projectile

Зайдя в 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;

Проделайте аналогично, только с нашим новым видом.

  • Часть 3. Редактируем функцию PRT_GENERAL_LASER

Найдем комментарий:

/************************************************************
 *               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;
Вот мы и вставили нашу функцию огня. Но еще не все готово. Мы поработаем над частицами..

  • Часть 3.8. Создаем визуальные эффекты

Нам не нужен обычный лазер. Мы сделаем его взрывчатым! Следовательно, что? Правильно! Ищем комментарий:
// 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

  • Часть 4. Работаем с переменными

Найдя комментарий

/************************************************************
                       *                       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) | Автор: Heming Hitrowski E W
Просмотров: 643 | Комментарии: 2 | Теги: sdk, Heming
Всего комментариев: 2
+1   Спам
2 Cofein   (02.07.2011 14:08)
Обалдеть... happy

1 альтаир   (17.06.2011 08:57)
супер

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