Добавлен Koladik,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Версия Warcraft:
1.31
Введение
В данный момент невозможно в одно действие проверить удерживается ли конкретная клавиша на клавиатуре или кнопка мышки, данная библиотека призвана помочь в решении проблемы, которая, надеюсь, решиться близами.
В данный момент невозможно в одно действие проверить удерживается ли конкретная клавиша на клавиатуре или кнопка мышки, данная библиотека призвана помочь в решении проблемы, которая, надеюсь, решиться близами.
Реализация
Библиотека предоставляет три функции:
Проверка нажата ли игроком определенная клавиша на клавиатуре
Библиотека предоставляет три функции:
Проверка нажата ли игроком определенная клавиша на клавиатуре
function IsButtonPresed takes player, oskeytype returns boolean
Проверяемая клавиша обязательно должна быть включена Вами внизу библиотеки в список прослушиваемых с помощью функции:
private function AddHearingKey takes oskeytype In_Key returns nothing
Проверка нажата ли клавиша мышки
function IsMouseButtonPresed takes player, mousebuttontype returns boolean
Добавление игрока в список с прослушываемыми клавишами
function AddPlayerControl takes player returns nothing
Пара функций AddPlayerControl и AddHearingKey пока являются слабыми, немного недоработанными местами алгоритма (без дебага, что не мешает ему быть полезным в целом), поэтому лучше добавить все клавиши и всех игроков которые Вы будете использовать внизу библиотеки.
Сама библиотека:
code JASS
library KeyboardControl initializer Init_KeyboardControl
//=================================
//
//function IsButtonPresed takes player, oskeytype returns boolean
//
//function IsMouseButtonPresed takes player, mousebuttontype returns boolean
//
//function AddPlayerControl takes player returns nothing
//
//=================================
globals
private hashtable KeyHash
private trigger trg_keypress
private trigger trg_mouse_down
private trigger trg_mouse_up
private oskeytype array HearingOsKeys
private integer HearingKeysCounter = 0
private integer array HashPlayerKeyAdress
private force KCPlayers
endglobals
function IsButtonPresed takes player loc_pl, oskeytype Os_Key returns boolean
return LoadBoolean(KeyHash, GetHandleId(Os_Key), GetConvertedPlayerId(loc_pl) - 1)
endfunction
function IsMouseButtonPresed takes player loc_pl, mousebuttontype MBT returns boolean
return LoadBoolean(KeyHash, GetHandleId(MBT), GetConvertedPlayerId(loc_pl) - 1)
endfunction
private function MouseEvent takes boolean KeyStatus returns nothing
local integer MBTId = GetHandleId(BlzGetTriggerPlayerMouseButton())
//local boolean KeyStatus = BlzGetTriggerPlayerIsKeyDown() NOTWORKING
local integer PlayerIndex = GetConvertedPlayerId(GetTriggerPlayer()) - 1
call SaveBoolean(KeyHash,MBTId,PlayerIndex,KeyStatus)
endfunction
private function MouseEventUp takes nothing returns nothing
call MouseEvent(false)
endfunction
private function MouseEventDown takes nothing returns nothing
call MouseEvent(true)
endfunction
private function KeyboardEvent takes nothing returns nothing
local boolean KeyStatus = BlzGetTriggerPlayerIsKeyDown()
local integer OsKeyId = GetHandleId(BlzGetTriggerPlayerKey())
local integer PlayerIndex = GetConvertedPlayerId(GetTriggerPlayer()) - 1
call SaveBoolean( KeyHash, OsKeyId, PlayerIndex, KeyStatus)
//
// call BJDebugMsg("keyboardpress Pl: " + I2S(PlayerIndex) + " " + I2S(OsKeyId))
endfunction
function AddPlayerControl takes player loc_pl returns nothing
local integer PlayerIndex = GetConvertedPlayerId(loc_pl) - 1
local oskeytype Os_Key
local integer i = 0
loop
exitwhen (i == HearingKeysCounter)
set Os_Key = HearingOsKeys[i]
call BlzTriggerRegisterPlayerKeyEvent(trg_keypress, loc_pl, Os_Key, 0, true )
call BlzTriggerRegisterPlayerKeyEvent(trg_keypress, loc_pl, Os_Key, 0, false )
call SaveBoolean(KeyHash,GetHandleId(Os_Key),PlayerIndex,false)
set i = i + 1
endloop
call TriggerRegisterPlayerEvent(trg_mouse_down, loc_pl, EVENT_PLAYER_MOUSE_DOWN)
call TriggerRegisterPlayerEvent(trg_mouse_up, loc_pl, EVENT_PLAYER_MOUSE_UP)
call SaveBoolean(KeyHash,GetHandleId(MOUSE_BUTTON_TYPE_LEFT),PlayerIndex,false)
call SaveBoolean(KeyHash,GetHandleId(MOUSE_BUTTON_TYPE_MIDDLE),PlayerIndex,false)
call SaveBoolean(KeyHash,GetHandleId(MOUSE_BUTTON_TYPE_RIGHT),PlayerIndex,false)
endfunction
private function AddHearingKey takes oskeytype In_Key returns nothing
set HearingOsKeys[HearingKeysCounter] = In_Key
set HearingKeysCounter = HearingKeysCounter + 1
endfunction
private function Init_KeyboardControl takes nothing returns nothing
set KeyHash = InitHashtable()
set trg_keypress = CreateTrigger()
call TriggerAddAction(trg_keypress, function KeyboardEvent)
set trg_mouse_down = CreateTrigger()
set trg_mouse_up = CreateTrigger()
call TriggerAddAction(trg_mouse_down, function MouseEventDown)
call TriggerAddAction(trg_mouse_up, function MouseEventUp)
//===========Placehere all hearing Keys==========
call AddHearingKey(OSKEY_Q)
call AddHearingKey(OSKEY_W)
call AddHearingKey(OSKEY_E)
call AddHearingKey(OSKEY_A)
call AddHearingKey(OSKEY_S)
call AddHearingKey(OSKEY_D)
call AddHearingKey(OSKEY_Z)
call AddHearingKey(OSKEY_X)
call AddHearingKey(OSKEY_C)
//===============================================
call AddPlayerControl(Player(0))
call AddPlayerControl(Player(1))
//
endfunction
endlibrary
Обсуждение
Главным минусом этого алгоритма является существование залипания клавиш, если удерживая любую кнопку на клавиатуре нажать на любую кнопку-фрейм, например, вызвать меню и отпустить клавиатуру, то алгоритм будет думать, что вы ее не отпускали. Причем с обычными кнопками меньше проблем (проблема тут следствие бага с фокусом), так как в этом случае можно выпустить функцию-фикс нажатых клавиш и при обращении к фрейму их деактивировать. Но это невозможно применить к кнопке меню потому, что если записать следующий код
Главным минусом этого алгоритма является существование залипания клавиш, если удерживая любую кнопку на клавиатуре нажать на любую кнопку-фрейм, например, вызвать меню и отпустить клавиатуру, то алгоритм будет думать, что вы ее не отпускали. Причем с обычными кнопками меньше проблем (проблема тут следствие бага с фокусом), так как в этом случае можно выпустить функцию-фикс нажатых клавиш и при обращении к фрейму их деактивировать. Но это невозможно применить к кнопке меню потому, что если записать следующий код
local framehandle frame = BlzGetFrameByName("UpperButtonBarMenuButton",0)
local trigger loc_trg = CreateTrigger()
call BlzTriggerRegisterFrameEvent(loc_trg, frame, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(loc_trg, function FixSticky)
меню не будет выскакивать. Карта для теста
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Init_KeyboardControl можно переименовать просто в Init
Отредактирован PT153