Добавлен Koladik,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Версия Warcraft:
1.31
Введение
С давных времен люди задумывались как отслеживать в варкрафте положение мышки без помощи сторонних утилит. Например, для возможности управлять персонажем от третьего лица. Предложенный здесь алгоритм решает данную проблему самым простым существующим на данный момент способом, другая похожая возможная реализация является составляющей следующей статьи
Реализаия
Реализация выполнена созданием сетки фреймов в стандартном окне 0.8*0.6 с размерами:
С давных времен люди задумывались как отслеживать в варкрафте положение мышки без помощи сторонних утилит. Например, для возможности управлять персонажем от третьего лица. Предложенный здесь алгоритм решает данную проблему самым простым существующим на данный момент способом, другая похожая возможная реализация является составляющей следующей статьи
Реализаия
Реализация выполнена созданием сетки фреймов в стандартном окне 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 - игрок которому необходимо вернуть мышку
loc_pl - игрок которому необходимо вернуть мышку
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
хотя на самом мемхаке первой версии я так и не получил координаты нормально, фаталило, что-то не так с адресами, а в RenderEdge всё ОК, но требует наличие этой библиотеки, не сторонне по, но в импорте лежало
GetLocalPlayer: А как это почувствовать, что это проблему где-то вызовет?