Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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)
меню не будет выскакивать. Карта для теста
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
17
4 года назад
1
code JASS
vJass*
Init_KeyboardControl можно переименовать просто в Init
2
29
4 года назад
2
Ёжики плакали и кололись но продолжали использовать jass в 1.31
0
28
4 года назад
Отредактирован PT153
0
Ёжики плакали и кололись но продолжали использовать jass в 1.31
Почему бы и нет, пока язык поддерживается. Каждый пишет на том, что удобно конкретно разработчику.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.