GI.LinkEvent
LinkEvent (Общие функции объекта GI) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция ассоциирует локальную функцию по ее имени со стандартным событием объекта GI. Предыдущая ассоциация при этом удаляется. Также функции может передаваться один произвольный аргумент. На данный момент доступны следующие стандартные события: OnDraw, OnResize, OnNewInput.
Синтаксис
GI.LinkEvent(<Имя события (STRING)>,<Имя локальной функции (STRING)>,<Глубина поиска (INT)>=0,<Аргумент функции>)
Аргументы
<Имя события (STRING)>
- Аргумент задает имя события для ассоциации. На данный момент доступны следующие имена событий:- OnDraw: Событие вызывается в момент прорисовки кадра из функции InitiateRedraw. В нем можно разместить произвольный код для прорисовки и в нужный момент вызвать функцию DrawScene, которая выполняет рисование всех графических объектов. Локальная функция для вызова этого события должна содержать два аргумента -- объект GI и доп. параметр, заданный в этой функции, пример:
Function Прорисовка(ОбъектGI,ДопПараметр)
. - OnResize: Событие вызывается в момент изменения размера окна GI из функции InitiateRedraw. В нем можно разместить произвольный код, связанный с изменением размеров рисуемых элементов. Локальная функция для вызова этого события должна содержать четыре аргумента (разрешается не указывать два последних) -- объект GI и доп. параметр, заданный в этой функции, новая ширина окна GI, новая высота окна GI, пример:
Function ИзменилосьОкно(ОбъектGI,ДопПараметр,ШиринаОкна,ВысотаОкна)
. - OnNewInput: Событие вызывается в момент получения новой информации от внешних устройств ввода (клавиатура, мышь, контроллер), либо в момент получения или потери фокуса окном GI из функции InitiateRedraw. В нем можно разместить произвольный код, связанный с реакцией на эти события. Локальная функция для вызова этого события может содержать до семи аргументов (пример:
Function СобытиеВводаДанных(ОбъектGI,ДопПараметр,ТипСобытия,Арг1,Арг2,Арг3,Арг4)
), описание аргументов предлагается ниже:- ОбъектGI: передает текущий объект GI, для которого вызывается событие.
- ДопПараметр: передает значение дополнительного параметра, заданного в функции LinkEvent.
- ТипСобытия: передает цифровой тип события, на данный момент доступные следующие типы:
- 0-9: события, связанные с мышью. Назначение аргументов: Арг1 -- клавиша, колесо мыши или ноль, Арг2 -- позиция мыши X, Арг3 -- позиция мыши Y, Арг4 -- нажатые клавиши мыши. Причем:
- 0 -- движение мыши, аргументы Арг2 и Арг3 задают новое положение мыши относительно левой верхней точки окна GI, Арг4 задает битовую маску нажатых в данный момент клавиш мыши (бит 0 -- левая клавиша, бит 1 -- правая клавиша, бит 4 -- средняя клавиша и пр.).
- 1 -- нажата клавиша мыши, аргумент Арг1 задает номер нажатой клавиши (0 -- левая, 1 -- правая, 2 -- средняя), остальные аргументы соответствуют аргументам для события движения мыши (см. выше).
- 2 -- отпущена клавиша мыши, аргумент Арг1 задает номер отпущенной клавиши (0 -- левая, 1 -- правая, 2 -- средняя), остальные аргументы соответствуют аргументам для события движения мыши (см. выше).
- 3 -- событие движения колеса мыши, аргумент Арг1 задает число -- значение прокрутки колеса мыши, остальные аргументы соответствуют аргументам для события движения мыши (см. выше).
- 10-19: события, связанные с клавиатурой. Назначение аргументов: Арг1 -- виртуальный код клавиши, Арг2 -- является ли клавиша дополнительной (extended), Арг3, Арг4 -- не заполнятся. Причем:
- 10 -- произошло повторение предыдущего нажатия клавиши, так как она продолжает быть удерживаемой.
- 11 -- нажата клавиша клавиатуры.
- 12 -- отпущена клавиша клавиатуры.
- 20-29: события, связанные с фокусом окна GI. Дополнительные аргумента Арг1, Арг2, Арг3, Арг4 не заполнятся. Причем:
- 20 -- Окно GI получило фокус.
- 21 -- Окно GI потеряло фокус.
- 0-9: события, связанные с мышью. Назначение аргументов: Арг1 -- клавиша, колесо мыши или ноль, Арг2 -- позиция мыши X, Арг3 -- позиция мыши Y, Арг4 -- нажатые клавиши мыши. Причем:
- OnDraw: Событие вызывается в момент прорисовки кадра из функции InitiateRedraw. В нем можно разместить произвольный код для прорисовки и в нужный момент вызвать функцию DrawScene, которая выполняет рисование всех графических объектов. Локальная функция для вызова этого события должна содержать два аргумента -- объект GI и доп. параметр, заданный в этой функции, пример:
<Имя локальной функции (STRING)>
- Аргумент задает имя локальной или глобальной функции, которая будет вызываться при наступлении события.<Глубина поиска (INT)>
- (необязательный аргумент) Задает способ поиска локальной функции. Может принимать следующие значения:- 0 (по умолчанию) -- выполнять поиск во всех модулях большего уровня вложенности (родительских) и во всех глобальных модулях.
- 1 -- выполнять поиск только внутри текущего модуля.
- 2 -- выполнять поиск только внутри родительского модуля.
- 3..x -- выполнять поиск только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
<Аргумент функции>
- (необязательный аргумент) Содержит произвольное значение, которое будет передано локальной функции вторым аргументом при ее вызове.
Примеры
//Событие движения мыши и нажатия на клавиши Function OnNewInput(aGI,СпУскор,ТипСобытия,Арг1,Арг2,Арг3,Арг4) If ТипСобытия=0 Then //Движение мыши -- обновить переменные поворота //Арг2, Арг3 -- смещение мыши по X и Y относительно окна прорисовки If aGI.MouseCaptured Then СпУскор[4]:=Арг2-aGI.Width div 2; СпУскор[5]:=Арг3-aGI.Height div 2; EndIf; ElseIf ТипСобытия=1 Then //Нажатие мыши на экран, захватить мышь aGI.CaptureMouse(); ElseIf ТипСобытия=11 Then //Клавиша нажата If (Арг1=0x57)Or(Арг1=0x26) Then//W или стрелка вперед -- движение по Z СпУскор[3]:=1; ElseIf (Арг1=0x53)Or(Арг1=0x28) Then//S или стрелка назад -- движение по Z СпУскор[3]:=-1; ElseIf (Арг1=0x51)Or(Арг1=0x25) Then//Q или стрелка влево -- движение по X СпУскор[1]:=-1; ElseIf (Арг1=0x45)Or(Арг1=0x27) Then//E или стрелка вправо -- движение по X СпУскор[1]:=1; ElseIf (Арг1=0x20)Or(Арг1=0x41) Then//A или пробел -- прыжок СпУскор[2]:=1; ElseIf Арг1=0x1B Then//ESC -- отпустить мышь aGI.ReleaseMouse(); EndIf; ElseIf ТипСобытия=12 Then //Клавиша отпущена If ((Арг1=0x57)Or(Арг1=0x26))And(СпУскор[3]=1) Then//Отменить движение по Z, если оно было инициировано W СпУскор[3]:=0; ElseIf ((Арг1=0x53)Or(Арг1=0x28))And(СпУскор[3]=-1) Then//Отменить движение по Z, если оно было инициировано S СпУскор[3]:=0; ElseIf ((Арг1=0x51)Or(Арг1=0x25))And(СпУскор[1]=-1) Then//Отменить движение по X, если оно было инициировано Q СпУскор[1]:=0; ElseIf ((Арг1=0x45)Or(Арг1=0x27))And(СпУскор[1]=1) Then//Отменить движение по X, если оно было инициировано E СпУскор[1]:=0; ElseIf _Or(Арг1=0x20,Арг1=0x41) Then//Отменить прыжок СпУскор[2]:=0; EndIf; ElseIf ТипСобытия=21 Then//Потеря фокуса окном, отпустить мышь aGI.ReleaseMouse(); EndIf; EndFunction ... //Инициализация графического объекта для элемента аЭлемент: режим выделенного цикла, двойная буферизация aGI:=GI.Init(аЭлемент,,1,1); //Внутренние переменные, для использования в обработчиках событий СпУскор:=List.Create(0,0,0,0,0); //Переменные ускорения: по x, по y, по z,поворот мыши по x,поворот мыши по y //Автоматически захватывать мышь aGI.MouseMode(1); //Указание на функции обработчиков событий aGI.LinkEvent("ONDRAW","OnDraw",1,СпКоорд); aGI.LinkEvent("ONNEWINPUT","OnNewInput",1,СпУскор); //Включить режим фильтрации MSAA aGI.AntiAliasing(1); //Включить режим ограничения кадров по развертке экрана aGI.FrameLimiter(1); //Включить 3D перспективу, FOV 90 aGI.WorldPerspective(0,90,0.1,1000); ...