//Глобальные переменные:
var int Player_Sprint_Enabled;
const int Player_Sprint_MaxTime = 30000; //предельное время спринта, в мс (можно переменную)
...........
// в функцию цикла
if (Player_Sprint_Enabled == FALSE)
{ //еще не бежим
if (MEM_KeyPressed(KEY_RSHIFT) || MEM_KeyPressed(KEY_LSHIFT))
{ //игрок нажал SHIFT
Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", Player_Sprint_MaxTime); //даже если что-то пойдет не так, оверлей в итоге отключится
Player_Sprint_Enabled = TRUE;
};
}
else
{ //уже бежим
if (!MEM_KeyPressed(KEY_RSHIFT) && !MEM_KeyPressed(KEY_LSHIFT))
{ //игрок отпустил SHIFT
Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", 0); //откл. оверлей, если уже отклюен - ничего не будет
Player_Sprint_Enabled = FALSE;
};
/* тут вписываем учет усталости, когда надо отключаем оверлей */
};
Ух ты,не думал,что дамы на форуме такое знают.Спасибо за информацию,возьму на заметку)Не знаю, как именно делали в strong hand'е, но я бы делала спринт примерно по такой схеме:
1. Сделать оверлей, назовем его "Player_Sprint.mds", в котором все анимации ходьбы заменены на спринт (сравниваем "HumanS.mds" и "HumanS_Sprint.mds").
2. В скриптах создаем циклическую функцию, через обычный триггер-цикл или FrameFunctions из LeGo. Там проверяем нажатие Shift:
Код://Глобальные переменные: var int Player_Sprint_Enabled; const int Player_Sprint_MaxTime = 30000; //предельное время спринта, в мс (можно переменную) ........... // в функцию цикла if (Player_Sprint_Enabled == FALSE) { //еще не бежим if (MEM_KeyPressed(KEY_RSHIFT) || MEM_KeyPressed(KEY_LSHIFT)) { //игрок нажал SHIFT Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", Player_Sprint_MaxTime); //даже если что-то пойдет не так, оверлей в итоге отключится Player_Sprint_Enabled = TRUE; }; } else { //уже бежим if (!MEM_KeyPressed(KEY_RSHIFT) && !MEM_KeyPressed(KEY_LSHIFT)) { //игрок отпустил SHIFT Mdl_ApplyOverlayMdsTimed(hero,"Player_Sprint.mds", 0); //откл. оверлей, если уже отклюен - ничего не будет Player_Sprint_Enabled = FALSE; }; /* тут вписываем учет усталости, когда надо отключаем оверлей */ };
3. Добавляем отображение полоски усталости в ту же циклическую функцию. См. LeGo Bars.
4. Начинаем учитывать всякие "особые ситуации". В первую очередь загрузку-сохранение игры, еще ГГ мог в кого-нибудь превратиться, быть под каким-нибудь эффектом...
Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",Time_Speed);
void FF_Apply(func имя функции)
{
сама функция оверлея.
}
Точно не знаю,может и ошибусь,но оверлей применяется на определенное время,в свою очередь которое обрабатывается движком.А почему не получится сделать оверлей как у зелья скорости, например?Код:Mdl_ApplyOverlayMdsTimed(self,"HUMANS_SPRINT.MDS",Time_Speed);
?
Точно не знаю,может и ошибусь,но оверлей применяется на определенное время,в свою очередь которое обрабатывается движком.
ЗЫ,жди более продвинутых людей в этой категории,я редко работал с оверлеями.
кто-то уже пробовал вписывать значения в константу - и это ничем не помогло.Как было 5 минут - так и осталось.Хотя,можешь попробовать,я уже говорил что с оверлеями работал очень редко.По моему там есть константа отвечающая за время спринта а именно "Time_Speed" .
...
void Mdl_ApplyOverlayMds (c_npc n0,string s1);// запустить файл анимации s1 с расширением mds для НПС n0.
void Mdl_RemoveOverlayMDS (c_npcself,string overlayName);// отключить от НПС self файл анимации overlayName.
void Mdl_ApplyOverlayMDSTimed (c_npcself,string overlayname,int timeTicks);// запустить файл анимации overlayname для НПС self на время timeTicks.
...
Зы, + тутор Вама:
void Mdl_ApplyOverlayMDSTimed (c_npcself,string overlayname,int timeTicks);// запустить файл анимации overlayname для НПС self на время timeTicks.
В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.Ребят, как сделать в икарусе так чтобы пока нажата клавиша шифт (shift) герой начал бегать (спринтом), а когда я отжимаю клавишу возвращается обычный бег (как на видео-демонстрации strong hand-а)?
func void B_GlobalInit()
{
if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
{
if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
{
//Переход в режим обычного бега.
Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = FALSE;
};
};
if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
{
if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
{
//Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
{
PC_Sprint_Mode = 2;
};
};
};
if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
{
//Переключение в режим спринтера.
if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
{
//Переход в режим спринтера.
Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = TRUE;
};
};
if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
{
Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = FALSE;
};
Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции.
};
Вопрос лично к тебе,а куда собственно девать зацикленный скрипт? Запихивал в event - ноль реакции.Может попробовать отследить работу скрипта через какой-нибудь лог,если это возможно?В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.
Вот вырезка скриптка, помещенная в тело функции B_GlobalInit зацикленной при помощи Trigger-Script
var int PC_Sprint_Mode; //Переменная режима быстрого бега.
var int PC_STAMINA_MAX; //Атрбут максимальной выносливости ГГ.
var int PC_STAMINA_CURRENT; //Атрибут текущей выносливости ГГ.
Расчет выносливости в скриптах не указан.
Код:func void B_GlobalInit() { if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте. { if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера. { //Переход в режим обычного бега. Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; }; if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT). { if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие) { //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега. if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE) { PC_Sprint_Mode = 2; }; }; }; if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега. { //Переключение в режим спринтера. if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру. { //Переход в режим спринтера. Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = TRUE; }; }; if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается { Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции. };
Куда хочешь, главное правильное прописать в нем вызов триггер-скрипта и сам триггер-скрипт в спейсере. Вместо триггер-скрипта можешь использовать циклы из пакета Лего описанные выше, но скорость их работы не равномерная и зависит от частоты кадров. Ссылка на урок Триггер-Скрипт https://worldofplayers.ru/threads/31401/Вопрос лично к тебе,а куда собственно девать зацикленный скрипт? Запихивал в event - ноль реакции.Может попробовать отследить работу скрипта через какой-нибудь лог,если это возможно?
Если можешь потратить немного времени,то можно в ЛС с этим?Куда хочешь, главное правильное прописать в нем вызов триггер-скрипта и сам триггер-скрипт в спейсере. Вместо триггер-скрипта можешь использовать циклы из пакета Лего описанные выше, но скорость их работы не равномерная и зависит от частоты кадров. Ссылка на урок Триггер-Скрипт https://worldofplayers.ru/threads/31401/
Вот несколько вопросов появилось:В StrongHand переключение на бег реализовано БЕЗ дополнительных скриптпакетов Ikarus и LeGo. Кроме того сохранена возможность обычной ходьбы при зажатой клавише SHIFT, переключение на бег происходит если отпустить клавишу SHIFT, но при этом удерживать клавишу "Вперед". В отличие от представленных выше вариантов используется считывание состояний ГГ, а не нажатие конкретных клавиш, которые могут быть переназначены в настройках игры.
Вот вырезка скриптка, помещенная в тело функции B_GlobalInit зацикленной при помощи Trigger-Script
var int PC_Sprint_Mode; //Переменная режима быстрого бега.
var int PC_STAMINA_MAX; //Атрбут максимальной выносливости ГГ.
var int PC_STAMINA_CURRENT; //Атрибут текущей выносливости ГГ.
Расчет выносливости в скриптах не указан.
Код:func void B_GlobalInit() { if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте. { if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера. { //Переход в режим обычного бега. Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; }; if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT). { if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие) { //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега. if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE) { PC_Sprint_Mode = 2; }; }; }; if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега. { //Переключение в режим спринтера. if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру. { //Переход в режим спринтера. Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = TRUE; }; }; if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается { Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; Wld_SendTrigger("GLOBAL_INIT"); //Вызов триггера для зацикливания всей функции. };
Отвечу на первые 2 вопроса ТОЧНО:Вот несколько вопросов появилось:
1.Нужно ли расширять грани триггера чтобы он охватывал весь мир?
2.Нужно ли прописать проверку персонаже как в вашем уроке?
3.В "pc_hero" нужно прописать и "PC_STAMINA_CURRENT = 100;" и "PC_STAMINA_MAX = 100;"?
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, находится ли ГГ в мире, иначе сразу вызов триггера без продолжения выполнения функции.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
return; //Выход из функции.
};
//Дальше можно вставлять множество своих функций...
sprint();
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
func void sprint()
{
if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте.
{
if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера.
{
//Переход в режим обычного бега.
Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = FALSE;
};
};
if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT).
{
if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие)
{
//Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега.
if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE)
{
PC_Sprint_Mode = 2;
};
};
};
if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега.
{
//Переключение в режим спринтера.
if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру.
{
//Переход в режим спринтера.
Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = TRUE;
};
};
if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается
{
Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS");
PC_Sprint_Mode = FALSE;
};
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции.
};
А зачем вы 3 раза вызываете триггер? Достаточно двух. И лучше бы занести не "sprint ()",а весь код.Для надежности.Не работает мой скрипт, вот как он выглядит:
Код:func void B_CYCLE_FUNCTION() { if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, находится ли ГГ в мире, иначе сразу вызов триггера без продолжения выполнения функции. { Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции. return; //Выход из функции. }; //Дальше можно вставлять множество своих функций... sprint(); Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции. }; func void sprint() { if(C_BodyStateContains(hero,BS_STAND)) //Если ГГ стоит на месте. { if(PC_Sprint_Mode == TRUE) //Если ГГ в режиме спринтера. { //Переход в режим обычного бега. Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; }; if(C_BodyStateContains(hero,BS_WALK)) //Если ГГ в режиме ходьбы (зажата клавиша SHIFT). { if(!Npc_IsInFightMode(hero,FMODE_FAR)) //Если ГГ не в режиме дальнего боя, например с луком или арбалетом (при остановке после бега с луком или арбалетом будут небольшие глюки, нужно спрятать и повторно вытащить оружие) { //Переключение в режим подготовки спринтера если остаток выносливости не менее одной четверти и ГГ уже не в режиме быстрого бега. if(PC_Sprint_Mode == FALSE && PC_STAMINA_CURRENT > PC_STAMINA_MAX / 4 && Npc_GetTalentSkill(hero,NPC_TALENT_SPRINT) == TRUE) { PC_Sprint_Mode = 2; }; }; }; if(C_BodyStateContains(hero,BS_RUN)) //Если ГГ в режиме обычного бега. { //Переключение в режим спринтера. if(PC_Sprint_Mode == 2) //Если ГГ в режиме подготовки к спринтеру. { //Переход в режим спринтера. Mdl_ApplyOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = TRUE; }; }; if(PC_Sprint_Mode == TRUE && PC_STAMINA_CURRENT < PC_STAMINA_MAX / 15) //Если выносливости менее 1/15 быстрый бег выключается { Mdl_RemoveOverlayMds(hero,"HUMANS_SPRINT.MDS"); PC_Sprint_Mode = FALSE; }; Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера для зацикливания всей функции. };