User prompt
oyunu sonsuz seviye yapmalısın her seviyede daha da zorlaşmalı ve farklı biçimlerde şekillerde çıkmalı tuğlalar
Code edit (1 edits merged)
Please save this source code
User prompt
Color Bounce Frenzy
User prompt
Game Flow bu kısmı çoğalt fazla olsun
Initial prompt
seviyeli bir görev üzerine dayalı basit ama güzel bir oyun yap
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Ball class var Ball = Container.expand(function () { var self = Container.call(this); var ballSprite = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); self.radius = ballSprite.width / 2; self.vx = 0; self.vy = 0; self.speed = 22; // Initial speed self.sticky = false; // If true, ball sticks to paddle self.launch = function (angle) { // Launch ball at angle (in radians) self.vx = Math.cos(angle) * self.speed; self.vy = Math.sin(angle) * self.speed; self.sticky = false; }; self.update = function () { if (!self.sticky) { self.x += self.vx; self.y += self.vy; } }; return self; }); // Block class var Block = Container.expand(function () { var self = Container.call(this); // color: 'red', 'green', 'blue', 'yellow' self.color = 'red'; self.hp = 1; self.setColor = function (color) { self.color = color; if (self.blockSprite) self.removeChild(self.blockSprite); var assetId = 'block_' + color; self.blockSprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; self.breakBlock = function () { // Animate block breaking tween(self, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); // Paddle class var Paddle = Container.expand(function () { var self = Container.call(this); var paddleSprite = self.attachAsset('paddle', { anchorX: 0.5, anchorY: 0.5 }); self.width = paddleSprite.width; self.height = paddleSprite.height; self.moveTo = function (x) { // Clamp paddle within game bounds (leave 40px margin) var minX = self.width / 2 + 40; var maxX = 2048 - self.width / 2 - 40; self.x = Math.max(minX, Math.min(maxX, x)); }; return self; }); // PowerUp class var PowerUp = Container.expand(function () { var self = Container.call(this); var powerSprite = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'expand'; // 'expand', 'shrink', 'life', 'sticky' self.vy = 10; self.update = function () { self.y += self.vy; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181c2c }); /**** * Game Code ****/ // Sounds // Power-up // Block colors // Paddle // Ball // Game variables var paddle, ball, blocks = [], powerups = []; var lives = 3; var level = 1; var isBallLaunched = false; var dragPaddle = false; var score = 0; var combo = 0; var comboTimer = null; var lastTouchX = 0; var ballStickyToPaddle = true; var levelCleared = false; // GUI var scoreTxt = new Text2('0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var livesTxt = new Text2('♥♥♥', { size: 80, fill: 0xFF5E5E }); livesTxt.anchor.set(1, 0); LK.gui.topRight.addChild(livesTxt); var levelTxt = new Text2('Level 1', { size: 70, fill: 0xFFE066 }); levelTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(levelTxt); // Helper: update GUI function updateGUI() { scoreTxt.setText(score); var hearts = ''; for (var i = 0; i < lives; i++) hearts += '♥'; livesTxt.setText(hearts); levelTxt.setText('Level ' + level); } // Helper: reset combo function resetCombo() { combo = 0; if (comboTimer) { LK.clearTimeout(comboTimer); comboTimer = null; } } // Helper: start combo timer function startCombo() { if (comboTimer) LK.clearTimeout(comboTimer); comboTimer = LK.setTimeout(function () { resetCombo(); }, 1200); } // Helper: spawn blocks for current level function spawnBlocks() { // Remove old blocks for (var i = 0; i < blocks.length; i++) { blocks[i].destroy(); } blocks = []; // Dynamic block pattern logic var blockW = 200, blockH = 80; var marginX = 40, marginY = 40; var colors = ['red', 'green', 'blue', 'yellow']; // Increase rows and columns as level increases, up to a max var rows = Math.min(3 + Math.floor(level / 2), 10); var cols = Math.min(5 + Math.floor(level / 3), 12); // For variety, pick a pattern type based on level var patternType = level % 5; // 0: full, 1: checker, 2: pyramid, 3: gaps, 4: zigzag var totalW = cols * blockW + (cols - 1) * marginX; var startX = (2048 - totalW) / 2 + blockW / 2; var startY = 300; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { var placeBlock = true; // Pattern logic if (patternType === 1) { // checker if ((r + c) % 2 !== 0) placeBlock = false; } else if (patternType === 2) { // pyramid var mid = Math.floor(cols / 2); if (c < mid - r || c > mid + r) placeBlock = false; } else if (patternType === 3) { // random gaps if (Math.abs((r * cols + c + level) % 7) === 0) placeBlock = false; } else if (patternType === 4) { // zigzag if (r % 2 === 0 && c % 3 === 0 || r % 2 === 1 && c % 3 === 2) placeBlock = false; } // patternType 0: full grid if (placeBlock) { var block = new Block(); var color = colors[(r + c + level) % colors.length]; block.setColor(color); block.x = startX + c * (blockW + marginX); block.y = startY + r * (blockH + marginY); // Increase block HP as level increases block.hp = 1 + Math.floor(level / 4) + Math.floor(r / 3); game.addChild(block); blocks.push(block); } } } } // Helper: spawn paddle function spawnPaddle() { if (paddle) paddle.destroy(); paddle = new Paddle(); paddle.x = 2048 / 2; paddle.y = 2732 - 180; game.addChild(paddle); } // Helper: spawn ball function spawnBall() { if (ball) ball.destroy(); ball = new Ball(); ball.x = paddle.x; ball.y = paddle.y - paddle.height / 2 - ball.radius - 10; ball.vx = 0; ball.vy = 0; ball.sticky = true; ballStickyToPaddle = true; isBallLaunched = false; game.addChild(ball); } // Helper: spawn powerup function spawnPowerUp(x, y) { var power = new PowerUp(); var types = ['expand', 'shrink', 'life', 'sticky']; power.type = types[Math.floor(Math.random() * types.length)]; power.x = x; power.y = y; game.addChild(power); powerups.push(power); } // Helper: next level function nextLevel() { level++; updateGUI(); spawnBlocks(); spawnPaddle(); spawnBall(); levelCleared = false; } // Endless: Remove win condition, always go to nextLevel // Helper: lose life function loseLife() { lives--; updateGUI(); LK.getSound('lose').play(); if (lives <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } spawnPaddle(); spawnBall(); } // Helper: win function winGame() { LK.effects.flashScreen(0x00ff00, 1000); LK.showYouWin(); } // Initialize first level spawnBlocks(); spawnPaddle(); spawnBall(); updateGUI(); // Touch controls game.down = function (x, y, obj) { // Only allow paddle drag if touch is near paddle if (Math.abs(y - paddle.y) < paddle.height * 2) { dragPaddle = true; lastTouchX = x; } // Launch ball if it's sticky if (ballStickyToPaddle && dragPaddle) { // Launch at slight upward angle based on touch position var rel = (x - paddle.x) / (paddle.width / 2); var angle = -Math.PI / 3 + rel * (Math.PI / 3); // -60deg to 60deg ball.launch(angle); isBallLaunched = true; ballStickyToPaddle = false; } }; game.move = function (x, y, obj) { if (dragPaddle) { paddle.moveTo(x); // If ball is sticky, move it with paddle if (ballStickyToPaddle) { ball.x = paddle.x; } } }; game.up = function (x, y, obj) { dragPaddle = false; }; // Main update loop game.update = function () { // Ball update if (ball) ball.update(); // PowerUp update for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; p.update(); // If off screen if (p.y > 2732 + 100) { p.destroy(); powerups.splice(i, 1); continue; } // Paddle collision if (p.intersects(paddle)) { // Apply powerup LK.getSound('powerup').play(); if (p.type === 'expand') { tween(paddle, { scaleX: 1.5 }, { duration: 300, easing: tween.easeOut }); LK.setTimeout(function () { tween(paddle, { scaleX: 1 }, { duration: 300, easing: tween.easeIn }); }, 6000); } else if (p.type === 'shrink') { tween(paddle, { scaleX: 0.7 }, { duration: 300, easing: tween.easeOut }); LK.setTimeout(function () { tween(paddle, { scaleX: 1 }, { duration: 300, easing: tween.easeIn }); }, 6000); } else if (p.type === 'life') { lives = Math.min(5, lives + 1); updateGUI(); } else if (p.type === 'sticky') { ball.sticky = true; ballStickyToPaddle = true; ball.vx = 0; ball.vy = 0; ball.x = paddle.x; ball.y = paddle.y - paddle.height / 2 - ball.radius - 10; } p.destroy(); powerups.splice(i, 1); } } // Ball physics if (ball && !ball.sticky) { // Wall collisions if (ball.x - ball.radius < 0) { ball.x = ball.radius; ball.vx = -ball.vx; LK.getSound('hit').play(); } if (ball.x + ball.radius > 2048) { ball.x = 2048 - ball.radius; ball.vx = -ball.vx; LK.getSound('hit').play(); } if (ball.y - ball.radius < 0) { ball.y = ball.radius; ball.vy = -ball.vy; LK.getSound('hit').play(); } // Paddle collision if (ball.y + ball.radius >= paddle.y - paddle.height / 2 && ball.y + ball.radius <= paddle.y + paddle.height / 2 && ball.x >= paddle.x - paddle.width / 2 * paddle.scaleX && ball.x <= paddle.x + paddle.width / 2 * paddle.scaleX && ball.vy > 0) { // Reflect ball, angle based on where it hit the paddle var rel = (ball.x - paddle.x) / (paddle.width / 2 * paddle.scaleX); var angle = -Math.PI / 3 + rel * (Math.PI / 3); // -60deg to 60deg var speed = Math.sqrt(ball.vx * ball.vx + ball.vy * ball.vy); ball.vx = Math.cos(angle) * speed; ball.vy = Math.sin(angle) * speed; ball.y = paddle.y - paddle.height / 2 - ball.radius - 2; LK.getSound('hit').play(); } // Bottom out if (ball.y - ball.radius > 2732) { loseLife(); return; } } // Block collisions for (var i = blocks.length - 1; i >= 0; i--) { var block = blocks[i]; if (ball && block && ball.intersects(block)) { // Reflect ball var overlapX = Math.abs(ball.x - block.x) - (block.blockSprite.width / 2 + ball.radius); var overlapY = Math.abs(ball.y - block.y) - (block.blockSprite.height / 2 + ball.radius); if (overlapX > overlapY) { ball.vx = -ball.vx; } else { ball.vy = -ball.vy; } // Block hit block.hp--; combo++; startCombo(); score += 10 * combo; updateGUI(); LK.getSound('break').play(); // Power-up chance if (Math.random() < 0.12) { spawnPowerUp(block.x, block.y); } if (block.hp <= 0) { block.breakBlock(); blocks.splice(i, 1); } break; // Only one block per frame } } // Combo reset if no block hit for a while if (combo > 0 && !comboTimer) { resetCombo(); } // Level clear if (!levelCleared && blocks.length === 0) { levelCleared = true; LK.setTimeout(function () { nextLevel(); }, 1200); } }; // Music (optional, not required by MVP, so not included) /* End of gamecode.js */
===================================================================
--- original.js
+++ change.js
@@ -173,29 +173,52 @@
for (var i = 0; i < blocks.length; i++) {
blocks[i].destroy();
}
blocks = [];
- // Block pattern: rows x cols
- var rows = Math.min(3 + level, 7);
- var cols = 7;
+ // Dynamic block pattern logic
var blockW = 200,
blockH = 80;
var marginX = 40,
marginY = 40;
+ var colors = ['red', 'green', 'blue', 'yellow'];
+ // Increase rows and columns as level increases, up to a max
+ var rows = Math.min(3 + Math.floor(level / 2), 10);
+ var cols = Math.min(5 + Math.floor(level / 3), 12);
+ // For variety, pick a pattern type based on level
+ var patternType = level % 5; // 0: full, 1: checker, 2: pyramid, 3: gaps, 4: zigzag
var totalW = cols * blockW + (cols - 1) * marginX;
var startX = (2048 - totalW) / 2 + blockW / 2;
var startY = 300;
- var colors = ['red', 'green', 'blue', 'yellow'];
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
- var block = new Block();
- var color = colors[(r + c + level) % colors.length];
- block.setColor(color);
- block.x = startX + c * (blockW + marginX);
- block.y = startY + r * (blockH + marginY);
- block.hp = 1 + Math.floor(level / 3);
- game.addChild(block);
- blocks.push(block);
+ var placeBlock = true;
+ // Pattern logic
+ if (patternType === 1) {
+ // checker
+ if ((r + c) % 2 !== 0) placeBlock = false;
+ } else if (patternType === 2) {
+ // pyramid
+ var mid = Math.floor(cols / 2);
+ if (c < mid - r || c > mid + r) placeBlock = false;
+ } else if (patternType === 3) {
+ // random gaps
+ if (Math.abs((r * cols + c + level) % 7) === 0) placeBlock = false;
+ } else if (patternType === 4) {
+ // zigzag
+ if (r % 2 === 0 && c % 3 === 0 || r % 2 === 1 && c % 3 === 2) placeBlock = false;
+ }
+ // patternType 0: full grid
+ if (placeBlock) {
+ var block = new Block();
+ var color = colors[(r + c + level) % colors.length];
+ block.setColor(color);
+ block.x = startX + c * (blockW + marginX);
+ block.y = startY + r * (blockH + marginY);
+ // Increase block HP as level increases
+ block.hp = 1 + Math.floor(level / 4) + Math.floor(r / 3);
+ game.addChild(block);
+ blocks.push(block);
+ }
}
}
}
// Helper: spawn paddle
@@ -237,8 +260,9 @@
spawnPaddle();
spawnBall();
levelCleared = false;
}
+// Endless: Remove win condition, always go to nextLevel
// Helper: lose life
function loseLife() {
lives--;
updateGUI();
@@ -425,13 +449,9 @@
// Level clear
if (!levelCleared && blocks.length === 0) {
levelCleared = true;
LK.setTimeout(function () {
- if (level >= 10) {
- winGame();
- } else {
- nextLevel();
- }
+ nextLevel();
}, 1200);
}
};
// Music (optional, not required by MVP, so not included)