User prompt
Very nice, add more features
User prompt
add different features
User prompt
oyunun amacını ingilizce yaz küçük bir yazıyla ve arka plan değişsin her aşamada ve kontrol kolay olsun
User prompt
oyunun amacını başta belirt ve neon ışıklı yap herşeyi
User prompt
renklendir her yeri
Code edit (1 edits merged)
Please save this source code
User prompt
Color Catcher
Initial prompt
make a simple game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Ball class
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballAsset = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
// Randomize color for each ball
var colors = [0xf7c325, 0x4ad991, 0xf75e5e, 0x3b6eea, 0xf7a325];
ballAsset.color = colors[Math.floor(Math.random() * colors.length)];
ballAsset.tint = ballAsset.color;
self.speed = 18 + Math.random() * 6; // px per frame, increases with score
self.update = function () {
self.y += self.speed;
};
return self;
});
// Basket class
var Basket = Container.expand(function () {
var self = Container.call(this);
var basketAsset = self.attachAsset('basket', {
anchorX: 0.5,
anchorY: 0.5
});
// Optionally, add a slight shadow or effect here in the future
return self;
});
// Bomb class
var Bomb = Container.expand(function () {
var self = Container.call(this);
var bombAsset = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 20 + Math.random() * 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf0f0f0
});
/****
* Game Code
****/
// Sound for missing a ball
// Sound for catching a bomb
// Sound for catching a ball
// Bomb: black ellipse
// Ball: colored ellipse
// Basket: wide rectangle
// Game area: 2048x2732
game.setBackgroundColor(0xf0f0f0);
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Misses text (shows "Missed!" when a ball is missed)
var missTxt = new Text2('', {
size: 90,
fill: 0xE74C3C
});
missTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(missTxt);
missTxt.visible = false;
// Basket
var basket = new Basket();
game.addChild(basket);
basket.y = 2732 - 180;
basket.x = 2048 / 2;
// Ball and bomb arrays
var balls = [];
var bombs = [];
// Dragging
var dragNode = null;
// Spawning control
var spawnTimer = 0;
var spawnInterval = 55; // frames between spawns, will decrease as score increases
// State
var lastScore = 0;
var gameOver = false;
// Helper: spawn a ball or bomb
function spawnFallingObject() {
// 80% ball, 20% bomb
var isBomb = Math.random() < 0.2;
var x = 150 + Math.random() * (2048 - 300);
if (isBomb) {
var bomb = new Bomb();
bomb.x = x;
bomb.y = -60;
bomb.lastIntersecting = false;
bombs.push(bomb);
game.addChild(bomb);
} else {
var ball = new Ball();
ball.x = x;
ball.y = -60;
ball.lastIntersecting = false;
balls.push(ball);
game.addChild(ball);
}
}
// Move handler for dragging basket
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp basket within screen
var halfWidth = dragNode.width / 2;
var minX = halfWidth;
var maxX = 2048 - halfWidth;
dragNode.x = Math.max(minX, Math.min(maxX, x));
}
}
// Touch/mouse events
game.down = function (x, y, obj) {
// Only allow drag if touch is near basket (within 200px vertically)
if (Math.abs(y - basket.y) < 200) {
dragNode = basket;
handleMove(x, y, obj);
}
};
game.move = handleMove;
game.up = function (x, y, obj) {
dragNode = null;
};
// Main update loop
game.update = function () {
if (gameOver) return;
// Spawn balls/bombs
spawnTimer++;
// Decrease interval as score increases (min 25)
var interval = Math.max(25, spawnInterval - Math.floor(LK.getScore() / 10) * 3);
if (spawnTimer >= interval) {
spawnFallingObject();
spawnTimer = 0;
}
// Update balls
for (var i = balls.length - 1; i >= 0; i--) {
var ball = balls[i];
if (ball.lastY === undefined) ball.lastY = ball.y;
if (ball.lastIntersecting === undefined) ball.lastIntersecting = false;
ball.update();
// Check for catch
var intersecting = ball.intersects(basket);
if (!ball.lastIntersecting && intersecting) {
// Caught!
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
LK.getSound('catch').play();
// Animate ball to basket and fade out
tween(ball, {
y: basket.y,
alpha: 0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
ball.destroy();
}
});
balls.splice(i, 1);
continue;
}
// Missed (goes below basket)
if (ball.lastY < 2732 && ball.y >= 2732 - 80) {
// Missed!
LK.getSound('miss').play();
missTxt.setText('Missed!');
missTxt.visible = true;
// Flash screen
LK.effects.flashScreen(0xff0000, 600);
// End game after short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
gameOver = true;
return;
}
// Off screen (cleanup)
if (ball.y > 2800) {
ball.destroy();
balls.splice(i, 1);
continue;
}
ball.lastY = ball.y;
ball.lastIntersecting = intersecting;
}
// Update bombs
for (var j = bombs.length - 1; j >= 0; j--) {
var bomb = bombs[j];
if (bomb.lastY === undefined) bomb.lastY = bomb.y;
if (bomb.lastIntersecting === undefined) bomb.lastIntersecting = false;
bomb.update();
// Check for catch
var intersecting = bomb.intersects(basket);
if (!bomb.lastIntersecting && intersecting) {
// Caught bomb: game over
LK.getSound('boom').play();
// Flash basket red
LK.effects.flashObject(basket, 0xff0000, 600);
// Flash screen
LK.effects.flashScreen(0x000000, 600);
// End game after short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
gameOver = true;
return;
}
// Off screen (cleanup)
if (bomb.y > 2800) {
bomb.destroy();
bombs.splice(j, 1);
continue;
}
bomb.lastY = bomb.y;
bomb.lastIntersecting = intersecting;
}
// Hide miss text after a short time
if (missTxt.visible) {
if (!missTxt.hideTimeout) {
missTxt.hideTimeout = LK.setTimeout(function () {
missTxt.visible = false;
missTxt.hideTimeout = null;
}, 900);
}
}
};
// Reset state on new game
LK.on('gameStart', function () {
// Remove all balls and bombs
for (var i = 0; i < balls.length; i++) balls[i].destroy();
for (var j = 0; j < bombs.length; j++) bombs[j].destroy();
balls = [];
bombs = [];
basket.x = 2048 / 2;
basket.y = 2732 - 180;
LK.setScore(0);
scoreTxt.setText('0');
missTxt.setText('');
missTxt.visible = false;
if (missTxt.hideTimeout) {
LK.clearTimeout(missTxt.hideTimeout);
missTxt.hideTimeout = null;
}
spawnTimer = 0;
gameOver = false;
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,264 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Ball class
+var Ball = Container.expand(function () {
+ var self = Container.call(this);
+ var ballAsset = self.attachAsset('ball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Randomize color for each ball
+ var colors = [0xf7c325, 0x4ad991, 0xf75e5e, 0x3b6eea, 0xf7a325];
+ ballAsset.color = colors[Math.floor(Math.random() * colors.length)];
+ ballAsset.tint = ballAsset.color;
+ self.speed = 18 + Math.random() * 6; // px per frame, increases with score
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Basket class
+var Basket = Container.expand(function () {
+ var self = Container.call(this);
+ var basketAsset = self.attachAsset('basket', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Optionally, add a slight shadow or effect here in the future
+ return self;
+});
+// Bomb class
+var Bomb = Container.expand(function () {
+ var self = Container.call(this);
+ var bombAsset = self.attachAsset('bomb', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 20 + Math.random() * 8;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0xf0f0f0
+});
+
+/****
+* Game Code
+****/
+// Sound for missing a ball
+// Sound for catching a bomb
+// Sound for catching a ball
+// Bomb: black ellipse
+// Ball: colored ellipse
+// Basket: wide rectangle
+// Game area: 2048x2732
+game.setBackgroundColor(0xf0f0f0);
+// Score text
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0x222222
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Misses text (shows "Missed!" when a ball is missed)
+var missTxt = new Text2('', {
+ size: 90,
+ fill: 0xE74C3C
+});
+missTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(missTxt);
+missTxt.visible = false;
+// Basket
+var basket = new Basket();
+game.addChild(basket);
+basket.y = 2732 - 180;
+basket.x = 2048 / 2;
+// Ball and bomb arrays
+var balls = [];
+var bombs = [];
+// Dragging
+var dragNode = null;
+// Spawning control
+var spawnTimer = 0;
+var spawnInterval = 55; // frames between spawns, will decrease as score increases
+// State
+var lastScore = 0;
+var gameOver = false;
+// Helper: spawn a ball or bomb
+function spawnFallingObject() {
+ // 80% ball, 20% bomb
+ var isBomb = Math.random() < 0.2;
+ var x = 150 + Math.random() * (2048 - 300);
+ if (isBomb) {
+ var bomb = new Bomb();
+ bomb.x = x;
+ bomb.y = -60;
+ bomb.lastIntersecting = false;
+ bombs.push(bomb);
+ game.addChild(bomb);
+ } else {
+ var ball = new Ball();
+ ball.x = x;
+ ball.y = -60;
+ ball.lastIntersecting = false;
+ balls.push(ball);
+ game.addChild(ball);
+ }
+}
+// Move handler for dragging basket
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ // Clamp basket within screen
+ var halfWidth = dragNode.width / 2;
+ var minX = halfWidth;
+ var maxX = 2048 - halfWidth;
+ dragNode.x = Math.max(minX, Math.min(maxX, x));
+ }
+}
+// Touch/mouse events
+game.down = function (x, y, obj) {
+ // Only allow drag if touch is near basket (within 200px vertically)
+ if (Math.abs(y - basket.y) < 200) {
+ dragNode = basket;
+ handleMove(x, y, obj);
+ }
+};
+game.move = handleMove;
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main update loop
+game.update = function () {
+ if (gameOver) return;
+ // Spawn balls/bombs
+ spawnTimer++;
+ // Decrease interval as score increases (min 25)
+ var interval = Math.max(25, spawnInterval - Math.floor(LK.getScore() / 10) * 3);
+ if (spawnTimer >= interval) {
+ spawnFallingObject();
+ spawnTimer = 0;
+ }
+ // Update balls
+ for (var i = balls.length - 1; i >= 0; i--) {
+ var ball = balls[i];
+ if (ball.lastY === undefined) ball.lastY = ball.y;
+ if (ball.lastIntersecting === undefined) ball.lastIntersecting = false;
+ ball.update();
+ // Check for catch
+ var intersecting = ball.intersects(basket);
+ if (!ball.lastIntersecting && intersecting) {
+ // Caught!
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText(LK.getScore());
+ LK.getSound('catch').play();
+ // Animate ball to basket and fade out
+ tween(ball, {
+ y: basket.y,
+ alpha: 0
+ }, {
+ duration: 200,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ ball.destroy();
+ }
+ });
+ balls.splice(i, 1);
+ continue;
+ }
+ // Missed (goes below basket)
+ if (ball.lastY < 2732 && ball.y >= 2732 - 80) {
+ // Missed!
+ LK.getSound('miss').play();
+ missTxt.setText('Missed!');
+ missTxt.visible = true;
+ // Flash screen
+ LK.effects.flashScreen(0xff0000, 600);
+ // End game after short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 600);
+ gameOver = true;
+ return;
+ }
+ // Off screen (cleanup)
+ if (ball.y > 2800) {
+ ball.destroy();
+ balls.splice(i, 1);
+ continue;
+ }
+ ball.lastY = ball.y;
+ ball.lastIntersecting = intersecting;
+ }
+ // Update bombs
+ for (var j = bombs.length - 1; j >= 0; j--) {
+ var bomb = bombs[j];
+ if (bomb.lastY === undefined) bomb.lastY = bomb.y;
+ if (bomb.lastIntersecting === undefined) bomb.lastIntersecting = false;
+ bomb.update();
+ // Check for catch
+ var intersecting = bomb.intersects(basket);
+ if (!bomb.lastIntersecting && intersecting) {
+ // Caught bomb: game over
+ LK.getSound('boom').play();
+ // Flash basket red
+ LK.effects.flashObject(basket, 0xff0000, 600);
+ // Flash screen
+ LK.effects.flashScreen(0x000000, 600);
+ // End game after short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 600);
+ gameOver = true;
+ return;
+ }
+ // Off screen (cleanup)
+ if (bomb.y > 2800) {
+ bomb.destroy();
+ bombs.splice(j, 1);
+ continue;
+ }
+ bomb.lastY = bomb.y;
+ bomb.lastIntersecting = intersecting;
+ }
+ // Hide miss text after a short time
+ if (missTxt.visible) {
+ if (!missTxt.hideTimeout) {
+ missTxt.hideTimeout = LK.setTimeout(function () {
+ missTxt.visible = false;
+ missTxt.hideTimeout = null;
+ }, 900);
+ }
+ }
+};
+// Reset state on new game
+LK.on('gameStart', function () {
+ // Remove all balls and bombs
+ for (var i = 0; i < balls.length; i++) balls[i].destroy();
+ for (var j = 0; j < bombs.length; j++) bombs[j].destroy();
+ balls = [];
+ bombs = [];
+ basket.x = 2048 / 2;
+ basket.y = 2732 - 180;
+ LK.setScore(0);
+ scoreTxt.setText('0');
+ missTxt.setText('');
+ missTxt.visible = false;
+ if (missTxt.hideTimeout) {
+ LK.clearTimeout(missTxt.hideTimeout);
+ missTxt.hideTimeout = null;
+ }
+ spawnTimer = 0;
+ gameOver = false;
});
\ No newline at end of file