Отслеживание мышки

» опубликован
» Способ реализации: Jass
» Тип: Алгоритм
» Версия Warcraft: 1.31
Введение
С давных времен люди задумывались как отслеживать в варкрафте положение мышки без помощи сторонних утилит. Например, для возможности управлять персонажем от третьего лица. Предложенный здесь алгоритм решает данную проблему самым простым существующим на данный момент способом, другая похожая возможная реализация является составляющей следующей статьи
Реализаия
Реализация выполнена созданием сетки фреймов в стандартном окне 0.8*0.6 с размерами:
local real dx = 0.005
local real dy = 0.005
Выбранный фрейм является ползунком не случайно, как известно в 1.31 у фреймов типа BUTTON существует баг, что при нажатии с него не сбрасывается фокус и после чего нельзя, например, получить CallBack с клавиатуры.
Следующая библиотека постоянно отслеживает положение мышки на фрейм-сетке с началом координат в центре и записывает его в массивы fraim_mous_dix, fraim_mous_diy по индексу игрока
» code
library FrameNet initializer InitTrig_FrameNet

globals
	private trigger FrameNetINI
	private hashtable gl_hash
	private integer MAX_MOUSE_X
	private integer MAX_MOUSE_Y
	//
	real array fraim_mous_dix
	real array fraim_mous_diy
endglobals

private function FraimCallBack takes nothing returns nothing
   local framehandle frame = BlzGetTriggerFrame()
   local player pl = GetTriggerPlayer()
   local integer pl_index = GetConvertedPlayerId(pl)-1
   local integer gl_X = LoadInteger(gl_hash,GetHandleId(frame),1)
   local integer gl_Y = LoadInteger(gl_hash,GetHandleId(frame),2)
   // 
   set fraim_mous_dix[pl_index] = gl_X - MAX_MOUSE_X/2
   set fraim_mous_diy[pl_index] = gl_Y - MAX_MOUSE_Y/2
endfunction


private function Trig_frame_Actions takes nothing returns nothing
	local trigger trig = CreateTrigger()
	local framehandle mainButton
	local real dx = 0.005
	local real dy = 0.005
	local integer XCount = R2I(0.8/dx)
	local integer YCount = R2I(0.6/dy)
	local integer i = 0
	local integer j = 0
	local integer HashID
	//
	local integer i_loop = 0
	loop
		exitwhen i_loop == 25//need_const
		set fraim_mous_dix[i_loop] = 0
		set fraim_mous_diy[i_loop] = 0
		set i_loop = i_loop + 1
	endloop
	//
	set MAX_MOUSE_X = XCount
	set MAX_MOUSE_Y = YCount
	loop
		exitwhen j == YCount
		set i = 0
		loop
			exitwhen i == XCount
			set mainButton  = BlzCreateFrameByType("SCROLLBAR", "FrameGridBoss", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),"",0)
			//SCROLLBAR - работет
			call BlzFrameSetAbsPoint(mainButton, FRAMEPOINT_CENTER, dx/2+dx*i, dy/2+dy*j)
			call BlzFrameSetSize(mainButton, dx, dy)
			call BlzTriggerRegisterFrameEvent(trig, mainButton, FRAMEEVENT_MOUSE_ENTER)
			//
			set HashID = GetHandleId(mainButton)
			call SaveInteger(gl_hash,HashID,1,i)
			call SaveInteger(gl_hash,HashID,2,j)
			set i = i + 1
    		endloop
		set j = j + 1
		//call BJDebugMsg(I2S(i)+" "+I2S(j))
	endloop
	call TriggerAddAction ( trig, function FraimCallBack )
endfunction

//===========================================================================

private function InitTrig_FrameNet takes nothing returns nothing
    set gl_hash = InitHashtable()
    set FrameNetINI = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( FrameNetINI, 1.00 )
    call TriggerAddAction( FrameNetINI, function Trig_frame_Actions )
endfunction

endlibrary
Использование наработки предполагается с отключением нижнего интерфейса, пример того как это сделать можно найти тут. Или готовый вариант в карте-примере xgm.guru/files/100/238563/FrameNet.w3x.
Так-как подобный алгоритм требуется, в основном, для того, чтобы управлять персонажем от первого-третьего лица фреймы за стандартными размерами часто не требуются, так как мышка постоянно возвращается в центр командой.
if(loc_pl == GetLocalPlayer()) then
			call BlzSetMousePos(R2I(BlzGetLocalClientWidth()/2),R2I(BlzGetLocalClientHeight()/2))
endif
где:
loc_pl - игрок которому необходимо вернуть мышку


Просмотров: 1 699

NazarPunk #2 - 7 месяцев назад 0   
Шёл 2019 год, а ёжики плакали и кусали jass.
Интересно, как вы разместили сетку фрэймов на широкоформатных мониторах?
Прикрепленные файлы
Koladik #3 - 7 месяцев назад 0
NazarPunk, хорошее замечание, дополнил статью в соответствии с ним.
GetLocalPlayer #4 - 7 месяцев назад 0
К сожалению у фреймов большая задержка на срабатывание событий.
Bergi_Bear #5 - 7 месяцев назад 0
Да, то что надо отлично, жаль что широкоформатники идут лесом =(
Только очень жалко что на jass, где
» Lua?
Срезик, ставь минус
Скачал запустил, Фпс вообще в нулине ну 30, играть нельзя будет при таком
Прикрепленные файлы
NazarPunk #6 - 7 месяцев назад 0
Скачал запустил, Фпс вообще в нулине ну 30, играть нельзя будет при таком
~10k фрэймов это вам не шутки)
Hate #7 - 7 месяцев назад 0
надо как то уменьшать количество фреймов, жертвуя точностью
NazarPunk #8 - 7 месяцев назад 1   
надо как то уменьшать количество фреймов, жертвуя точностью
или понадеяться на то, что метелица завезёт нативку)
Bergi_Bear #9 - 7 месяцев назад 0
Так на мемхаке всё работало и причем даже на широком формате, значит данные читать можно
хотя на самом мемхаке первой версии я так и не получил координаты нормально, фаталило, что-то не так с адресами, а в RenderEdge всё ОК, но требует наличие этой библиотеки, не сторонне по, но в импорте лежало
или же вот
Но тут оказывается Mix, уже запамятовал
Koladik #10 - 7 месяцев назад 0
Скачал запустил, Фпс вообще в нулине ну 30, играть нельзя будет при таком
надо как то уменьшать количество фреймов, жертвуя точностью
Не обращал внимание на фпс почему-то. Если уменьшить линейный размер фрейма в 2 раза, что уменьшает их общее количество в 4 раза, получается стабильное 60 фпс. Тогда, если, как я описал, лочить мышку в центре и убрать боковые фреймы то, видимо, будет стабильная игра.
GetLocalPlayer:
К сожалению у фреймов большая задержка на срабатывание событий.
А как это почувствовать, что это проблему где-то вызовет?
GetLocalPlayer #11 - 7 месяцев назад 0
А как это почувствовать, что это проблему где-то вызовет?
Где угодно, где требуется реакция. Например, тобой же описанное - управление камерой.
ScorpioT1000 #12 - 7 месяцев назад -3   
на глагну!
Bornikkeny #13 - 7 месяцев назад 0
Если честно, ожидал более простой реализации. Но если подумать, что в какой-то стратегии можно реализовать отлов мыши для 1го\3го лица - это просто бомба!
NazarPunk #14 - 7 месяцев назад -2   
на глагну!
Вот щас бы jass на главную постить, хотя оригинал на lua написан.
Koladik #15 - 7 месяцев назад 0
хотя оригинал на lua написан.
Прошу заметить, что у оригинала немного другая идея. Он, чтобы обойти баг с фокусом использовал тултипы, я скролбары. Потому я и написал, что моя реализация более простая и любой новичек-картостроитель сможет ее реализовать.
Bergi_Bear #16 - 7 месяцев назад 1   
Надо просто чтобы NazarPunk, переписал на Луа, и сделал более оптимизированным без просадки fps, вот тогда вообще будет норм! тогда и на главную можно
Это сообщение удалено
NanO #18 - 7 месяцев назад 0
Ev3nt:
GetLocalPlayer:
К сожалению у фреймов большая задержка на срабатывание событий.
Могу то же сделать, но без задержки. Я так понял, задержка из-за WindowsHookEx, если бы делали черезпоток, то не было бы её.
Давай.
Ev3nt #19 - 7 месяцев назад 0
NanO:
Ev3nt:
GetLocalPlayer:
К сожалению у фреймов большая задержка на срабатывание событий.
Могу то же сделать, но без задержки. Я так понял, задержка из-за WindowsHookEx, если бы делали черезпоток, то не было бы её.
Давай.
Только щас заметил, что там без сторонних утилит, а мой вариант - это mix.
NazarPunk #20 - 7 месяцев назад 0
Он, чтобы обойти баг с фокусом использовал тултипы, я скролбары.
Изменил название фрэйма и уже другая реализация, я тоже так умею))
Потому я и написал, что моя реализация более простая и любой новичек-картостроитель сможет ее реализовать.
А какая разница как реализовано? Если есть удобное API всем вообще пофиг на внутреннее устройство.
Koladik #21 - 7 месяцев назад 2   
Изменил название фрэйма и уже другая реализация, я тоже так умею))
Да если бы все было так просто, не каждый фрейм ж подойдет, поэтому вопрос еще как лучше-быстрее, хотя и тут можно еще немного оптимизировать.
NazarPunk:
А какая разница как реализовано?
Ну в одной реализации просто разобраться самому, сесть и модифицировать как душе угодно, а в другой черт голову сломит.
Msey #22 - 7 месяцев назад 0
Здорово!
Там можно смело частоту в пять раз уменьшить во благо производительности. Суперточные координаты большой роли не сыграю. Ну, по крайней мере, я на практике не сталкивался с тасками, где была нужна такая точность в варе