Files
Techmino/parts/scenes/app_calc.lua
2024-07-01 22:51:14 +08:00

172 lines
5.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local gc=love.graphics
local kb=love.keyboard
local keySounds={
['1']='C5',['2']='D5',['3']='E5',
['4']='F5',['5']='G5',['6']='A5',
['7']='B5',['8']='C6',['9']='D6',
['0']='E6',['.']='F6',['e']='G6',
['+']='C#5',['-']='D#5',['*']='F#5',['/']='G#5',
['backspace']='A#5',['return']='C#6',
}
local scene={}
local reg-- register
local val-- result value
local sym-- symbol
local function _autoReturn()
if reg and sym then
scene.keyDown('calculate')
else
reg=false
end
end
function scene.enter()
BG.set('none')
BGM.stop()
reg,val,sym=false,"0",false
end
function scene.leave()
BGM.play()
end
scene.mouseDown=NULL
function scene.keyDown(key)
if kb.isDown('lshift','rshift') then
if key=='=' then
scene.keyDown('+')
return
elseif kb.isDown('lshift','rshift') and key=='8' then
scene.keyDown('*')
return
end
elseif key:sub(1,2)=='kp' then
scene.keyDown(key:sub(3))
return
end
if keySounds[key] then
Snd('bell',keySounds[key])
end
if key=='.' then
if sym=="=" then
sym,reg=false,false
val="0."
elseif not (val:find(".",nil,true) or val:find("e")) then
if sym and not reg then
reg=val
val="0."
else
val=val.."."
end
end
elseif key=='e' then
if sym=="=" then
sym,reg=false
val="0e"
elseif not val:find("e") then
val=val.."e"
end
elseif key=='backspace' then
if sym=="=" then
val=""
elseif sym then
sym=false
else
val=val:sub(1,-2)
end
if val=="" then
val="0"
end
elseif key=='+' then
_autoReturn()
sym="+"
elseif key=='*' then
_autoReturn()
sym="×"
elseif key=='-' then
_autoReturn()
sym=""
elseif key=='/' then
_autoReturn()
sym="÷"
elseif key:byte()>=48 and key:byte()<=57 then
if sym=="=" then
val=key
sym=false
elseif sym and not reg then
reg=val
val=key
else
if #val<14 then
if val=="0" then
val=""
end
val=val..key
end
end
elseif key=='return' or key=='kpenter' then
scene.keyDown('calculate')
elseif key=='calculate' then
val=val:gsub("e$","")
if sym and reg then
reg=reg:gsub("e$","")
val=
sym=="+" and tostring((tonumber(reg) or 0)+tonumber(val)) or
sym=="" and tostring((tonumber(reg) or 0)-tonumber(val)) or
sym=="×" and tostring((tonumber(reg) or 0)*tonumber(val)) or
sym=="÷" and tostring((tonumber(reg) or 0)/tonumber(val)) or
"-1"
end
sym="="
reg=false
elseif key=='escape' then
if val~="0" then
reg,sym=false,false
val="0"
else
SCN.back()
end
elseif key=='delete' then
val="0"
end
end
function scene.draw()
gc.setColor(COLOR.dX)
gc.rectangle('fill',100,80,650,150,5)
gc.setColor(COLOR.Z)
gc.setLineWidth(2)
gc.rectangle('line',100,80,650,150,5)
FONT.set(45)
if reg then gc.printf(reg,0,100,720,'right') end
if val then gc.printf(val,0,150,720,'right') end
if sym then FONT.set(50)gc.print(sym,126,150) end
end
scene.widgetList={
WIDGET.newKey{name='_1',x=145,y=300,w=90,sound=false,fText="1",font=50,code=pressKey'1'},
WIDGET.newKey{name='_2',x=245,y=300,w=90,sound=false,fText="2",font=50,code=pressKey'2'},
WIDGET.newKey{name='_3',x=345,y=300,w=90,sound=false,fText="3",font=50,code=pressKey'3'},
WIDGET.newKey{name='_4',x=145,y=400,w=90,sound=false,fText="4",font=50,code=pressKey'4'},
WIDGET.newKey{name='_5',x=245,y=400,w=90,sound=false,fText="5",font=50,code=pressKey'5'},
WIDGET.newKey{name='_6',x=345,y=400,w=90,sound=false,fText="6",font=50,code=pressKey'6'},
WIDGET.newKey{name='_7',x=145,y=500,w=90,sound=false,fText="7",font=50,code=pressKey'7'},
WIDGET.newKey{name='_8',x=245,y=500,w=90,sound=false,fText="8",font=50,code=pressKey'8'},
WIDGET.newKey{name='_9',x=345,y=500,w=90,sound=false,fText="9",font=50,code=pressKey'9'},
WIDGET.newKey{name='_0',x=145,y=600,w=90,sound=false,fText="0",font=50,code=pressKey'0'},
WIDGET.newKey{name='.',x=245,y=600,w=90,sound=false,fText=".",color='lM',font=50,code=pressKey'.'},
WIDGET.newKey{name='e',x=345,y=600,w=90,sound=false,fText="EE",color='lM',font=50,code=pressKey'e'},
WIDGET.newKey{name='+',x=445,y=300,w=90,sound=false,fText="+",color='lB',font=50,code=pressKey'+'},
WIDGET.newKey{name='-',x=445,y=400,w=90,sound=false,fText="",color='lB',font=50,code=pressKey'-'},
WIDGET.newKey{name='*',x=445,y=500,w=90,sound=false,fText="×",color='lB',font=50,code=pressKey'*'},
WIDGET.newKey{name='/',x=445,y=600,w=90,sound=false,fText="÷",color='lB',font=50,code=pressKey'/'},
WIDGET.newKey{name='<',x=545,y=300,w=90,sound=false,fText=CHAR.key.backspace,color='lR',font=50,code=pressKey'backspace'},
WIDGET.newKey{name='=',x=545,y=400,w=90,sound=false,fText="=",color='lY',font=50,code=pressKey'return'},
WIDGET.newKey{name='back',x=1135,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
}
return scene