2013-03-07 2 views
1

Я нахожусь в середине написания дополнения World of Warcraft, и я хочу, чтобы аддон мог выполнять определенные функции на основе нажатия клавиши или комбинации нажатия клавиш. Большинство ключевых состояний защищены WoW функции API теперь, но следующие по-прежнему могут быть использованы аддонов:Использование Lua для обнаружения комбинации клавишных клавиш

IsAltKeyDown() 
IsControlKeyDown() 
IsShiftKeyDown() 

То, что я хотел бы быть в состоянии сделать, это выполнить функцию, основанную на одном из тех, клавиши вниз или комбинация.

Это то, что я должен работать:

function KeyCombos() 
    total = 0 
    if IsShiftKeyDown() then 
     total = total + 1 
    end 
    if IsControlKeyDown() then 
     total = total + 2 
    end 
    if IsAltKeyDown() then 
     total = total + 4 
    end 
end 

Теперь мой вопрос не обязательно о Lua, так как данная функция работает, как я могу проверить, если общая равна 6, например, чтобы увидеть, если управление и Alt нажаты. Мой вопрос скорее алгоритмический. Есть ли лучший способ выполнить эту программу?

ответ

0

Кажется, что это звучит уже давно.

В качестве альтернативы, однако, можно использовать таблицу:

function KeyCombos() 
    keys = { 
     shift = IsShiftKeyDown(), 
     control = IsControlKeyDown(), 
     alt = IsAltKeyDown(), 
    } 
end 

Тогда вы могли бы назвать keys.alt или keys["alt"], чтобы увидеть, если она нажата.

Более читаемый? Вероятно. Более эффективным? Скорее всего, не. Но я не очень хорошо разбираюсь в производительности Lua.

Я бы просто добавил блок комментариев над функцией KeyCombos, в котором говорилось о каждой возможной комбинации и о том, что это значит.

As a side note, it's Lua, not LUA.

+0

Спасибо Netfangled, дополнительно я отредактировал LUA to Lua. Спасибо за совет :). –

1

Если вы собираетесь использовать таблицу, в общем случае было бы гораздо лучше, чтобы сохранить ту же таблицу.

function KeyCombos() 
    keys = keys or {} 

    keys.shift = IsShiftKeyDown() 
    keys.control = IsControlKeyDown() 
    keys.alt = IsAltKeyDown() 
end 

или, если вы предпочитаете

function KeyCombos() 
    if not keys then 
     keys = {} 
    end 

    keys.shift = IsShiftKeyDown() 
    keys.control = IsControlKeyDown() 
    keys.alt = IsAltKeyDown() 
end 

Оригинальный пример в этом вопросе, однако, гораздо более производительным, используя целочисленную арифметику.


Однако эти примеры создают глобальные переменные. Таким образом:

function GetKeyCombos() 
    local keys = 0 

    if IsShiftKeyDown() then 
     keys = keys + 1 
    end 
    if IsControlKeyDown() then 
     keys = keys + 2 
    end 
    if IsAltKeyDown() then 
     keys = keys + 4 
    end 

    return keys 
end 

было бы намного лучше. В WoW все AddOns используют одну и ту же глобальную среду, поэтому лучше всего держать ее в чистоте.