-- 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("=================================")