Новые сообщения Участники Правила Поиск
Помощь по SDK для Serious Sam 1.05/1.07
Jack_Stone Четверг, 29.09.2016, 06:53 | Сообщение # 2551


Сообщений: 146
Награды: 1
Замечания: 0%
 
STPROD, я прошу прощения, но я ничего не понял. Можно чуть-чуть по-подробнее?

ST27 Четверг, 29.09.2016, 09:06 | Сообщение # 2552


Сообщений: 460
Награды: 7
Замечания: 0%
 
Есть у тебя на карте какой-нибудь Light типа Ambient с радиусом, скажем, 8. Ты каждый тик (например в функции RenderGameView в Player) телепортируешь этот специальный лайт (который нужно еще назначить в свой собственный специальный CEntityPointer) на координаты переменной m_vRayHit, которая находится уже в PlayerWeapons и которую внутри Player можно получить как: GetPlayerWeapons()->m_vRayHit.
Телепортировать, естественно, функцией Teleport(CPlacement3D, FALSE) - (На место CPlacement3D пишешь "CPlacement3D(GetPlayerWeapons()->m_vRayHit, ANGLE3D(0,0,0))", на место FALSE - так же FALSE) - второй аргумент функции отвечает за телефраг, который нам не нужен и мы естественно его отключаем


- My Personal Site -
Jack_Stone Четверг, 29.09.2016, 19:30 | Сообщение # 2553


Сообщений: 146
Награды: 1
Замечания: 0%
 
Я опять ничего не понял, но всё равно спасибо :) Какая связь между фонариком и PlayerWeapons ? и где находится CEntityPointer?

ST27 Пятница, 30.09.2016, 00:30 | Сообщение # 2554


Сообщений: 460
Награды: 7
Замечания: 0%
 
Не умеешь в базовые вещи - твои проблемы

- My Personal Site -
Kadath Пятница, 30.09.2016, 06:10 | Сообщение # 2555


Son of Anubis
Сообщений: 2517
Награды: 24
Замечания: 0%
 
Можно использовать и PlayerParenter, в крайнем случае. Фиговый, но фонарик.

Мои работы
DeadKadath's Showcase
Ar2R-devil-PiNKy Пятница, 30.09.2016, 11:01 | Сообщение # 2556


Creative virtuoso
Сообщений: 3740
Награды: 58
Замечания: 
 
Цитата Kadath ()
Можно использовать и PlayerParenter, в крайнем случае. Фиговый, но фонарик.

Его эффективнее для Фальшфейера :D


Мои работы
Jack_Stone Суббота, 01.10.2016, 22:47 | Сообщение # 2557


Сообщений: 146
Награды: 1
Замечания: 0%
 
Народ, объясните кто нибудь, как сделать фонарь, ну конечно кому не сложно. Я вижу, что несколько людей точно знают, как это делается. Это ведь форум, и форум для того и нужен, чтобы задавать вопросы и получать на них нормальные ответы, а не ответы типа "Не умеешь в базовые вещи - твои проблемы". если я не прав, то так и скажите.

Kadath Воскресенье, 02.10.2016, 08:10 | Сообщение # 2558


Son of Anubis
Сообщений: 2517
Награды: 24
Замечания: 0%
 
Мой способ совсем не касается SDK. Надо скачать новый класс PlayerParenter отсюдова и прицепить в редакторе к игроку источник света. Необходимо настроить правильное положение источника света (можно даже несколько припэрентить). Фонарик можно будет включать от триггера в любой момент, но единственный минус такого способа в том, что PlayerParenter резко реагирует на повороты игрока, да и на движение в целом. Но в качестве дешманского фонаря для поиска картохи в погребе сойдет.

Мои работы
DeadKadath's Showcase
Jack_Stone Воскресенье, 02.10.2016, 11:55 | Сообщение # 2559


Сообщений: 146
Награды: 1
Замечания: 0%
 
Kadath, спасибо. Но не ясно, как сделать чтоб в любой момент можно было включать, и желательно от кнопки.

Добавлено (02.10.2016, 11:55)
---------------------------------------------
этого, я так понимаю, PlayerParenter не предусматривает?

Kadath Воскресенье, 02.10.2016, 13:19 | Сообщение # 2560


Son of Anubis
Сообщений: 2517
Награды: 24
Замечания: 0%
 
Jack_Stone, включается триггером. Если хочешь от кнопки на клавиатуре, можно сделать с SDK такую ентитю, которая отлавливает нажатия определённых клавиш и посылает сигнал триггеру, которой в свою очередь активирует PlayerParanter. Тут я не смогу помочь, к сожалению.

Мои работы
DeadKadath's Showcase
Heming_Hitrowski Воскресенье, 02.10.2016, 13:21 | Сообщение # 2561


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, один из способов, как можно сделать фонарь.

1) CEntityPointer - это указатель на энтити. Я уверен, что ты видел поле Target у Trigger. Так вот, это тоже самое. Абстрактно будем говорить, что это объект в игре.

В Serious Sam есть объекты, которые могут освещать местность. Например, если пустить ракету в темном помещении, то можно заметить её небольшое свечение. Я предлагаю сделать тот же самый способ, нашей целью будет создать такой Projectile, который будет сам по себе невидим, но у него будет свет.

2) Почему надо лезть в PlayerWeapons. Дело в том, что в этом классе есть луч, который бьет прямо из игрока (примерно говорю, знатоки поправят меня), в место, куда направлен его прицел. Например, переменная m_vRayHit хранит в себе координаты того места, куда "ударил" этот луч. Чем это может нам помочь? Например, можно относительно этого луча телепортировать тот самый светящийся Projectilе, в итоге получаем освещение местности в зависимости от направления взгляда.

2.5) Создай какой-нибудь Projectile по аналогии со, скажем, PRT_ROCKET. Сделай так, чтобы он светился, модель была не видна и чтоб время жизни было очень-очень долгим.

3) Как заспавнить этот Projectile в коде и где это сделать?

Для начала надо объявить кнопку. Идем в Player.es. Я возьму в качестве аналогии кнопку bFireBomb, которая отвечает за запуск серьезной бомбы.

После строки 314 добавь
Код
  BOOL bFlashlight;

После строки 544 добавь
Код
  if(pctlCurrent.bFlashlight)      paAction.pa_ulButtons |= PLACT_FLASHLIGHT;

После строки 720 добавь
Код
_pShell->DeclareSymbol("user INDEX ctl_bFlashlight;",             &pctlCurrent.bFlashlight);


И самый важный шаг. На строке 257 найдешь вот такую конструкцию:
Код
#define PLACT_FIREBOMB            (1L<<13)
#define PLACT_SELECT_WEAPON_SHIFT (14)


Поменяй ее на
Код
#define PLACT_FIREBOMB            (1L<<13)
#define PLACT_FLASHLIGHT          (1L<<14)
#define PLACT_SELECT_WEAPON_SHIFT (15)


Все, практически готово.
Теперь идешь на строку 4492.
Видишь, как там реализован запуск бомбы. Делаешь примерно тоже самое:

Код
if (ulNewButtons&PLACT_FLASHLIGHT) {
// здесь будет код по нажатию кнопки связанной с фонарем
}


Далее, естественно, надо зайти в .ctl файл в папке Controls в самом Serious Sam и прописать по аналогии кнопку с Flashlight.
Данная кнопка будет работать корректно и по сети :)

Определились где заспавнить. Теперь КАК заспавнить какую-либо энтити.

Возьмем пример: нам нужно чтобы в мире появился Trigger. Прежде всего создай глобальную переменную в PlayerWeapons, пусть она объявляется, например, так:
Код
400 CEntityPointer m_penTrigger,


Вот как ее можно инициализировать:

Код
m_penTrigger = CreateEntity(GetPlacement(), CLASS_TRIGGER);
m_penTrigger->Initialize();


Это самый простой способ инициализации. У нас создается стандартный Trigger на том месте, где мы стоим (GetPlacement()). Вот, например, более сложный.

m_penTrigger = CreateEntity(GetPlacement(), CLASS_TRIGGER);((CTrigger*)&*m_penTrigger)->m_strName = "New Trigger";
m_penTrigger->Initialize();

Таким образом, ты можешь уточнять, какой именно Trigger ты хочешь заспавнить.

Теперь, зная как спавнить определенные объекты, загляни в функцию FireRocket в PlayerWeapons.
Посмотри как там спавнится снаряд. Сделай свою функцию для включения и выключения фонарика в PlayerWeapons. Вот пример.

Код
void SetFlashlight() {
  if (!m_bFlashlight) {
     // m_penFlashlight = CreateEntity...
     m_bFlashlight = TRUE;
  } else {
     if (m_penFlashlight != NULL) {
         m_penFlashlight->Destroy(); // уничтожим Projectile
     } else {
       CPrintF("Ошибка при уничтожении фонарика\n");
     }
     m_bFlashlight = FALSE;
  }
}


Примерно так. Все описывать я задолбаюсь, это можно статью накатать уже :D
Сообщение отредактировал Heming_Hitrowski - Воскресенье, 02.10.2016, 13:25


Jack_Stone Воскресенье, 02.10.2016, 16:14 | Сообщение # 2562


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, а что именно тут прописать?
[/code]if (ulNewButtons&PLACT_FLASHLIGHT) {
// здесь будет код по нажатию кнопки связанной с фонарем
}

Добавлено (02.10.2016, 16:14)
---------------------------------------------
я попробовал что то прописать, у меня много undeclared получилось

Heming_Hitrowski Воскресенье, 02.10.2016, 18:26 | Сообщение # 2563


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, undeclared - необъявленный. Ых, вот так вот без азов я тебе вряд ли что-то объясню... Почитай про переменные в языках программирования и про их объявление.

Jack_Stone Воскресенье, 02.10.2016, 18:36 | Сообщение # 2564


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, у меня что-то получилось. вместо фонаря получилась кнопка суицида, как в Постал 2. не знаю, почему так. Но взрывчатость я вроде удалил - m_bExplode у нового проджектайла PlayerFlashlight.

SLAwww Воскресенье, 02.10.2016, 20:28 | Сообщение # 2565


Рряа? ^..^
Сообщений: 2398
Награды: 27
Замечания: 0%
 
Вот, работает без изменений в PlayerWeapons, хоть написано не лучшим образом. Включается/выключается start/stop eventами.
Прикрепления: Flashlight.es (5.9 Kb)


Where did all the dragons go?
We searched in the hills and we searched down the canyons,
we even scanned the depths of the caves with our armour, swords and lanterns.
Oh, if only had we seen him lurch, from his glorious skull covered perch.

CRACK went his claws and SMACK swipped the tail,
a ROAR of might, one big BITE.

and so ended our search.
Jack_Stone Понедельник, 03.10.2016, 09:49 | Сообщение # 2566


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, у меня получилось сделать включение фонаря, только телепортируется не модель (Projectile), как ты предлагал, а Light. Всё как надо светится. Но не получается ничего с выключением света. Есть функция Destroy, которой вроде как и можно удалить этот Light - в моём случае m_penLight - но она почему то не помогает.

Добавлено (03.10.2016, 09:49)
---------------------------------------------

Код
  // turn on off flashlight
  void Flashlight(){  
   
      if (m_penLight == NULL){
    CEntityPointer m_penLight = CreateEntity(GetPlacement(), CLASS_LIGHT);
       m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani"));
    m_penLight->Initialize();
       }
    else if (m_penLight != NULL){

        m_penLight = NULL;
      m_penLight->Destroy();
      }

  };


ST27 Понедельник, 03.10.2016, 10:04 | Сообщение # 2567


Сообщений: 460
Награды: 7
Замечания: 0%
 
Цитата Jack_Stone ()
m_penLight = NULL;
m_penLight->Destroy();

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


- My Personal Site -
Jack_Stone Понедельник, 03.10.2016, 10:26 | Сообщение # 2568


Сообщений: 146
Награды: 1
Замечания: 0%
 
не помогло.

ST27 Понедельник, 03.10.2016, 10:47 | Сообщение # 2569


Сообщений: 460
Награды: 7
Замечания: 0%
 
Цитата Jack_Stone ()
CEntityPointer m_penLight

А, ну да. Что это такое? У тебя же, я так понимаю, переменная уже в свойствах определена, зачем ее снова определять как CEntityPointer?


- My Personal Site -
Ar2R-devil-PiNKy Понедельник, 03.10.2016, 11:21 | Сообщение # 2570


Creative virtuoso
Сообщений: 3740
Награды: 58
Замечания: 
 
Слава же уже сделал новый отдельный класс, выше находится.

Мои работы
Heming_Hitrowski Понедельник, 03.10.2016, 11:22 | Сообщение # 2571


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, 1.
Код
CEntityPointer m_penLight = CreateEntity(GetPlacement(), CLASS_LIGHT);
Создавая вот таким образом энтити, ты объявляешь локальную переменную, которая нигде не запоминается (мы потом не сможем уничтожить этот лайт). Правильнее будет вот так:
Код
m_penLight = CreateEntity(GetPlacement(), CLASS_LIGHT);
Таким образом ты присвоишь значение глобальной переменной m_penLight, которую ты как раз объявил до этого. 2.
Код
m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani"));
Я не уверен, что эта строчка вообще что-то даст. Если ты хочешь присвоить лайту light animation, то можно записать это так: [code((CLight*)&*m_penLight)->m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani"));[/code] При этом тебе нужно будет в самом верху класса дописать #include связанный с классом Light (чтобы как раз не было ошибки undefined). 3.
Код
else if (m_penLight != NULL){
можно записать просто как
Код
else {
Сообщение отредактировал Heming_Hitrowski - Понедельник, 03.10.2016, 11:36


Heming_Hitrowski Понедельник, 03.10.2016, 11:37 | Сообщение # 2572


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Какая-то хрень с тегами. Вот код: ((CLight*)&*m_penLight)->m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani"));

Jack_Stone Понедельник, 03.10.2016, 21:32 | Сообщение # 2573


Сообщений: 146
Награды: 1
Замечания: 0%
 
спасибо за советы, но что то опять не выходит. У меня короче получилось так: прописал две кнопки - вкл. (желтый Light) и выкл. (черный Light). Heming_Hitrowski, ((CLight*)&*m_penLight)->m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani")) очень даже работает. Но есть проблема - вот эти 2 Light`а каким-то образом перебивают Light при стрельбе, даже если, например, в самом начале уровня нажать кнопку либо ВКЛ., либо ВЫКЛ., то свет от оружия нейтрализуется. Вариант фонаря не идеальный, но тоже сойдет.

Добавлено (03.10.2016, 21:29)
---------------------------------------------
самое интересное то, что в этом коде только вот этого и хватает - ((CLight*)&*m_penLight)->m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani")). Больше никакие переменные не нужны. Но непонятно как теперь передвинуть эту анимацию чуть дальше от Сэма.

Добавлено (03.10.2016, 21:32)
---------------------------------------------
вот такой вот код, для выключения такой же, только анимация другая

Код
  // turn on flashlight
  void Flashlight(){  
    {
        m_aoLightAnimation.SetData_t(CTFILENAME("Animations\\Flashlight.ani"));
       }
  };


Heming_Hitrowski Понедельник, 03.10.2016, 23:38 | Сообщение # 2574


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, ух, я понял, в чем дело.

Ты тут очень сильно нагородил)) Дело в том, что переменная m_aoLightAnimation используется как раз для вспышки при стрельбе, и ее ВООБЩЕ НЕ НАДО ТРОГАТЬ ЧТОБЫ СДЕЛАТЬ ФОНАРЬ, иначе произойдет такой ужас, который ты описал. Прочитай еще раз что мы тебе предлагали и старайся делать все по шагам.

Для начала давай попробуем все же заспавнить лайт, раз уж ты решил работать именно с ним, а не с Projectile.

По нажатии кнопки фонаря давай попробуем добавить вот такой код.
Код

CPlacement3D pl = GetPlacement(); // получили позицию игрока
pl.pl_PositionVector(2) += 1.0f; // сдвинули ее чуть повыше, чтобы лайт не был в "земле"
m_penLight = CreateEntity(pl, CLASS_LIGHT); // объяви CLASS_LIGHT заранее, в блоке components
m_penLight->Initialize(); // инициализируем лайт на обработанных координатах


Что-нибудь происходит при выполнении?
Сообщение отредактировал Heming_Hitrowski - Вторник, 04.10.2016, 00:00


Jack_Stone Вторник, 04.10.2016, 10:10 | Сообщение # 2575


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, нет, не происходит, но всё компилируется нормально.

Добавлено (04.10.2016, 00:26)
---------------------------------------------
Хотя неее, что то да есть уже) сам Light появляется и исчезает при нажатии кнопки, но свет не производит.

Добавлено (04.10.2016, 00:28)
---------------------------------------------
вот с этим кодом

// turn on off flashlight
void Flashlight(){

Код
     if (m_penLight == NULL){
    m_penLight = CreateEntity(GetPlacement(), CLASS_LIGHT);
    m_penLight->Initialize();
       }
    else {
      m_penLight->Destroy();
        m_penLight = NULL;

      }

  };

Добавлено (04.10.2016, 00:28)
---------------------------------------------
я вообще запутался уже))

Добавлено (04.10.2016, 00:32)
---------------------------------------------
с твоим кодом точно также работает, но света нет

Код
  // turn on off flashlight
  void Flashlight(){  
   
      if (m_penLight == NULL){
CPlacement3D pl = GetPlacement(); // получили позицию игрока
pl.pl_PositionVector(2) += 1.0f; // сдвинули ее чуть повыше, чтобы лайт не был в "земле"
m_penLight = CreateEntity(pl, CLASS_LIGHT); // объяви CLASS_LIGHT заранее, в блоке components
    m_penLight->Initialize();
       }
    else {
      m_penLight->Destroy();
        m_penLight = NULL;

      }

  };

Добавлено (04.10.2016, 10:10)
---------------------------------------------
может он просто телепортирует модель лайта, а "физические свойства" надо отдельно прописывать? но как?

Heming_Hitrowski Вторник, 04.10.2016, 11:37 | Сообщение # 2576


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Цитата
Это самый простой способ инициализации. У нас создается стандартный Trigger на том месте, где мы стоим (GetPlacement()). Вот, например, более сложный.

m_penTrigger = CreateEntity(GetPlacement(), CLASS_TRIGGER);
(CTrigger*)&*m_penTrigger)->m_strName = "New Trigger";
m_penTrigger->Initialize();


Jack_Stone Вторник, 04.10.2016, 12:54 | Сообщение # 2577


Сообщений: 146
Награды: 1
Замечания: 0%
 
ааа, то есть то же самое и с Light можно сделать, и прописать уже имя лайта - например, LT_POINT. Я правильно понял?

Heming_Hitrowski Вторник, 04.10.2016, 12:57 | Сообщение # 2578


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, да) Только не имя, а тип.
Сообщение отредактировал Heming_Hitrowski - Вторник, 04.10.2016, 12:58


Jack_Stone Четверг, 06.10.2016, 10:30 | Сообщение # 2579


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, всё то же самое. Как будто и не менял ничего. Света нет.

Добавлено (04.10.2016, 21:21)
---------------------------------------------
(CTrigger*)&*m_penTrigger)->m_strName = "New Trigger";

эта строка вообще никак не влияет, написать можно любой набор букв на месте "New Trigger"

Добавлено (04.10.2016, 22:20)
---------------------------------------------
попробовал ту же схему с моделью, та же фигня: почему то не меняет тип проджектайла - всегда выстреливает ракету, которая убивает Сэма

Добавлено (04.10.2016, 23:00)
---------------------------------------------
тут и правда используется ракета Сэма, но это ладно. Я сделал так, чтобы она не летела, а как сделать так, чтобы она приатачилась к Сэму и двигалась вместе с ним?

Добавлено (06.10.2016, 10:30)
---------------------------------------------
ВСЕМ, кто помогал мне с созданием фонарика, СПАСИБО, особенно Heming_Hitrowski, ) наконец-то получилось :) но вот чего я не пойму, так это почему он начал светить только тогда, когда прописал эту строчку:

Код
m_penLight->SetParent( this);


а сам код вот такой получился:

Код
  // turn on off flashlight
  void Flashlight(){  
   
      if (m_penLight == NULL){

    m_soFlashlight.Set3DParameters(50.0f, 10.0f, 4.0f, 1.0f);
    PlaySound(m_soFlashlight, SOUND_FLASHLIGHT, SOF_3D|SOF_VOLUMETRIC|SOF_LOCAL);

    CPlacement3D pl = GetPlacement(); // получили позицию игрока
    pl.pl_PositionVector(2) += 2.0f; // сдвинули ее чуть повыше, чтобы лайт не был в "земле"

    m_penLight = CreateEntity(pl, CLASS_LIGHT);
        m_penLight->SetParent( this);
     m_penLight->Initialize();

       }
    else {
     m_soFlashlight.Set3DParameters(50.0f, 10.0f, 4.0f, 1.0f);
     PlaySound(m_soFlashlight, SOUND_FLASHLIGHT, SOF_3D|SOF_VOLUMETRIC|SOF_LOCAL);
       m_penLight->Destroy();
         m_penLight = NULL;

      }
  };


Heming_Hitrowski Четверг, 06.10.2016, 12:41 | Сообщение # 2580


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Цитата
(CTrigger*)&*m_penTrigger)->m_strName = "New Trigger";

эта строка вообще никак не влияет, написать можно любой набор букв на месте "New Trigger"


Оно и логично.) Попробуй сам себе объяснить этот код и понять, что он делает. Если не получится, вот спойлер.


Код
m_penLight->SetParent( this);


Эта строчка привязывает лайт к игроку (на манер свойства Parent в Serious Editor). this - это как раз указатель на класс Player. Поэтому лайт движется за игроком) Это конечно грубый способ, но работать будет.
Сообщение отредактировал Heming_Hitrowski - Четверг, 06.10.2016, 13:52


Поиск: