Удалить одно событие, которое может быть точно таким же, как другие в VB.net - PullRequest
0 голосов
/ 14 декабря 2011

Я создаю систему на VB.net, которая использует Lua через LuaInterface.

Чтобы связать событие в Lua с функцией, я могу просто сделать это:

RegisterEvent("tick", function(nt)
    if not lcc then return end
        if nt>=tt then
            f()
            lcc=false
        end
    end)

Как видите, в настоящее время я использую переменную lcc для отмены функции. Это как бы взломано, и функция все равно будет вызываться, вызывая ненужные накладные расходы. Так выглядит мой сабвуфер «RegisterEvent» на моем VB.net

Public Sub RegisterEvent(ByVal eventName As String, ByVal func As LuaFunction)
    Select Case eventName.ToLower
        Case "keydown"
            AddHandler Me.event_keydown, AddressOf func.Call
        Case "keyup"
            AddHandler Me.event_keyup, AddressOf func.Call
        Case "mousedown"
            AddHandler Me.event_mousedown, AddressOf func.Call
        Case "mouseup"
            AddHandler Me.event_mouseup, AddressOf func.Call
        Case "ready"
            AddHandler Me.event_ready, AddressOf func.Call
        Case "tick"
            AddHandler Me.event_tick, AddressOf func.Call
        Case "frame"
            AddHandler Me.event_frame, AddressOf func.Call
    End Select
End Sub

Я бы хотел сделать что-то подобное в моем Lua:

local lcc=RegisterEvent("tick", function(nt)
    print("The Ticks Are Now At: "..nt)
    if nt>5000 then
        DisconnectEvent(lcc)
    end
end)

Проблема в том, что я не уверен, как мне следует изменить мою функцию / Sub RegisterEvent и как мне сделать DisconnectEvent.

Спасибо за любую помощь. Я знаю, что это немного раздражает, пытаясь понять, что я пытаюсь сказать. Не стесняйтесь оставлять комментарии с просьбой дать разъяснения. Я буду более чем готов попытаться объяснить это в меру своих способностей. Если у LuaInterface есть какой-то нативный способ справиться с этим, я тоже открыт для этого:)

Всё, что может помочь - это прекрасно!

1 Ответ

0 голосов
/ 14 декабря 2011

Поправь меня, если я ошибаюсь.Возможно, вам придется использовать Dictionary (of String, boolean), чтобы определить, было ли событие присоединено или нет.

Dim eventDict As New Dictionary(Of String, Boolean)

Public Sub RegisterEvent(ByVal eventName As String, ByVal func As LuaFunction)
    Select Case eventName.ToLower
        Case "keydown"
           If Not eventDict.ContainsKey(eventName) Then
                eventDict.Add(eventName,false)
           End If
           if eventDict(eventName) Then
                RemoveHandler Me.event_keydown, AddressOf func.Call
                eventDict(eventName)=false
           Else 
                eventDict(eventName)=true
                AddHandler Me.event_keydown, AddressOf func.Call
           End If
     ...
End sub
...