FAQ по EVENT
Posted: 08.05.2011 12:58
Для чего нужны эвенты? Как работают Эвенты?
Сейчас разберемся.
Эвен это событие которое ДАЕТ вам игровые переменные для дальнейшей обработки. Например ID чара, текст в чате, Имя произнесшего фразу итд.
Чем Эвент отличается от функции/процедуры: функцию/процедуру надо вызывать каждый раз когда вам нужны действия ими выполняемые. А эвент один раз запущеный продолжает работать до завершения скрипта, или пока не будет остановлен, его ненадо вызывать каждый раз. но можно в любой момент использовать данные которые дает тот или иной эвент.
Пример: давайте выведем в системный журнал имена всех персонажей НПС находящихся на экране.
Разберем скрипт. Лучше всего для понимания рассматривать его с конца.
// Запускаем бесконечный цикл. Ведь эвент работает только, пока работает скрипт. Поэтому для теста мы не дадим скрипту завершиться.
//Вызываем Евент. тут давайте поподробнее
SetEventProc - функция запуска эвента
evUpdateChar - собственно имя эвента. Полный список можно посмотреть тут http://stealth.od.ua/wiki/doku.php?id=event
'UpdateChar' - этот параметр передает эвенту evSpeech на растерзание функцию с именем UpdateChar и передает ей параметры. А вот какие параметры указано тут http://stealth.od.ua/wiki/doku.php?id=event
Давайте вернемся к скрипту. Выходит мы передаем параметры евента evUpdateChar в функцию UpdateChar.
Для этого надо создать эту функцию (в нашем случае создадим процедуру);
Обратите внимание как я использую переменные, которые будут переданы в процедуру для обработки. Я посмотрел на страницу http://stealth.od.ua/wiki/doku.php?id=event
и увидел там описание "evUpdateChar : [ID] - отрисовка чара (не обязательно нашего!)" Тоесть наш эвент evUpdateChar возвращает только один параметр - ID. ID в игре обьявляется типом Cardinal.
Я объявляю тип на входе в процедуру. procedure UpdateChar(TempID : Cardinal); и задаю ему имя TempID. В дальнейшем я могу в этой процедуре делать все что угодно с параметром TempID используя такие функции как
GetName(TempID) и прочие.
Теперь, если мы запустим скрипт, то увидим - каждую секунду вызывается эвент и отображать в системном журнале имена всех НПС находящихся на экране с игроком.
И чуть не забыл чтобы остановить Эвент нужно использовать функцию вызова эвента с пустым вторым параметром параметром.
Этой функцией мы остановили событие отслеживающее ID всех нпс появляющихся на экране игрока.
вот еще один пример
Сейчас разберемся.
Эвен это событие которое ДАЕТ вам игровые переменные для дальнейшей обработки. Например ID чара, текст в чате, Имя произнесшего фразу итд.
Чем Эвент отличается от функции/процедуры: функцию/процедуру надо вызывать каждый раз когда вам нужны действия ими выполняемые. А эвент один раз запущеный продолжает работать до завершения скрипта, или пока не будет остановлен, его ненадо вызывать каждый раз. но можно в любой момент использовать данные которые дает тот или иной эвент.
Пример: давайте выведем в системный журнал имена всех персонажей НПС находящихся на экране.
Code: Select all
Program Test;
procedure UpdateChar(TempID : Cardinal);
begin
AddToSystemJournal('UpdateChar = '+ GetName(TempID));
end;
begin
SetEventProc(evUpdateChar,'UpdateChar');
while True do
wait(1000);
end.
Code: Select all
while True do wait(1000);
Code: Select all
SetEventProc(evUpdateChar,'UpdateChar');
Code: Select all
SetEventProc(evSpeech,'function_name');
SetEventProc - функция запуска эвента
evUpdateChar - собственно имя эвента. Полный список можно посмотреть тут http://stealth.od.ua/wiki/doku.php?id=event
'UpdateChar' - этот параметр передает эвенту evSpeech на растерзание функцию с именем UpdateChar и передает ей параметры. А вот какие параметры указано тут http://stealth.od.ua/wiki/doku.php?id=event
Давайте вернемся к скрипту. Выходит мы передаем параметры евента evUpdateChar в функцию UpdateChar.
Для этого надо создать эту функцию (в нашем случае создадим процедуру);
Code: Select all
procedure UpdateChar(TempID : Cardinal);
begin
AddToSystemJournal('UpdateChar = '+ GetName(TempID));
end;
и увидел там описание "evUpdateChar : [ID] - отрисовка чара (не обязательно нашего!)" Тоесть наш эвент evUpdateChar возвращает только один параметр - ID. ID в игре обьявляется типом Cardinal.
Я объявляю тип на входе в процедуру. procedure UpdateChar(TempID : Cardinal); и задаю ему имя TempID. В дальнейшем я могу в этой процедуре делать все что угодно с параметром TempID используя такие функции как
GetName(TempID) и прочие.
Теперь, если мы запустим скрипт, то увидим - каждую секунду вызывается эвент и отображать в системном журнале имена всех НПС находящихся на экране с игроком.
И чуть не забыл чтобы остановить Эвент нужно использовать функцию вызова эвента с пустым вторым параметром параметром.
Code: Select all
Пример:
SetEventProc(evUpdateChar,' '); // можно вставить пробелы или вообще пусто между кавычками.
вот еще один пример
Code: Select all
Program Test;
procedure UpdateChar(TempID2 : Cardinal);
begin
if GetName(TempID2) = 'Marcos' then
AddToSystemJournal('НПС найден')
else
AddToSystemJournal('НПС Marcos ненайден ') ;
end;
begin
SetEventProc(evUpdateChar,'UpdateChar');
while True do
wait(1000);
end.