Перейти к содержимому
MatroseFuchs

[UB2] События (Events)

В этой теме 1 комментарий

Рекомендуемые комментарии

5 274
[LESTA]
Разработчик
1 414 публикации
7 730 боёв

Event

Событие - объект который генерируется и рассылается по какому-либо действию пользователя (например клик мыши, нажатие клавиши и т.п.). Для распространения события используется метод dispatch

Событие либо происходит (что эквивалентно bool == true) либо отсутствует. Событие может срабатывать по различным условиям, а ловить (или слушать) событие могут как родители, так дети и сиблинги. Для этого нужно объявить это же событие в скоупах всех элементов, где планируется их ловить.

(event valChanged)
(event evKilled)
...
(dispatch evKilled args={} dir="EventDirection.DOWN" (event $datahub.getEntity(entityId).health.evKilled))

event это событие по которому происходит dispatch.

dir задаёт направление события по иерархии. По умолчанию dispatch отсылает событие только в рамках самого элемента. Чтобы отправить событие в родителя - нужно в dir указать EventDirection.UP. В ребёнка - EventDirection.DOWN. В сиблингов - достаточно просто объявить эвент в нужном сиблигне, а dir можно не указывать. Для dir в hud_replaces заведён dict со значениями. По умолчанию dir=0.

(def constant EventDirection {  NONE:  0,
                                UP:    1,
                                DOWN:  2
})

 

События в unbound могут генерироваться:

  • Из core C++ части. Например в блоке slider генерируется event valueChanged когда изменяется его value.
    (dispatch valChanged on='valueChanged' dir=1)

     

  • Из Scaleform части. Например событие клика по display object'у
    (block
        (style
            (width = 100)
            (height = 100)
            (backgroundColor = 0xff00ff00)
        )
        (bind alpha "0.5" init=false on='click')
    )

Различия использования подписки на события с помощью on и event

Биндинг-конструкции могут подписываться на события двумя способами:

  • Передача имени события в аргумент on.
    (bind eventArgs "$event" init=false on='eventScope')
  • Передача вложенного объекта event
    (trace "$event" init=false (event "eventScope"))

Событие может быть сгенерировано:

  • в scalefom, например событие мыши click или событие клавиатуры keyDown
  • в core c++ части unbound, например блок slider генерирует событие sliderPositionChanged когда изменятся положение ползунка
  • в верстке, т.е. событие объявлено в scope элемента и генерируется в его определении.
    (def element TestView() layout = true entrance=true
        (scope
            (event eventScope)
        )
      
        (element Button
            (dispatch eventScope on='click')
        )
    )

    Но по сути своей это не генерация события, а превращение из события scalefom/core c++ (в данном примере 'click')  в событие скоупа (в данном пример eventScope)

Рассмотрим различия между этими двумя способами

Если событие генерируется в scaleform или в core c++ unbound, то подписаться можно только с использованием аргумента on. 

Скрытый текст

(def element TestView() layout = true entrance=true
    (scope
        (event eventScope)
    )
  
    (block
        (style
            (width = 100px)
            (height = 100px)
            (backgroundColor = 0xffff0000)
        )
        (bind alpha "0.5" init=false on='click')
    )
  
    (video original_widht=1920 original_height=1080
        (style
            (width = 320px)
            (height = 180px)
        )
  
        (source = "R.videos.Logo_All" )
        (trace "$event" init=false on='metaDataChanged')
    )
)

 

 

Если событие объявлено в scop'e элемента, то существует 2 случая подписки в зависимости от расположения подписки. 

  • Подписку в scope можно осуществлять и через on и через event
    Скрытый текст
    
    (def element TestView() layout = true entrance=true
        (scope
            (event eventScope)
      
            (var eventArgs:dict = null)
            (bind eventArgs "$event" init=false (event "eventScope"))
            # (bind eventArgs "$event" init=false on='eventScope')
        )
      
        (element Button
            (scope
                (label = 'dispatch scope event')
            )
            (dispatch eventScope on='click')
        )
      
        (trace "eventArgs" init=false)
    )

     

  • Подписку вне скоупа можно осуществлять только через event
    Скрытый текст
    
    (def element TestView() layout = true entrance=true
        (scope
            (event eventScope)
        )
      
        (element Button
            (scope
                (label = 'dispatch scope event')
            )
            (dispatch eventScope on='click')
        )
      
        (trace "$event" init=false (event "eventScope"))
    )

     

 

Таким образом подписываться через аргумент on можно на те события которые генерирует target-объект

Отдельно рассмотрим случай подписки на события scop'а при создании элемента.

(element Button
    (scope
        (label = 'default text')
        (bind label 'leftClick' init=false on='evBtnLeftClickEvent')
        (bind label 'rightClick' init=false on='evBtnRightClickEvent')
    )
)

События 'evBtnLeftClickEvent' и 'evBtnRightClickEvent' генерируются в определении element'а Button.

Если использовать конструкцию event, то события должны быть объявлены в родительском скоупе

Скрытый текст

(def element TestView() layout = true entrance=true
    (scope
        (event eventScope)
    )
  
    (element Button
        (scope
            (label = 'default text')
            (bind label "'keyCode: ' + $event.keyCode" init=false (event "eventScope"))
        )
    )
  
    (dispatch eventScope on='stageKeyUp')
)

 

 

 

  • Плюс 3

Рассказать о публикации


Ссылка на публикацию
Гость
Эта тема закрыта для публикации новых ответов.

×