mgba/res/scripts/input-display.lua

123 lines
2.3 KiB
Lua

input_display = {
anchor = "top",
offset = {
x = 0,
y = 0,
}
}
local state = {
drawButton = {
[0] = function(state) -- A
state.painter:drawCircle(27, 6, 4)
end,
[1] = function(state) -- B
state.painter:drawCircle(23, 8, 4)
end,
[2] = function(state) -- Select
state.painter:drawCircle(13, 11, 3)
end,
[3] = function(state) -- Start
state.painter:drawCircle(18, 11, 3)
end,
[4] = function(state) -- Right
state.painter:drawRectangle(9, 7, 4, 3)
end,
[5] = function(state) -- Left
state.painter:drawRectangle(2, 7, 4, 3)
end,
[6] = function(state) -- Up
state.painter:drawRectangle(6, 3, 3, 4)
end,
[7] = function(state) -- Down
state.painter:drawRectangle(6, 10, 3, 4)
end,
[8] = function(state) -- R
state.painter:drawRectangle(28, 0, 4, 3)
end,
[9] = function(state) -- L
state.painter:drawRectangle(0, 0, 4, 3)
end
},
maxKey = {
[C.PLATFORM.GBA] = 9,
[C.PLATFORM.GB] = 7,
}
}
state.overlay = canvas:newLayer(32, 16)
state.painter = image.newPainter(state.overlay.image)
state.painter:setBlend(false)
state.painter:setFill(true)
function state.update()
local keys = util.expandBitmask(emu:getKeys())
local maxKey = state.maxKey[emu:platform()]
for key = 0, maxKey do
if emu:getKey(key) ~= 0 then
state.painter:setFillColor(0x80FFFFFF)
else
state.painter:setFillColor(0x40404040)
end
state.drawButton[key](state)
end
state.overlay:update()
end
function state.reset()
local endX = canvas:screenWidth() - 32
local endY = canvas:screenHeight() - 16
local anchors = {
topLeft = {
x = 0,
y = 0
},
top = {
x = endX / 2,
y = 0
},
topRight = {
x = endX,
y = 0
},
left = {
x = 0,
y = endY / 2
},
center = {
x = endX / 2,
y = endY / 2
},
right = {
x = endX,
y = endY / 2
},
bottomLeft = {
x = 0,
y = endY
},
bottom = {
x = endX / 2,
y = endY
},
bottomRight = {
x = endX,
y = endY
},
}
local pos = anchors[input_display.anchor];
pos.x = pos.x + input_display.offset.x;
pos.y = pos.y + input_display.offset.y;
state.overlay:setPosition(pos.x, pos.y);
state.painter:setFillColor(0x40808080)
state.painter:drawRectangle(0, 0, 32, 16)
state.overlay:update()
end
state.reset()
callbacks:add("frame", state.update)
callbacks:add("start", state.reset)