User prompt
yeni level seçilince top çalışmıyor
User prompt
top bozulmuş çalışmıyor
User prompt
lazer modunda top her tuğlaya çarptıpında yatay bir şekilde lazer çıksın
User prompt
laser modu tam çalışmıyor.
User prompt
portal modun yerine başka bir oyun modu ekle
User prompt
portal oyun modunda portallar çalışmıyor ve çok az var.
User prompt
portal modu stabilize çalışmıyor
User prompt
bazı oyun modlarına girince direkt kazandınız yazıyor , oyun modları çalışmıyor.
User prompt
yeni eklediğimiz oyun modları stabilize çalışmıyor
User prompt
oyun modları düzgün çalışmıyor
User prompt
yeni oyun modları ekle
User prompt
menü tuşlarını menüye göre orantıla
User prompt
remove survival mode
User prompt
level tuşlarını 2x büyült
User prompt
menüde level tuşlarını biraz büyült
User prompt
menü tuşlarını biraz büyült
User prompt
level tuşlarını biraz büyült
User prompt
menü tuşu ekranda menü açıkken tekrar açılmasın
User prompt
menü tuşuna bir kere basınca açılır bir kere daha basınca kapanır şeklinde düzenle
User prompt
menü tuşlarını menüye göre orantıla
User prompt
arka oyun temasını değiştir
User prompt
menüye bir kere basınca açılsın 2. kere basılınca kapansıs
User prompt
menü sürekli açık kalıyor.
User prompt
yeni oyun modları ve temalar ekle
User prompt
level tuşlarının genişliğini düşür
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.speed = 12; // Reduced speed for slower gameplay self.update = function () { self.x += self.velocityX; self.y += self.velocityY; // Wall collision detection if (self.x <= 10 || self.x >= 2038) { self.velocityX = -self.velocityX; self.x = Math.max(10, Math.min(2038, self.x)); LK.getSound('wallHit').play(); } if (self.y <= 10) { self.velocityY = -self.velocityY; self.y = Math.max(10, self.y); LK.getSound('wallHit').play(); } }; return self; }); var Brick = Container.expand(function (brickType) { var self = Container.call(this); var brickAsset = 'brick' + (brickType || 1); var brickGraphics = self.attachAsset(brickAsset, { anchorX: 0.5, anchorY: 0.5 }); self.destroyed = false; self.destroy = function () { if (!self.destroyed) { self.destroyed = true; LK.effects.flashObject(self, 0xffffff, 200); tween(self, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 200, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } } }); LK.getSound('brickHit').play(); LK.setScore(LK.getScore() + 10); // 20% chance to drop a powerup if (Math.random() < 0.2) { var powerupTypes = ['speed', 'expand', 'multiball']; var randomType = powerupTypes[Math.floor(Math.random() * powerupTypes.length)]; var powerup = new PowerUp(randomType); powerup.x = self.x; powerup.y = self.y; powerups.push(powerup); game.addChild(powerup); } return true; } return false; }; return self; }); var MenuButton = Container.expand(function (text, action) { var self = Container.call(this); self.buttonGraphics = self.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); self.buttonText = new Text2(text, { size: 39, fill: 0xffffff }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); self.action = action; self.isHovered = false; self.down = function (x, y, obj) { LK.getSound('menuSelect').play(); if (self.action) { self.action(); } }; self.move = function (x, y, obj) { if (!self.isHovered) { self.isHovered = true; self.removeChild(self.buttonGraphics); self.buttonGraphics = self.attachAsset('menuButtonHover', { anchorX: 0.5, anchorY: 0.5 }); self.addChildAt(self.buttonGraphics, 0); tween(self, { scaleX: 1.1, scaleY: 1.1 }, { duration: 200 }); } }; return self; }); var Paddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.attachAsset('paddle', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'speed'; var colors = { speed: 0xff4444, expand: 0x44ff44, multiball: 0x4444ff }; var powerupGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); powerupGraphics.tint = colors[self.type]; powerupGraphics.width = 30; powerupGraphics.height = 30; self.velocityY = 3; self.collected = false; self.update = function () { self.y += self.velocityY; // Remove if off screen if (self.y > 2800) { if (self.parent) { self.parent.removeChild(self); } } // Check collection by paddle if (!self.collected && self.intersects(paddle)) { self.collected = true; self.applyEffect(); if (self.parent) { self.parent.removeChild(self); } } }; self.applyEffect = function () { switch (self.type) { case 'speed': // Speed powerup now just creates visual effect without changing speed createEdgeGlow(0xff4444); break; case 'expand': tween(paddle, { scaleX: 1.5 }, { duration: 500 }); LK.setTimeout(function () { tween(paddle, { scaleX: 1 }, { duration: 500 }); }, 10000); createEdgeGlow(0x44ff44); break; case 'multiball': // Create two additional balls for (var i = 0; i < 2; i++) { var newBall = game.addChild(new Ball()); newBall.x = ball.x + (i - 0.5) * 50; newBall.y = ball.y; newBall.velocityX = ball.velocityX + (i - 0.5) * 4; newBall.velocityY = ball.velocityY; newBall.speed = ball.speed; extraBalls.push(newBall); } createEdgeGlow(0x4444ff); break; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a0a0a }); /**** * Game Code ****/ var paddle; var ball; var bricks = []; var powerups = []; var extraBalls = []; var gameStarted = false; var dragNode = null; var gameState = 'menu'; // 'menu', 'playing', 'levelSelect' var currentLevel = 1; var gameMode = 'classic'; // 'classic', 'endless', 'timeAttack' var menuContainer; var levelSelectContainer; var highScore = storage.highScore || 0; // Create edge glow effect function createEdgeGlow(color) { // Create glow shapes for each edge var glowShapes = []; // Top edge var topGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 20.5, scaleY: 0.3 }); topGlow.tint = color; topGlow.x = 0; topGlow.y = 0; topGlow.alpha = 0.8; game.addChild(topGlow); glowShapes.push(topGlow); // Bottom edge var bottomGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 20.5, scaleY: 0.3 }); bottomGlow.tint = color; bottomGlow.x = 0; bottomGlow.y = 2720; bottomGlow.alpha = 0.8; game.addChild(bottomGlow); glowShapes.push(bottomGlow); // Left edge var leftGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 0.5, scaleY: 27.3 }); leftGlow.tint = color; leftGlow.x = 0; leftGlow.y = 0; leftGlow.alpha = 0.8; game.addChild(leftGlow); glowShapes.push(leftGlow); // Right edge var rightGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 0.5, scaleY: 27.3 }); rightGlow.tint = color; rightGlow.x = 2038; rightGlow.y = 0; rightGlow.alpha = 0.8; game.addChild(rightGlow); glowShapes.push(rightGlow); // Animate all glow shapes for (var i = 0; i < glowShapes.length; i++) { tween(glowShapes[i], { alpha: 0 }, { duration: 300, onFinish: function () { if (this.parent) { this.parent.removeChild(this); } }.bind(glowShapes[i]) }); } } // Create score display var scoreTxt = new Text2('0', { size: 60, fill: 0x00FFFF }); scoreTxt.setText(LK.getScore()); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create main menu function createMainMenu() { menuContainer = game.addChild(new Container()); // Menu background var menuBg = menuContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.4, scaleY: 1.4 }); menuBg.alpha = 0.9; menuContainer.x = 1024; menuContainer.y = 1366; // Game title var titleText = new Text2('BRICK BREAKER', { size: 67, fill: 0x00ffff }); titleText.anchor.set(0.5, 0.5); titleText.y = -250; menuContainer.addChild(titleText); // High score display var highScoreText = new Text2('High Score: ' + highScore, { size: 34, fill: 0xffff00 }); highScoreText.anchor.set(0.5, 0.5); highScoreText.y = -180; menuContainer.addChild(highScoreText); // Menu buttons var classicButton = menuContainer.addChild(new MenuButton('Classic Mode', function () { gameMode = 'classic'; startClassicGame(); })); classicButton.y = -60; var endlessButton = menuContainer.addChild(new MenuButton('Endless Mode', function () { gameMode = 'endless'; startEndlessGame(); })); endlessButton.y = 10; var timeAttackButton = menuContainer.addChild(new MenuButton('Time Attack', function () { gameMode = 'timeAttack'; startTimeAttackGame(); })); timeAttackButton.y = 80; var levelSelectButton = menuContainer.addChild(new MenuButton('Level Select', function () { showLevelSelect(); })); levelSelectButton.y = 150; // Animate menu entrance menuContainer.alpha = 0; menuContainer.scaleX = 0.5; menuContainer.scaleY = 0.5; tween(menuContainer, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500 }); } function hideMenu() { if (menuContainer) { tween(menuContainer, { alpha: 0, scaleY: 0 }, { duration: 300, onFinish: function onFinish() { if (menuContainer.parent) { menuContainer.parent.removeChild(menuContainer); } menuContainer = null; } }); } } function showLevelSelect() { hideMenu(); levelSelectContainer = game.addChild(new Container()); // Level select background var levelBg = levelSelectContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.2 }); levelBg.alpha = 0.9; levelSelectContainer.x = 1024; levelSelectContainer.y = 1366; // Title var levelTitle = new Text2('SELECT LEVEL', { size: 50, fill: 0x00ffff }); levelTitle.anchor.set(0.5, 0.5); levelTitle.y = -350; levelSelectContainer.addChild(levelTitle); // Level buttons (5x3 grid for 15 levels) for (var i = 1; i <= 15; i++) { var levelButton = levelSelectContainer.addChild(new MenuButton('Level ' + i, function (level) { return function () { currentLevel = level; gameMode = 'level'; startLevelGame(level); }; }(i))); var row = Math.floor((i - 1) / 5); var col = (i - 1) % 5; levelButton.x = (col - 2) * 200; levelButton.y = -180 + row * 140; levelButton.buttonGraphics.scaleX = 0.12; levelButton.buttonGraphics.scaleY = 0.18; levelButton.buttonText.size = 8; } // Back button var backButton = levelSelectContainer.addChild(new MenuButton('Back', function () { hideLevelSelect(); createMainMenu(); })); backButton.y = 350; // Animate entrance levelSelectContainer.alpha = 0; tween(levelSelectContainer, { alpha: 1 }, { duration: 300 }); } function hideLevelSelect() { if (levelSelectContainer) { tween(levelSelectContainer, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { if (levelSelectContainer.parent) { levelSelectContainer.parent.removeChild(levelSelectContainer); } levelSelectContainer = null; } }); } } function startClassicGame() { hideMenu(); gameState = 'playing'; initializeGame(); } function startEndlessGame() { hideMenu(); gameState = 'playing'; initializeGame(); // In endless mode, we'll regenerate bricks when they're all destroyed } function startTimeAttackGame() { hideMenu(); gameState = 'playing'; initializeGame(); // Add timer for time attack mode var timeLeft = 120; // 2 minutes var timeText = new Text2('Time: ' + timeLeft, { size: 30, fill: 0xff0000 }); timeText.anchor.set(1, 0); LK.gui.topRight.addChild(timeText); var timeTimer = LK.setInterval(function () { timeLeft--; timeText.setText('Time: ' + timeLeft); if (timeLeft <= 0) { LK.clearInterval(timeTimer); LK.showGameOver(); } }, 1000); } function startLevelGame(level) { hideLevelSelect(); gameState = 'playing'; initializeGame(); createLevelBricks(level); } function clearLevelElements() { // Remove all existing bricks from screen for (var i = 0; i < bricks.length; i++) { if (bricks[i].parent) { bricks[i].parent.removeChild(bricks[i]); } } // Remove all existing powerups from screen for (var p = 0; p < powerups.length; p++) { if (powerups[p].parent) { powerups[p].parent.removeChild(powerups[p]); } } // Remove all extra balls from screen for (var e = 0; e < extraBalls.length; e++) { if (extraBalls[e].parent) { extraBalls[e].parent.removeChild(extraBalls[e]); } } // Clear GUI elements that might be from previous level var guiChildren = LK.gui.topRight.children.slice(); for (var g = 0; g < guiChildren.length; g++) { if (guiChildren[g] !== scoreTxt) { LK.gui.topRight.removeChild(guiChildren[g]); } } } function initializeGame() { // Clear previous level elements first clearLevelElements(); // Reset game variables bricks = []; powerups = []; extraBalls = []; gameStarted = false; LK.setScore(0); // Create game objects if they don't exist if (!paddle) { paddle = game.addChild(new Paddle()); } if (!ball) { ball = game.addChild(new Ball()); } // Reset positions paddle.x = 1024; paddle.y = 2600; ball.x = 1024; ball.y = 2550; ball.velocityX = 0; ball.velocityY = 0; if (gameMode === 'classic' || gameMode === 'endless' || gameMode === 'timeAttack') { createBricks(); } // Create back to menu button var backToMenuButton = new MenuButton('Menu', function () { gameState = 'menu'; createMainMenu(); }); backToMenuButton.buttonGraphics.scaleX = 0.4; backToMenuButton.buttonGraphics.scaleY = 0.4; backToMenuButton.buttonText.size = 25; backToMenuButton.x = 1800; backToMenuButton.y = 150; game.addChild(backToMenuButton); } function createLevelBricks(level) { // Clear any existing bricks before creating new pattern clearLevelElements(); var patterns = { 1: function _() { createSimplePattern(); }, 2: function _() { createDiamondPattern(); }, 3: function _() { createCheckerPattern(); }, 4: function _() { createWavePattern(); }, 5: function _() { createCirclePattern(); }, 6: function _() { createTrianglePattern(); }, 7: function _() { createCrossPattern(); }, 8: function _() { createSpiralPattern(); }, 9: function _() { createRandomPattern(); }, 10: function _() { createHexagonPattern(); }, 11: function _() { createZigZagPattern(); }, 12: function _() { createHeartPattern(); }, 13: function _() { createMazePattern(); }, 14: function _() { createStarPattern(); }, 15: function _() { createDoubleCirclePattern(); } }; if (patterns[level]) { patterns[level](); } else { createBricks(); } } function createSimplePattern() { var rows = 4; var cols = 10; var brickWidth = 180; var brickHeight = 50; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var startY = 300; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { var brick = new Brick(row % 5 + 1); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createDiamondPattern() { var centerX = 1024; var centerY = 400; var brickWidth = 120; var brickHeight = 45; var diamond = [[0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 2, 2, 2, 2, 2, 0, 0], [0, 3, 3, 3, 3, 3, 3, 3, 0], [4, 4, 4, 4, 4, 4, 4, 4, 4], [0, 5, 5, 5, 5, 5, 5, 5, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 2, 2, 2, 0, 0, 0]]; for (var row = 0; row < diamond.length; row++) { for (var col = 0; col < diamond[row].length; col++) { if (diamond[row][col] > 0) { var brick = new Brick(diamond[row][col]); brick.x = centerX + (col - 4) * brickWidth; brick.y = centerY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createCheckerPattern() { var rows = 8; var cols = 12; var brickWidth = 150; var brickHeight = 40; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var startY = 250; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { if ((row + col) % 2 === 0) { var brick = new Brick((row + col) % 5 + 1); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createWavePattern() { var cols = 15; var brickWidth = 130; var brickHeight = 45; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var baseY = 400; for (var col = 0; col < cols; col++) { var waveHeight = Math.sin(col * 0.5) * 100; var rows = Math.floor(3 + Math.abs(waveHeight / 50)); for (var row = 0; row < rows; row++) { var brick = new Brick(col % 5 + 1); brick.x = startX + col * brickWidth; brick.y = baseY + waveHeight + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createCirclePattern() { var centerX = 1024; var centerY = 500; var radius = 200; var brickCount = 24; for (var i = 0; i < brickCount; i++) { var angle = i / brickCount * Math.PI * 2; var brick = new Brick(i % 5 + 1); brick.x = centerX + Math.cos(angle) * radius; brick.y = centerY + Math.sin(angle) * radius; bricks.push(brick); game.addChild(brick); } } function createTrianglePattern() { var centerX = 1024; var startY = 300; var brickWidth = 120; var brickHeight = 50; for (var row = 0; row < 8; row++) { var bricksInRow = 8 - row; var startX = centerX - bricksInRow * brickWidth / 2 + brickWidth / 2; for (var col = 0; col < bricksInRow; col++) { var brick = new Brick(row % 5 + 1); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createCrossPattern() { var centerX = 1024; var centerY = 450; var brickWidth = 100; var brickHeight = 40; // Horizontal line for (var i = -5; i <= 5; i++) { var brick = new Brick(3); brick.x = centerX + i * brickWidth; brick.y = centerY; bricks.push(brick); game.addChild(brick); } // Vertical line for (var i = -4; i <= 4; i++) { if (i !== 0) { // Don't place on center (already has horizontal brick) var brick = new Brick(5); brick.x = centerX; brick.y = centerY + i * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createSpiralPattern() { var centerX = 1024; var centerY = 450; var spiralPoints = 30; var maxRadius = 250; for (var i = 0; i < spiralPoints; i++) { var angle = i * 0.5; var radius = i / spiralPoints * maxRadius; var brick = new Brick(i % 5 + 1); brick.x = centerX + Math.cos(angle) * radius; brick.y = centerY + Math.sin(angle) * radius; bricks.push(brick); game.addChild(brick); } } function createRandomPattern() { var brickCount = 40; var minX = 200; var maxX = 1848; var minY = 250; var maxY = 800; for (var i = 0; i < brickCount; i++) { var brick = new Brick(Math.floor(Math.random() * 5) + 1); brick.x = minX + Math.random() * (maxX - minX); brick.y = minY + Math.random() * (maxY - minY); bricks.push(brick); game.addChild(brick); } } function createHexagonPattern() { var centerX = 1024; var centerY = 450; var radius = 180; var brickWidth = 100; var brickHeight = 40; // Create hexagon with 6 sides for (var side = 0; side < 6; side++) { var angle = side * Math.PI / 3; var sideLength = 8; for (var i = 0; i < sideLength; i++) { var brick = new Brick(side % 5 + 1); var x = centerX + Math.cos(angle) * radius + Math.cos(angle + Math.PI / 2) * (i - sideLength / 2) * brickWidth / 2; var y = centerY + Math.sin(angle) * radius + Math.sin(angle + Math.PI / 2) * (i - sideLength / 2) * brickHeight / 2; brick.x = x; brick.y = y; bricks.push(brick); game.addChild(brick); } } } function createZigZagPattern() { var cols = 16; var brickWidth = 120; var brickHeight = 45; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var baseY = 300; for (var col = 0; col < cols; col++) { var zigzagOffset = col % 4 * 60 - 90; var rows = 3 + Math.abs(zigzagOffset) / 30; for (var row = 0; row < rows; row++) { var brick = new Brick(col % 5 + 1); brick.x = startX + col * brickWidth; brick.y = baseY + zigzagOffset + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createHeartPattern() { var centerX = 1024; var centerY = 400; var scale = 8; // Heart shape using parametric equations for (var t = 0; t < Math.PI * 2; t += 0.3) { var x = scale * (16 * Math.pow(Math.sin(t), 3)); var y = scale * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)); var brick = new Brick(Math.floor(t * 5 / (Math.PI * 2)) + 1); brick.x = centerX + x; brick.y = centerY - y + 100; // Flip and offset bricks.push(brick); game.addChild(brick); } } function createMazePattern() { var centerX = 1024; var centerY = 400; var brickWidth = 80; var brickHeight = 40; // Create maze-like pattern var mazePattern = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]; for (var row = 0; row < mazePattern.length; row++) { for (var col = 0; col < mazePattern[row].length; col++) { if (mazePattern[row][col] === 1) { var brick = new Brick((row + col) % 5 + 1); brick.x = centerX + (col - 7) * brickWidth; brick.y = centerY + (row - 4) * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createStarPattern() { var centerX = 1024; var centerY = 450; var outerRadius = 200; var innerRadius = 100; var points = 5; // Create 5-pointed star for (var i = 0; i < points * 2; i++) { var angle = i * Math.PI / points; var radius = i % 2 === 0 ? outerRadius : innerRadius; var bricksOnRay = 8; for (var j = 1; j <= bricksOnRay; j++) { var brick = new Brick(i % 5 + 1); brick.x = centerX + Math.cos(angle) * radius * j / bricksOnRay; brick.y = centerY + Math.sin(angle) * radius * j / bricksOnRay; bricks.push(brick); game.addChild(brick); } } } function createDoubleCirclePattern() { var centerX = 1024; var centerY = 450; var innerRadius = 120; var outerRadius = 220; var brickCount = 20; // Inner circle for (var i = 0; i < brickCount; i++) { var angle = i / brickCount * Math.PI * 2; var brick = new Brick(1); brick.x = centerX + Math.cos(angle) * innerRadius; brick.y = centerY + Math.sin(angle) * innerRadius; bricks.push(brick); game.addChild(brick); } // Outer circle for (var i = 0; i < brickCount * 1.5; i++) { var angle = i / (brickCount * 1.5) * Math.PI * 2; var brick = new Brick(3); brick.x = centerX + Math.cos(angle) * outerRadius; brick.y = centerY + Math.sin(angle) * outerRadius; bricks.push(brick); game.addChild(brick); } // Connecting lines for (var i = 0; i < 8; i++) { var angle = i / 8 * Math.PI * 2; for (var j = 1; j < 4; j++) { var radius = innerRadius + (outerRadius - innerRadius) * j / 4; var brick = new Brick(5); brick.x = centerX + Math.cos(angle) * radius; brick.y = centerY + Math.sin(angle) * radius; bricks.push(brick); game.addChild(brick); } } } // Show main menu on game start createMainMenu(); // Create paddle paddle = game.addChild(new Paddle()); paddle.x = 1024; paddle.y = 2600; // Create ball ball = game.addChild(new Ball()); ball.x = 1024; ball.y = 2550; // Initialize ball movement when game starts function startGame() { if (!gameStarted) { gameStarted = true; ball.velocityX = (Math.random() - 0.5) * 10; ball.velocityY = -ball.speed; } } // Create brick pattern function createBricks() { var brickColors = [1, 2, 3, 4, 5]; var rows = 8; var cols = 18; var brickWidth = 110; var brickHeight = 50; var startX = 110; var startY = 200; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { var brick = new Brick(brickColors[row % brickColors.length]); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } createBricks(); // Event handlers game.down = function (x, y, obj) { if (gameState === 'playing') { dragNode = paddle; startGame(); } }; game.move = function (x, y, obj) { if (gameState === 'playing' && dragNode) { dragNode.x = Math.max(100, Math.min(1948, x)); } }; game.up = function (x, y, obj) { if (gameState === 'playing') { dragNode = null; } }; // Main game update loop game.update = function () { // Only update game logic when actually playing if (gameState !== 'playing') { return; } // Update score display scoreTxt.setText(LK.getScore()); // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } // Check if ball fell below paddle if (ball.y > 2750) { LK.showGameOver(); gameState = 'menu'; LK.setTimeout(function () { createMainMenu(); }, 2000); return; } // Ball-paddle collision if (ball.intersects(paddle) && ball.velocityY > 0) { var paddleCenter = paddle.x; var ballRelativePosition = (ball.x - paddleCenter) / 100; ball.velocityY = -Math.abs(ball.velocityY); ball.velocityX = ballRelativePosition * 8; ball.y = paddle.y - 20; LK.getSound('paddleHit').play(); } // Ball-brick collisions for (var i = bricks.length - 1; i >= 0; i--) { var brick = bricks[i]; if (!brick.destroyed && ball.intersects(brick)) { brick.destroy(); bricks.splice(i, 1); // Simple bounce - reverse Y velocity ball.velocityY = -ball.velocityY; break; } } // Update powerups for (var p = powerups.length - 1; p >= 0; p--) { var powerup = powerups[p]; if (powerup.y > 2800 || powerup.collected) { powerups.splice(p, 1); } } // Handle extra balls collisions for (var e = extraBalls.length - 1; e >= 0; e--) { var extraBall = extraBalls[e]; // Remove if fallen below screen if (extraBall.y > 2750) { extraBall.parent.removeChild(extraBall); extraBalls.splice(e, 1); continue; } // Extra ball-paddle collision if (extraBall.intersects(paddle) && extraBall.velocityY > 0) { var paddleCenter = paddle.x; var ballRelativePosition = (extraBall.x - paddleCenter) / 100; extraBall.velocityY = -Math.abs(extraBall.velocityY); extraBall.velocityX = ballRelativePosition * 8; extraBall.y = paddle.y - 20; } // Extra ball-brick collisions for (var i = bricks.length - 1; i >= 0; i--) { var brick = bricks[i]; if (!brick.destroyed && extraBall.intersects(brick)) { brick.destroy(); bricks.splice(i, 1); extraBall.velocityY = -extraBall.velocityY; break; } } } // Check win condition if (bricks.length === 0) { if (gameMode === 'endless') { // In endless mode, create new bricks createBricks(); LK.setScore(LK.getScore() + 500); // Bonus for completing a level } else { LK.showYouWin(); gameState = 'menu'; LK.setTimeout(function () { createMainMenu(); }, 2000); } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 12; // Reduced speed for slower gameplay
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Wall collision detection
if (self.x <= 10 || self.x >= 2038) {
self.velocityX = -self.velocityX;
self.x = Math.max(10, Math.min(2038, self.x));
LK.getSound('wallHit').play();
}
if (self.y <= 10) {
self.velocityY = -self.velocityY;
self.y = Math.max(10, self.y);
LK.getSound('wallHit').play();
}
};
return self;
});
var Brick = Container.expand(function (brickType) {
var self = Container.call(this);
var brickAsset = 'brick' + (brickType || 1);
var brickGraphics = self.attachAsset(brickAsset, {
anchorX: 0.5,
anchorY: 0.5
});
self.destroyed = false;
self.destroy = function () {
if (!self.destroyed) {
self.destroyed = true;
LK.effects.flashObject(self, 0xffffff, 200);
tween(self, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
if (self.parent) {
self.parent.removeChild(self);
}
}
});
LK.getSound('brickHit').play();
LK.setScore(LK.getScore() + 10);
// 20% chance to drop a powerup
if (Math.random() < 0.2) {
var powerupTypes = ['speed', 'expand', 'multiball'];
var randomType = powerupTypes[Math.floor(Math.random() * powerupTypes.length)];
var powerup = new PowerUp(randomType);
powerup.x = self.x;
powerup.y = self.y;
powerups.push(powerup);
game.addChild(powerup);
}
return true;
}
return false;
};
return self;
});
var MenuButton = Container.expand(function (text, action) {
var self = Container.call(this);
self.buttonGraphics = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.buttonText = new Text2(text, {
size: 39,
fill: 0xffffff
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
self.action = action;
self.isHovered = false;
self.down = function (x, y, obj) {
LK.getSound('menuSelect').play();
if (self.action) {
self.action();
}
};
self.move = function (x, y, obj) {
if (!self.isHovered) {
self.isHovered = true;
self.removeChild(self.buttonGraphics);
self.buttonGraphics = self.attachAsset('menuButtonHover', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(self.buttonGraphics, 0);
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200
});
}
};
return self;
});
var Paddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.attachAsset('paddle', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'speed';
var colors = {
speed: 0xff4444,
expand: 0x44ff44,
multiball: 0x4444ff
};
var powerupGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
powerupGraphics.tint = colors[self.type];
powerupGraphics.width = 30;
powerupGraphics.height = 30;
self.velocityY = 3;
self.collected = false;
self.update = function () {
self.y += self.velocityY;
// Remove if off screen
if (self.y > 2800) {
if (self.parent) {
self.parent.removeChild(self);
}
}
// Check collection by paddle
if (!self.collected && self.intersects(paddle)) {
self.collected = true;
self.applyEffect();
if (self.parent) {
self.parent.removeChild(self);
}
}
};
self.applyEffect = function () {
switch (self.type) {
case 'speed':
// Speed powerup now just creates visual effect without changing speed
createEdgeGlow(0xff4444);
break;
case 'expand':
tween(paddle, {
scaleX: 1.5
}, {
duration: 500
});
LK.setTimeout(function () {
tween(paddle, {
scaleX: 1
}, {
duration: 500
});
}, 10000);
createEdgeGlow(0x44ff44);
break;
case 'multiball':
// Create two additional balls
for (var i = 0; i < 2; i++) {
var newBall = game.addChild(new Ball());
newBall.x = ball.x + (i - 0.5) * 50;
newBall.y = ball.y;
newBall.velocityX = ball.velocityX + (i - 0.5) * 4;
newBall.velocityY = ball.velocityY;
newBall.speed = ball.speed;
extraBalls.push(newBall);
}
createEdgeGlow(0x4444ff);
break;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0a0a0a
});
/****
* Game Code
****/
var paddle;
var ball;
var bricks = [];
var powerups = [];
var extraBalls = [];
var gameStarted = false;
var dragNode = null;
var gameState = 'menu'; // 'menu', 'playing', 'levelSelect'
var currentLevel = 1;
var gameMode = 'classic'; // 'classic', 'endless', 'timeAttack'
var menuContainer;
var levelSelectContainer;
var highScore = storage.highScore || 0;
// Create edge glow effect
function createEdgeGlow(color) {
// Create glow shapes for each edge
var glowShapes = [];
// Top edge
var topGlow = LK.getAsset('paddle', {
anchorX: 0,
anchorY: 0,
scaleX: 20.5,
scaleY: 0.3
});
topGlow.tint = color;
topGlow.x = 0;
topGlow.y = 0;
topGlow.alpha = 0.8;
game.addChild(topGlow);
glowShapes.push(topGlow);
// Bottom edge
var bottomGlow = LK.getAsset('paddle', {
anchorX: 0,
anchorY: 0,
scaleX: 20.5,
scaleY: 0.3
});
bottomGlow.tint = color;
bottomGlow.x = 0;
bottomGlow.y = 2720;
bottomGlow.alpha = 0.8;
game.addChild(bottomGlow);
glowShapes.push(bottomGlow);
// Left edge
var leftGlow = LK.getAsset('paddle', {
anchorX: 0,
anchorY: 0,
scaleX: 0.5,
scaleY: 27.3
});
leftGlow.tint = color;
leftGlow.x = 0;
leftGlow.y = 0;
leftGlow.alpha = 0.8;
game.addChild(leftGlow);
glowShapes.push(leftGlow);
// Right edge
var rightGlow = LK.getAsset('paddle', {
anchorX: 0,
anchorY: 0,
scaleX: 0.5,
scaleY: 27.3
});
rightGlow.tint = color;
rightGlow.x = 2038;
rightGlow.y = 0;
rightGlow.alpha = 0.8;
game.addChild(rightGlow);
glowShapes.push(rightGlow);
// Animate all glow shapes
for (var i = 0; i < glowShapes.length; i++) {
tween(glowShapes[i], {
alpha: 0
}, {
duration: 300,
onFinish: function () {
if (this.parent) {
this.parent.removeChild(this);
}
}.bind(glowShapes[i])
});
}
}
// Create score display
var scoreTxt = new Text2('0', {
size: 60,
fill: 0x00FFFF
});
scoreTxt.setText(LK.getScore());
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create main menu
function createMainMenu() {
menuContainer = game.addChild(new Container());
// Menu background
var menuBg = menuContainer.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.4,
scaleY: 1.4
});
menuBg.alpha = 0.9;
menuContainer.x = 1024;
menuContainer.y = 1366;
// Game title
var titleText = new Text2('BRICK BREAKER', {
size: 67,
fill: 0x00ffff
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -250;
menuContainer.addChild(titleText);
// High score display
var highScoreText = new Text2('High Score: ' + highScore, {
size: 34,
fill: 0xffff00
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.y = -180;
menuContainer.addChild(highScoreText);
// Menu buttons
var classicButton = menuContainer.addChild(new MenuButton('Classic Mode', function () {
gameMode = 'classic';
startClassicGame();
}));
classicButton.y = -60;
var endlessButton = menuContainer.addChild(new MenuButton('Endless Mode', function () {
gameMode = 'endless';
startEndlessGame();
}));
endlessButton.y = 10;
var timeAttackButton = menuContainer.addChild(new MenuButton('Time Attack', function () {
gameMode = 'timeAttack';
startTimeAttackGame();
}));
timeAttackButton.y = 80;
var levelSelectButton = menuContainer.addChild(new MenuButton('Level Select', function () {
showLevelSelect();
}));
levelSelectButton.y = 150;
// Animate menu entrance
menuContainer.alpha = 0;
menuContainer.scaleX = 0.5;
menuContainer.scaleY = 0.5;
tween(menuContainer, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 500
});
}
function hideMenu() {
if (menuContainer) {
tween(menuContainer, {
alpha: 0,
scaleY: 0
}, {
duration: 300,
onFinish: function onFinish() {
if (menuContainer.parent) {
menuContainer.parent.removeChild(menuContainer);
}
menuContainer = null;
}
});
}
}
function showLevelSelect() {
hideMenu();
levelSelectContainer = game.addChild(new Container());
// Level select background
var levelBg = levelSelectContainer.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.0,
scaleY: 2.2
});
levelBg.alpha = 0.9;
levelSelectContainer.x = 1024;
levelSelectContainer.y = 1366;
// Title
var levelTitle = new Text2('SELECT LEVEL', {
size: 50,
fill: 0x00ffff
});
levelTitle.anchor.set(0.5, 0.5);
levelTitle.y = -350;
levelSelectContainer.addChild(levelTitle);
// Level buttons (5x3 grid for 15 levels)
for (var i = 1; i <= 15; i++) {
var levelButton = levelSelectContainer.addChild(new MenuButton('Level ' + i, function (level) {
return function () {
currentLevel = level;
gameMode = 'level';
startLevelGame(level);
};
}(i)));
var row = Math.floor((i - 1) / 5);
var col = (i - 1) % 5;
levelButton.x = (col - 2) * 200;
levelButton.y = -180 + row * 140;
levelButton.buttonGraphics.scaleX = 0.12;
levelButton.buttonGraphics.scaleY = 0.18;
levelButton.buttonText.size = 8;
}
// Back button
var backButton = levelSelectContainer.addChild(new MenuButton('Back', function () {
hideLevelSelect();
createMainMenu();
}));
backButton.y = 350;
// Animate entrance
levelSelectContainer.alpha = 0;
tween(levelSelectContainer, {
alpha: 1
}, {
duration: 300
});
}
function hideLevelSelect() {
if (levelSelectContainer) {
tween(levelSelectContainer, {
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
if (levelSelectContainer.parent) {
levelSelectContainer.parent.removeChild(levelSelectContainer);
}
levelSelectContainer = null;
}
});
}
}
function startClassicGame() {
hideMenu();
gameState = 'playing';
initializeGame();
}
function startEndlessGame() {
hideMenu();
gameState = 'playing';
initializeGame();
// In endless mode, we'll regenerate bricks when they're all destroyed
}
function startTimeAttackGame() {
hideMenu();
gameState = 'playing';
initializeGame();
// Add timer for time attack mode
var timeLeft = 120; // 2 minutes
var timeText = new Text2('Time: ' + timeLeft, {
size: 30,
fill: 0xff0000
});
timeText.anchor.set(1, 0);
LK.gui.topRight.addChild(timeText);
var timeTimer = LK.setInterval(function () {
timeLeft--;
timeText.setText('Time: ' + timeLeft);
if (timeLeft <= 0) {
LK.clearInterval(timeTimer);
LK.showGameOver();
}
}, 1000);
}
function startLevelGame(level) {
hideLevelSelect();
gameState = 'playing';
initializeGame();
createLevelBricks(level);
}
function clearLevelElements() {
// Remove all existing bricks from screen
for (var i = 0; i < bricks.length; i++) {
if (bricks[i].parent) {
bricks[i].parent.removeChild(bricks[i]);
}
}
// Remove all existing powerups from screen
for (var p = 0; p < powerups.length; p++) {
if (powerups[p].parent) {
powerups[p].parent.removeChild(powerups[p]);
}
}
// Remove all extra balls from screen
for (var e = 0; e < extraBalls.length; e++) {
if (extraBalls[e].parent) {
extraBalls[e].parent.removeChild(extraBalls[e]);
}
}
// Clear GUI elements that might be from previous level
var guiChildren = LK.gui.topRight.children.slice();
for (var g = 0; g < guiChildren.length; g++) {
if (guiChildren[g] !== scoreTxt) {
LK.gui.topRight.removeChild(guiChildren[g]);
}
}
}
function initializeGame() {
// Clear previous level elements first
clearLevelElements();
// Reset game variables
bricks = [];
powerups = [];
extraBalls = [];
gameStarted = false;
LK.setScore(0);
// Create game objects if they don't exist
if (!paddle) {
paddle = game.addChild(new Paddle());
}
if (!ball) {
ball = game.addChild(new Ball());
}
// Reset positions
paddle.x = 1024;
paddle.y = 2600;
ball.x = 1024;
ball.y = 2550;
ball.velocityX = 0;
ball.velocityY = 0;
if (gameMode === 'classic' || gameMode === 'endless' || gameMode === 'timeAttack') {
createBricks();
}
// Create back to menu button
var backToMenuButton = new MenuButton('Menu', function () {
gameState = 'menu';
createMainMenu();
});
backToMenuButton.buttonGraphics.scaleX = 0.4;
backToMenuButton.buttonGraphics.scaleY = 0.4;
backToMenuButton.buttonText.size = 25;
backToMenuButton.x = 1800;
backToMenuButton.y = 150;
game.addChild(backToMenuButton);
}
function createLevelBricks(level) {
// Clear any existing bricks before creating new pattern
clearLevelElements();
var patterns = {
1: function _() {
createSimplePattern();
},
2: function _() {
createDiamondPattern();
},
3: function _() {
createCheckerPattern();
},
4: function _() {
createWavePattern();
},
5: function _() {
createCirclePattern();
},
6: function _() {
createTrianglePattern();
},
7: function _() {
createCrossPattern();
},
8: function _() {
createSpiralPattern();
},
9: function _() {
createRandomPattern();
},
10: function _() {
createHexagonPattern();
},
11: function _() {
createZigZagPattern();
},
12: function _() {
createHeartPattern();
},
13: function _() {
createMazePattern();
},
14: function _() {
createStarPattern();
},
15: function _() {
createDoubleCirclePattern();
}
};
if (patterns[level]) {
patterns[level]();
} else {
createBricks();
}
}
function createSimplePattern() {
var rows = 4;
var cols = 10;
var brickWidth = 180;
var brickHeight = 50;
var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2;
var startY = 300;
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
var brick = new Brick(row % 5 + 1);
brick.x = startX + col * brickWidth;
brick.y = startY + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createDiamondPattern() {
var centerX = 1024;
var centerY = 400;
var brickWidth = 120;
var brickHeight = 45;
var diamond = [[0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 2, 2, 2, 2, 2, 0, 0], [0, 3, 3, 3, 3, 3, 3, 3, 0], [4, 4, 4, 4, 4, 4, 4, 4, 4], [0, 5, 5, 5, 5, 5, 5, 5, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 2, 2, 2, 0, 0, 0]];
for (var row = 0; row < diamond.length; row++) {
for (var col = 0; col < diamond[row].length; col++) {
if (diamond[row][col] > 0) {
var brick = new Brick(diamond[row][col]);
brick.x = centerX + (col - 4) * brickWidth;
brick.y = centerY + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
}
function createCheckerPattern() {
var rows = 8;
var cols = 12;
var brickWidth = 150;
var brickHeight = 40;
var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2;
var startY = 250;
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
if ((row + col) % 2 === 0) {
var brick = new Brick((row + col) % 5 + 1);
brick.x = startX + col * brickWidth;
brick.y = startY + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
}
function createWavePattern() {
var cols = 15;
var brickWidth = 130;
var brickHeight = 45;
var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2;
var baseY = 400;
for (var col = 0; col < cols; col++) {
var waveHeight = Math.sin(col * 0.5) * 100;
var rows = Math.floor(3 + Math.abs(waveHeight / 50));
for (var row = 0; row < rows; row++) {
var brick = new Brick(col % 5 + 1);
brick.x = startX + col * brickWidth;
brick.y = baseY + waveHeight + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createCirclePattern() {
var centerX = 1024;
var centerY = 500;
var radius = 200;
var brickCount = 24;
for (var i = 0; i < brickCount; i++) {
var angle = i / brickCount * Math.PI * 2;
var brick = new Brick(i % 5 + 1);
brick.x = centerX + Math.cos(angle) * radius;
brick.y = centerY + Math.sin(angle) * radius;
bricks.push(brick);
game.addChild(brick);
}
}
function createTrianglePattern() {
var centerX = 1024;
var startY = 300;
var brickWidth = 120;
var brickHeight = 50;
for (var row = 0; row < 8; row++) {
var bricksInRow = 8 - row;
var startX = centerX - bricksInRow * brickWidth / 2 + brickWidth / 2;
for (var col = 0; col < bricksInRow; col++) {
var brick = new Brick(row % 5 + 1);
brick.x = startX + col * brickWidth;
brick.y = startY + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createCrossPattern() {
var centerX = 1024;
var centerY = 450;
var brickWidth = 100;
var brickHeight = 40;
// Horizontal line
for (var i = -5; i <= 5; i++) {
var brick = new Brick(3);
brick.x = centerX + i * brickWidth;
brick.y = centerY;
bricks.push(brick);
game.addChild(brick);
}
// Vertical line
for (var i = -4; i <= 4; i++) {
if (i !== 0) {
// Don't place on center (already has horizontal brick)
var brick = new Brick(5);
brick.x = centerX;
brick.y = centerY + i * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createSpiralPattern() {
var centerX = 1024;
var centerY = 450;
var spiralPoints = 30;
var maxRadius = 250;
for (var i = 0; i < spiralPoints; i++) {
var angle = i * 0.5;
var radius = i / spiralPoints * maxRadius;
var brick = new Brick(i % 5 + 1);
brick.x = centerX + Math.cos(angle) * radius;
brick.y = centerY + Math.sin(angle) * radius;
bricks.push(brick);
game.addChild(brick);
}
}
function createRandomPattern() {
var brickCount = 40;
var minX = 200;
var maxX = 1848;
var minY = 250;
var maxY = 800;
for (var i = 0; i < brickCount; i++) {
var brick = new Brick(Math.floor(Math.random() * 5) + 1);
brick.x = minX + Math.random() * (maxX - minX);
brick.y = minY + Math.random() * (maxY - minY);
bricks.push(brick);
game.addChild(brick);
}
}
function createHexagonPattern() {
var centerX = 1024;
var centerY = 450;
var radius = 180;
var brickWidth = 100;
var brickHeight = 40;
// Create hexagon with 6 sides
for (var side = 0; side < 6; side++) {
var angle = side * Math.PI / 3;
var sideLength = 8;
for (var i = 0; i < sideLength; i++) {
var brick = new Brick(side % 5 + 1);
var x = centerX + Math.cos(angle) * radius + Math.cos(angle + Math.PI / 2) * (i - sideLength / 2) * brickWidth / 2;
var y = centerY + Math.sin(angle) * radius + Math.sin(angle + Math.PI / 2) * (i - sideLength / 2) * brickHeight / 2;
brick.x = x;
brick.y = y;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createZigZagPattern() {
var cols = 16;
var brickWidth = 120;
var brickHeight = 45;
var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2;
var baseY = 300;
for (var col = 0; col < cols; col++) {
var zigzagOffset = col % 4 * 60 - 90;
var rows = 3 + Math.abs(zigzagOffset) / 30;
for (var row = 0; row < rows; row++) {
var brick = new Brick(col % 5 + 1);
brick.x = startX + col * brickWidth;
brick.y = baseY + zigzagOffset + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createHeartPattern() {
var centerX = 1024;
var centerY = 400;
var scale = 8;
// Heart shape using parametric equations
for (var t = 0; t < Math.PI * 2; t += 0.3) {
var x = scale * (16 * Math.pow(Math.sin(t), 3));
var y = scale * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t));
var brick = new Brick(Math.floor(t * 5 / (Math.PI * 2)) + 1);
brick.x = centerX + x;
brick.y = centerY - y + 100; // Flip and offset
bricks.push(brick);
game.addChild(brick);
}
}
function createMazePattern() {
var centerX = 1024;
var centerY = 400;
var brickWidth = 80;
var brickHeight = 40;
// Create maze-like pattern
var mazePattern = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]];
for (var row = 0; row < mazePattern.length; row++) {
for (var col = 0; col < mazePattern[row].length; col++) {
if (mazePattern[row][col] === 1) {
var brick = new Brick((row + col) % 5 + 1);
brick.x = centerX + (col - 7) * brickWidth;
brick.y = centerY + (row - 4) * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
}
function createStarPattern() {
var centerX = 1024;
var centerY = 450;
var outerRadius = 200;
var innerRadius = 100;
var points = 5;
// Create 5-pointed star
for (var i = 0; i < points * 2; i++) {
var angle = i * Math.PI / points;
var radius = i % 2 === 0 ? outerRadius : innerRadius;
var bricksOnRay = 8;
for (var j = 1; j <= bricksOnRay; j++) {
var brick = new Brick(i % 5 + 1);
brick.x = centerX + Math.cos(angle) * radius * j / bricksOnRay;
brick.y = centerY + Math.sin(angle) * radius * j / bricksOnRay;
bricks.push(brick);
game.addChild(brick);
}
}
}
function createDoubleCirclePattern() {
var centerX = 1024;
var centerY = 450;
var innerRadius = 120;
var outerRadius = 220;
var brickCount = 20;
// Inner circle
for (var i = 0; i < brickCount; i++) {
var angle = i / brickCount * Math.PI * 2;
var brick = new Brick(1);
brick.x = centerX + Math.cos(angle) * innerRadius;
brick.y = centerY + Math.sin(angle) * innerRadius;
bricks.push(brick);
game.addChild(brick);
}
// Outer circle
for (var i = 0; i < brickCount * 1.5; i++) {
var angle = i / (brickCount * 1.5) * Math.PI * 2;
var brick = new Brick(3);
brick.x = centerX + Math.cos(angle) * outerRadius;
brick.y = centerY + Math.sin(angle) * outerRadius;
bricks.push(brick);
game.addChild(brick);
}
// Connecting lines
for (var i = 0; i < 8; i++) {
var angle = i / 8 * Math.PI * 2;
for (var j = 1; j < 4; j++) {
var radius = innerRadius + (outerRadius - innerRadius) * j / 4;
var brick = new Brick(5);
brick.x = centerX + Math.cos(angle) * radius;
brick.y = centerY + Math.sin(angle) * radius;
bricks.push(brick);
game.addChild(brick);
}
}
}
// Show main menu on game start
createMainMenu();
// Create paddle
paddle = game.addChild(new Paddle());
paddle.x = 1024;
paddle.y = 2600;
// Create ball
ball = game.addChild(new Ball());
ball.x = 1024;
ball.y = 2550;
// Initialize ball movement when game starts
function startGame() {
if (!gameStarted) {
gameStarted = true;
ball.velocityX = (Math.random() - 0.5) * 10;
ball.velocityY = -ball.speed;
}
}
// Create brick pattern
function createBricks() {
var brickColors = [1, 2, 3, 4, 5];
var rows = 8;
var cols = 18;
var brickWidth = 110;
var brickHeight = 50;
var startX = 110;
var startY = 200;
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
var brick = new Brick(brickColors[row % brickColors.length]);
brick.x = startX + col * brickWidth;
brick.y = startY + row * brickHeight;
bricks.push(brick);
game.addChild(brick);
}
}
}
createBricks();
// Event handlers
game.down = function (x, y, obj) {
if (gameState === 'playing') {
dragNode = paddle;
startGame();
}
};
game.move = function (x, y, obj) {
if (gameState === 'playing' && dragNode) {
dragNode.x = Math.max(100, Math.min(1948, x));
}
};
game.up = function (x, y, obj) {
if (gameState === 'playing') {
dragNode = null;
}
};
// Main game update loop
game.update = function () {
// Only update game logic when actually playing
if (gameState !== 'playing') {
return;
}
// Update score display
scoreTxt.setText(LK.getScore());
// Update high score
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
// Check if ball fell below paddle
if (ball.y > 2750) {
LK.showGameOver();
gameState = 'menu';
LK.setTimeout(function () {
createMainMenu();
}, 2000);
return;
}
// Ball-paddle collision
if (ball.intersects(paddle) && ball.velocityY > 0) {
var paddleCenter = paddle.x;
var ballRelativePosition = (ball.x - paddleCenter) / 100;
ball.velocityY = -Math.abs(ball.velocityY);
ball.velocityX = ballRelativePosition * 8;
ball.y = paddle.y - 20;
LK.getSound('paddleHit').play();
}
// Ball-brick collisions
for (var i = bricks.length - 1; i >= 0; i--) {
var brick = bricks[i];
if (!brick.destroyed && ball.intersects(brick)) {
brick.destroy();
bricks.splice(i, 1);
// Simple bounce - reverse Y velocity
ball.velocityY = -ball.velocityY;
break;
}
}
// Update powerups
for (var p = powerups.length - 1; p >= 0; p--) {
var powerup = powerups[p];
if (powerup.y > 2800 || powerup.collected) {
powerups.splice(p, 1);
}
}
// Handle extra balls collisions
for (var e = extraBalls.length - 1; e >= 0; e--) {
var extraBall = extraBalls[e];
// Remove if fallen below screen
if (extraBall.y > 2750) {
extraBall.parent.removeChild(extraBall);
extraBalls.splice(e, 1);
continue;
}
// Extra ball-paddle collision
if (extraBall.intersects(paddle) && extraBall.velocityY > 0) {
var paddleCenter = paddle.x;
var ballRelativePosition = (extraBall.x - paddleCenter) / 100;
extraBall.velocityY = -Math.abs(extraBall.velocityY);
extraBall.velocityX = ballRelativePosition * 8;
extraBall.y = paddle.y - 20;
}
// Extra ball-brick collisions
for (var i = bricks.length - 1; i >= 0; i--) {
var brick = bricks[i];
if (!brick.destroyed && extraBall.intersects(brick)) {
brick.destroy();
bricks.splice(i, 1);
extraBall.velocityY = -extraBall.velocityY;
break;
}
}
}
// Check win condition
if (bricks.length === 0) {
if (gameMode === 'endless') {
// In endless mode, create new bricks
createBricks();
LK.setScore(LK.getScore() + 500); // Bonus for completing a level
} else {
LK.showYouWin();
gameState = 'menu';
LK.setTimeout(function () {
createMainMenu();
}, 2000);
}
}
};