2015-09-15 06:09:17 +03:00

145 lines
4.0 KiB
Lua

local c = require("component")
local event = require("event")
local gpu = c.gpu
local xSize, ySize = gpu.getResolution()
local colors = {
whiteKeyColor = 0xffffff,
blackKeyColor = 0x000000,
background = 0x262626,
}
local sizes = {
widthOfWhiteKey = 3,
heightOfWhiteKey = 10,
widthOfBlackKey = 3,
heightOfBlackKey = 5,
doubleKeyBlockConst = 7,
}
sizes.yStartOfKeys = ySize - sizes.heightOfWhiteKey + 1
sizes.xStartOfKeys = 3
sizes.countOfKeysOnScreen = 0
local frequencyMultiplyer
local minFrequency, maxFrequency = 20, 2000
------------------------------------------------------------
--СОЗДАНИЕ ОБЪЕКТОВ
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
local function calculateFrequencyMultiplyer()
local difference = maxFrequency - minFrequency
frequencyMultiplyer = difference / sizes.countOfKeysOnScreen
end
local function drawKeysBlock(x, y, countOfWhite, countOfBlack)
local xPos = x
for i = 1, countOfWhite do
ecs.square(xPos, y, sizes.widthOfWhiteKey, sizes.heightOfWhiteKey, colors.whiteKeyColor)
sizes.countOfKeysOnScreen = sizes.countOfKeysOnScreen + 1
newObj("Keys", sizes.countOfKeysOnScreen, xPos, y + sizes.heightOfBlackKey, xPos + sizes.widthOfWhiteKey - 1, y + sizes.heightOfWhiteKey - 1, true)
xPos = xPos + sizes.widthOfWhiteKey + 1
end
xPos = x + 2
for i = 1, countOfBlack do
ecs.square(xPos, y, sizes.widthOfBlackKey, sizes.heightOfBlackKey, colors.blackKeyColor)
newObj("Keys", sizes.countOfKeysOnScreen + 1, xPos, y, xPos + sizes.widthOfBlackKey - 1, y + sizes.heightOfBlackKey - 1, false)
sizes.countOfKeysOnScreen = sizes.countOfKeysOnScreen + 1
xPos = xPos + sizes.widthOfBlackKey + 1
end
end
local function drawTwoKeysBlock(x, y)
drawKeysBlock(x, y, 3, 2)
end
local function drawThreeKeysBlock(x, y)
drawKeysBlock(x, y, 4, 3)
end
local function drawDoubleKeyBlock(x, y)
sizes.countOfKeysOnScreen = 0
local xPos = x
for i = 1, 3 do
drawTwoKeysBlock(xPos, y)
xPos = xPos + 3 * (sizes.widthOfWhiteKey + 1)
drawThreeKeysBlock(xPos, y)
xPos = xPos + 4 * (sizes.widthOfWhiteKey + 1)
end
drawTwoKeysBlock(xPos, y)
calculateFrequencyMultiplyer()
end
local function setFrequencyToKeys()
calculateFrequencyMultiplyer()
local justBecomeBlack = false
local whiteCounter = 0
local currentWhiteFrequency, currentBlackFrequency = minFrequency, minFrequency + frequencyMultiplyer
for i = 1, #obj["Keys"] do
if obj["Keys"][i][5] then
whiteCounter = whiteCounter + 1
justBecomeBlack = true
currentWhiteFrequency = currentWhiteFrequency + frequencyMultiplyer
obj["Keys"][i][6] = currentWhiteFrequency
else
if justBecomeBlack then currentBlackFrequency = currentWhiteFrequency - frequencyMultiplyer * (whiteCounter - 1); justBecomeBlack = false end
currentBlackFrequency = currentBlackFrequency + frequencyMultiplyer
obj["Keys"][i][6] = currentBlackFrequency
whiteCounter = 0
end
end
end
local function drawAll()
ecs.clearScreen(colors.background)
drawDoubleKeyBlock(sizes.xStartOfKeys, sizes.yStartOfKeys)
end
drawAll()
setFrequencyToKeys()
while true do
local e = {event.pull()}
if e[1] == "touch" then
for key, val in pairs(obj["Keys"]) do
if ecs.clickedAtArea(e[3], e[4], obj["Keys"][key][1], obj["Keys"][key][2], obj["Keys"][key][3], obj["Keys"][key][4]) then
if obj["Keys"][key][5] then
ecs.square(obj["Keys"][key][1], obj["Keys"][key][2], sizes.widthOfWhiteKey, sizes.heightOfWhiteKey - sizes.heightOfBlackKey, ecs.colors.green)
else
ecs.square(obj["Keys"][key][1], obj["Keys"][key][2], sizes.widthOfBlackKey, sizes.heightOfBlackKey, ecs.colors.green)
end
c.computer.beep(obj["Keys"][key][6])
if obj["Keys"][key][5] then
ecs.square(obj["Keys"][key][1], obj["Keys"][key][2], sizes.widthOfWhiteKey, sizes.heightOfWhiteKey - sizes.heightOfBlackKey, colors.whiteKeyColor)
else
ecs.square(obj["Keys"][key][1], obj["Keys"][key][2], sizes.widthOfBlackKey, sizes.heightOfBlackKey, colors.blackKeyColor)
end
break
end
end
end
end