итак, ещё немного мануалов как сделать что-то лучше
на этот раз будем учиться запускать летающий урон на экране
начнём сразу с констант и глобальных переменных, которые будут так или иначе встречаться в примерах
думаю не стоит разводить воду и говорить, что работаем мы с EV_SystemMessage и его нужно зарегистрировать и принять в OnEvent, думаю это и так понятно
сразу к куску который всё делает:
Спорить как лучше "рандомить" точку для бокса я не хочу, это не лучший пример, а дальше как хотите
Логика таймера много проще:
Итого мы имеем 28 активных текстбоксов, каждый прибит к своему таймер и независим от другого ни по времени жизни, ни по позициям на экране
почему 28? потому что выше 28 клиенту становится не очень хорошо, проблема не выяснена
на этот раз будем учиться запускать летающий урон на экране
начнём сразу с констант и глобальных переменных, которые будут так или иначе встречаться в примерах
C#:
const DAMAGE_MESSAGE_OFFSET = 100;
const MAX_DAMAGE_MESSAGE = 28;
C#:
var TextBoxHandle DamageText[MAX_DAMAGE_MESSAGE]; //именно столько нам нужно TextBox в xdat, т.е. 28
for (i=0; i<MAX_DAMAGE_MESSAGE; i++)
{
DamageText[i] = GetTextBoxHandle("OnScreenMessageExWnd.DamageText-0-" $ i);
}
думаю не стоит разводить воду и говорить, что работаем мы с EV_SystemMessage и его нужно зарегистрировать и принять в OnEvent, думаю это и так понятно
сразу к куску который всё делает:
C#:
function HandleSystemMessage (string a_Param)
{
local int SystemMsgIndex, DamageToPlayer, i;
ParseInt(a_Param,"Index",SystemMsgIndex);
switch (SystemMsgIndex)
{
case 2261: //player msg
case 2281: //summoner msg
for(i=0; i<MAX_DAMAGE_MESSAGE; i++)
{
if(DamageText[i].GetText() == "") //гоняем циклом пока не упираем в свободный TextBox
{
DamageText[i].SetAlpha(255); //принудительно делаем непрозрачным, в теории можно покрутить плавное появление
ParseInt( a_Param, "Param3", DamageToPlayer); //цифра урона
DamageText[i].SetText(string(DamageToPlayer)); //установить цифру урона в свободный индекс массива текстобоксов
DamageText[i].SetAnchor( "OnScreenMessageExWnd", "BottomCenter", "BottomCenter", -200 + Rand(150), Rand(60) ); //выбираем случайную точку
DamageText[i].ClearAnchor(); //убираем якорь с окна после предыдущего действия
DamageText[i].Move(0, -1500, 8f); //начинаем движение текстбокса на -1500 (вверх) со скоростью 8
DamageText[i].SetAlpha( 0, 2.8f ); //плавно делаем текстбокс прозрачным
Me.KillTimer(i + DAMAGE_MESSAGE_OFFSET + 1); //убиваем таймер (индекс + константа + 1)
Me.SetTimer(i + DAMAGE_MESSAGE_OFFSET + 1, 2500); //заводим таймер именно для этого текстбокса исходя из того же (индекс + константа + 1)
break;
}
}
break;
}
}
Логика таймера много проще:
C#:
function OnTimer (int TimerID)
{
Me.KillTimer(TimerID); //убиваем любой таймер в самом начале, тут ИД нам не важен
if(TimerID >= 101 && TimerID <= 200) //Тут подключается логика завода таймер индекс + DAMAGE_MESSAGE_OFFSET
{
DamageText[TimerID-DAMAGE_MESSAGE_OFFSET-1].SetText(""); //удаляем текст с текстбокса, что бы он освободился
}
}
Итого мы имеем 28 активных текстбоксов, каждый прибит к своему таймер и независим от другого ни по времени жизни, ни по позициям на экране
почему 28? потому что выше 28 клиенту становится не очень хорошо, проблема не выяснена