Match Freezer
Этот скрипт останавливает матч когда вам захочется, это даёт преимущества
-- Match Freezer (без V1)
local w = display.contentWidth
local h = display.contentHeight
local gg = display.newGroup()
local men = display.newGroup()
local frozen = false
-- КНОПКА open
local btn = display.newRoundedRect(gg, w - 90, 30, 100, 45, 12)
btn:setFillColor(0.2,0.2,0.25)
btn:setStrokeColor(1,0.5,0,1)
btn.strokeWidth = 2
local btnText = display.newText("open", btn.x, btn.y, native.systemFontBold, 18)
btnText:setFillColor(1,1,1)
gg:insert(btnText)
-- МЕНЮ (чёрный фон, оранжевая обводка)
local panelW = 420
local panelH = 280
local panel = display.newRoundedRect(men, display.contentCenterX, display.contentCenterY, panelW, panelH, 18)
panel:setFillColor(0,0,0,0.96)
panel:setStrokeColor(1,0.5,0,1)
panel.strokeWidth = 2
local title = display.newText("Match Freezer", panel.x, panel.y - panelH/2 + 35, native.systemFontBold, 22)
title:setFillColor(1,0.5,0)
men:insert(title)
local close = display.newText("×", panel.x + panelW/2 - 35, panel.y - panelH/2 + 35, native.systemFontBold, 32)
close:setFillColor(1,0.4,0.4)
men:insert(close)
local lineTop = display.newLine(panel.x - panelW/2 + 20, panel.y - panelH/2 + 55, panel.x + panelW/2 - 20, panel.y - panelH/2 + 55)
lineTop:setStrokeColor(1,0.5,0,0.5)
lineTop.strokeWidth = 1
men:insert(lineTop)
men.isVisible = false
-- ПЕРЕТАСКИВАНИЕ КНОПКИ
local btnDrag = false
local btnStartX, btnStartY
local function onBtnDrag(e)
if e.phase == "began" then
btnDrag = true
btnStartX = e.x - gg.x
btnStartY = e.y - gg.y
elseif e.phase == "moved" and btnDrag then
gg.x = e.x - btnStartX
gg.y = e.y - btnStartY
elseif e.phase == "ended" then
btnDrag = false
end
return true
end
btn:addEventListener("touch", onBtnDrag)
btnText:addEventListener("touch", onBtnDrag)
-- ПЕРЕТАСКИВАНИЕ МЕНЮ
local menuDrag = false
local menuStartX, menuStartY
local function onMenuDrag(e)
if e.phase == "began" then
menuDrag = true
menuStartX = e.x - men.x
menuStartY = e.y - men.y
elseif e.phase == "moved" and menuDrag then
men.x = e.x - menuStartX
men.y = e.y - menuStartY
elseif e.phase == "ended" then
menuDrag = false
end
return true
end
panel:addEventListener("touch", onMenuDrag)
title:addEventListener("touch", onMenuDrag)
local function toggleMenu()
men.isVisible = not men.isVisible
btnText.text = men.isVisible and "close" or "open"
end
btn:addEventListener("tap", toggleMenu)
btnText:addEventListener("tap", toggleMenu)
close:addEventListener("tap", toggleMenu)
-- ============ ФУНКЦИИ ЗАМОРОЗКИ ============
local function findEnemyAndPuck()
local stage = display.getCurrentStage()
if not stage then return nil, nil end
local enemy, puck = nil, nil
local function search(obj)
if not obj then return end
if obj.name == "paddle" and obj.x > display.contentCenterX then
enemy = obj
end
if obj.name == "puck" then
puck = obj
end
if obj.numChildren then
for i = 1, obj.numChildren do
search(obj[i])
end
end
end
search(stage)
return enemy, puck
end
local function freezeMatch()
if frozen then return end
frozen = true
local enemy, puck = findEnemyAndPuck()
if enemy then
enemy._savedBodyType = enemy.bodyType
enemy.bodyType = "static"
if enemy.setLinearVelocity then enemy:setLinearVelocity(0,0) end
end
if puck then
puck._savedBodyType = puck.bodyType
puck.bodyType = "static"
if puck.setLinearVelocity then puck:setLinearVelocity(0,0) end
end
print("[FREEZER] Матч заморожен")
end
local function unfreezeMatch()
if not frozen then return end
frozen = false
local enemy, puck = findEnemyAndPuck()
if enemy then
enemy.bodyType = enemy._savedBodyType or "dynamic"
enemy._savedBodyType = nil
end
if puck then
puck.bodyType = puck._savedBodyType or "dynamic"
puck._savedBodyType = nil
end
print("[FREEZER] Матч разморожен")
end
-- ============ КНОПКИ ПО ЦЕНТРУ ============
local btnW = 130
local btnH = 50
local spacing = 40
local startX = panel.x - (btnW + spacing) / 2
local freezeBtn = display.newRoundedRect(men, startX, panel.y + panelH/2 - 60, btnW, btnH, 10)
freezeBtn:setFillColor(0.8,0.2,0.2)
freezeBtn:setStrokeColor(1,0.5,0,1)
freezeBtn.strokeWidth = 2
local freezeText = display.newText("FREEZE", freezeBtn.x, freezeBtn.y, native.systemFontBold, 18)
freezeText:setFillColor(1,1,1)
men:insert(freezeBtn)
men:insert(freezeText)
local unfreezeBtn = display.newRoundedRect(men, startX + btnW + spacing, panel.y + panelH/2 - 60, btnW, btnH, 10)
unfreezeBtn:setFillColor(0.2,0.6,0.2)
unfreezeBtn:setStrokeColor(1,0.5,0,1)
unfreezeBtn.strokeWidth = 2
local unfreezeText = display.newText("UNFREEZE", unfreezeBtn.x, unfreezeBtn.y, native.systemFontBold, 18)
unfreezeText:setFillColor(1,1,1)
men:insert(unfreezeBtn)
men:insert(unfreezeText)
freezeBtn:addEventListener("tap", freezeMatch)
unfreezeBtn:addEventListener("tap", unfreezeMatch)
-- ============ ПОДДЕРЖАНИЕ ПОСЛЕ ПЕРЕЗАГРУЗКИ ============
local originalPlacePuck = _G.placePuck
if originalPlacePuck then
_G.placePuck = function(side)
local res = originalPlacePuck(side)
if frozen then
timer.performWithDelay(50, function()
local e, p = findEnemyAndPuck()
if e then
e.bodyType = "static"
if e.setLinearVelocity then e:setLinearVelocity(0,0) end
end
if p then
p.bodyType = "static"
if p.setLinearVelocity then p:setLinearVelocity(0,0) end
end
end)
end
return res
end
end
print("=================================")
print("Match Freezer - ЗАГРУЖЕН")
print("FREEZE - остановить противника и шайбу")
print("UNFREEZE - возобновить")
print("Кнопки по центру, меню перетаскивается")
print("=================================")