整理虚拟按键相关函数

This commit is contained in:
MrZ626
2021-02-09 18:31:54 +08:00
parent 58db840200
commit d301a1c12b
3 changed files with 68 additions and 104 deletions

View File

@@ -363,7 +363,7 @@ end
--Game draw --Game draw
local VK=virtualkey local VK=virtualkey
function drawVirtualKeys() function drawVirtualkeys()
if SETTING.VKSwitch then if SETTING.VKSwitch then
local a=SETTING.VKAlpha local a=SETTING.VKAlpha
local _ local _
@@ -403,6 +403,57 @@ function drawVirtualKeys()
end end
end end
end end
function onVirtualkey(x,y)
local dist,nearest=1e10
for K=1,#VK do
local B=VK[K]
if B.ava then
local d1=(x-B.x)^2+(y-B.y)^2
if d1<B.r^2 then
if d1<dist then
nearest,dist=K,d1
end
end
end
end
return nearest
end
function pressVirtualkey(t,x,y)
local B=VK[t]
B.isDown=true
B.pressTime=10
if SETTING.VKTrack then
if SETTING.VKDodge then--Button collision (not accurate)
for i=1,#VK do
local b=VK[i]
local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--Hit depth(Neg means distance)
if d>0 then
b.x=b.x+(b.x-B.x)*d*b.r*5e-4
b.y=b.y+(b.y-B.y)*d*b.r*5e-4
end
end
end
local O=VK_org[t]
local _FW,_CW=SETTING.VKTchW,1-SETTING.VKCurW
local _OW=1-_FW-_CW
--Auto follow: finger, current, origin (weight from setting)
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
end
SFX.play("virtualKey",SETTING.VKSFX)
VIB(SETTING.VKVIB)
end
function updateVirtualkey()
if SETTING.VKSwitch then
for i=1,#VK do
_=VK[i]
if _.pressTime>0 then
_.pressTime=_.pressTime-1
end
end
end
end
--Game --Game
@@ -478,7 +529,7 @@ function destroyPlayers()--Destroy all player objects, restore freerows and free
end end
collectgarbage() collectgarbage()
end end
function restoreVirtualKey() function restoreVirtualkey()
for i=1,#VK_org do for i=1,#VK_org do
local B,O=virtualkey[i],VK_org[i] local B,O=virtualkey[i],VK_org[i]
B.ava=O.ava B.ava=O.ava
@@ -683,7 +734,7 @@ do--function resetGameData(args)
destroyPlayers() destroyPlayers()
GAME.curMode.load(playerData) GAME.curMode.load(playerData)
initPlayerPosition(args:find("q")) initPlayerPosition(args:find("q"))
restoreVirtualKey() restoreVirtualkey()
if GAME.modeEnv.task then if GAME.modeEnv.task then
for i=1,#PLAYERS do for i=1,#PLAYERS do
PLAYERS[i]:newTask(GAME.modeEnv.task) PLAYERS[i]:newTask(GAME.modeEnv.task)

View File

@@ -8,21 +8,9 @@ local max,sin=math.max,math.sin
local SCR=SCR local SCR=SCR
local VK=virtualkey local VK=virtualkey
local function onVirtualkey(x,y) local onVirtualkey=onVirtualkey
local dist,nearest=1e10 local pressVirtualkey=pressVirtualkey
for K=1,#VK do local updateVirtualkey=updateVirtualkey
local B=VK[K]
if B.ava then
local d1=(x-B.x)^2+(y-B.y)^2
if d1<B.r^2 then
if d1<dist then
nearest,dist=K,d1
end
end
end
end
return nearest
end
local hideChatBox local hideChatBox
local textBox=WIDGET.newTextBox{name="texts",x=340,y=80,w=600,h=550,hide=function()return hideChatBox end} local textBox=WIDGET.newTextBox{name="texts",x=340,y=80,w=600,h=550,hide=function()return hideChatBox end}
@@ -70,31 +58,7 @@ function scene.touchDown(_,x,y)
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
PLAYERS[1]:pressKey(t) PLAYERS[1]:pressKey(t)
if SETTING.VKSFX>0 then pressVirtualkey(t,x,y)
SFX.play("virtualKey",SETTING.VKSFX)
end
local B=VK[t]
B.isDown=true
B.pressTime=10
if SETTING.VKTrack then
if SETTING.VKDodge then--Button collision (not accurate)
for i=1,#VK do
local b=VK[i]
local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--Hit depth(Neg means distance)
if d>0 then
b.x=b.x+(b.x-B.x)*d*b.r*5e-4
b.y=b.y+(b.y-B.y)*d*b.r*5e-4
end
end
end
local O=VK_org[t]
local _FW,_CW=SETTING.VKTchW,1-SETTING.VKCurW
local _OW=1-_FW-_CW
--Auto follow: finger, current, origin (weight from setting)
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
end
VIB(SETTING.VKVIB)
end end
end end
function scene.touchUp(_,x,y) function scene.touchUp(_,x,y)
@@ -293,14 +257,7 @@ function scene.update(dt)
touchMoveLastFrame=false touchMoveLastFrame=false
--Update virtualkey animation --Update virtualkey animation
if SETTING.VKSwitch then updateVirtualkey()
for i=1,#VK do
_=VK[i]
if _.pressTime>0 then
_.pressTime=_.pressTime-1
end
end
end
if not playing then if not playing then
heartBeatTimer=heartBeatTimer+dt heartBeatTimer=heartBeatTimer+dt
@@ -393,7 +350,7 @@ function scene.draw()
end end
--Virtual keys --Virtual keys
drawVirtualKeys() drawVirtualkeys()
--Warning --Warning
gc.push("transform") gc.push("transform")

View File

@@ -6,21 +6,9 @@ local max,sin=math.max,math.sin
local SCR=SCR local SCR=SCR
local VK=virtualkey local VK=virtualkey
local function onVirtualkey(x,y) local onVirtualkey=onVirtualkey
local dist,nearest=1e10 local pressVirtualkey=pressVirtualkey
for K=1,#VK do local updateVirtualkey=updateVirtualkey
local B=VK[K]
if B.ava then
local d1=(x-B.x)^2+(y-B.y)^2
if d1<B.r^2 then
if d1<dist then
nearest,dist=K,d1
end
end
end
end
return nearest
end
local noTouch,noKey=false,false local noTouch,noKey=false,false
local touchMoveLastFrame=false local touchMoveLastFrame=false
@@ -48,31 +36,7 @@ function scene.touchDown(_,x,y)
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
PLAYERS[1]:pressKey(t) PLAYERS[1]:pressKey(t)
if SETTING.VKSFX>0 then pressVirtualkey(t,x,y)
SFX.play("virtualKey",SETTING.VKSFX)
end
local B=VK[t]
B.isDown=true
B.pressTime=10
if SETTING.VKTrack then
if SETTING.VKDodge then--Button collision (not accurate)
for i=1,#VK do
local b=VK[i]
local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--Hit depth(Neg means distance)
if d>0 then
b.x=b.x+(b.x-B.x)*d*b.r*5e-4
b.y=b.y+(b.y-B.y)*d*b.r*5e-4
end
end
end
local O=VK_org[t]
local _FW,_CW=SETTING.VKTchW,1-SETTING.VKCurW
local _OW=1-_FW-_CW
--Auto follow: finger, current, origin (weight from setting)
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
end
VIB(SETTING.VKVIB)
end end
end end
function scene.touchUp(_,x,y) function scene.touchUp(_,x,y)
@@ -168,14 +132,7 @@ function scene.update(dt)
touchMoveLastFrame=false touchMoveLastFrame=false
--Update virtualkey animation --Update virtualkey animation
if SETTING.VKSwitch then updateVirtualkey()
for i=1,#VK do
_=VK[i]
if _.pressTime>0 then
_.pressTime=_.pressTime-1
end
end
end
--Replay --Replay
if GAME.replaying then if GAME.replaying then
@@ -186,11 +143,10 @@ function scene.update(dt)
if key==0 then--Just wait if key==0 then--Just wait
elseif key<=32 then--Press key elseif key<=32 then--Press key
P1:pressKey(key) P1:pressKey(key)
VK[key].isDown=true pressVirtualkey(key)
VK[key].pressTime=10
elseif key<=64 then--Release key elseif key<=64 then--Release key
VK[key-32].isDown=false
P1:releaseKey(key-32) P1:releaseKey(key-32)
VK[key-32].isDown=false
end end
_=_+2 _=_+2
end end
@@ -284,7 +240,7 @@ function scene.draw()
end end
--Virtual keys --Virtual keys
drawVirtualKeys() drawVirtualkeys()
--Attacking & Being attacked --Attacking & Being attacked
if GAME.modeEnv.royaleMode then if GAME.modeEnv.royaleMode then