User prompt
when rotten touched to basket, start sound vomiting
User prompt
when kiwi touched to basket, start sound yummy
User prompt
when game started, start music
User prompt
when we make 60 score, we won
User prompt
duration should be 1 minute
User prompt
basket will be movable
Code edit (1 edits merged)
Please save this source code
User prompt
Kivi: Fruit Drop Frenzy
Initial prompt
kivi
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Basket class: player-controlled basket
var Basket = Container.expand(function () {
var self = Container.call(this);
// Attach basket asset (ellipse, brown)
var basketAsset = self.attachAsset('basket', {
anchorX: 0.5,
anchorY: 0.5
});
// Set basket size
basketAsset.width = 350;
basketAsset.height = 120;
basketAsset.color = 0x8B5C2A; // brown
// For collision, use the container's bounds
// Down event for basket (not used, handled globally)
self.down = function (x, y, obj) {};
return self;
});
// Kiwi class: falling good fruit
var Kiwi = Container.expand(function () {
var self = Container.call(this);
// Attach kiwi asset (ellipse, green)
var kiwiAsset = self.attachAsset('kiwi', {
anchorX: 0.5,
anchorY: 0.5
});
kiwiAsset.width = 100;
kiwiAsset.height = 100;
kiwiAsset.color = 0x7ED957; // green
// Falling speed (will be set on spawn)
self.speed = 8;
// For collision, use the container's bounds
// Update method: move down
self.update = function () {
self.y += self.speed;
};
return self;
});
// RottenFruit class: falling bad fruit
var RottenFruit = Container.expand(function () {
var self = Container.call(this);
// Attach rotten fruit asset (ellipse, purple)
var rottenAsset = self.attachAsset('rotten', {
anchorX: 0.5,
anchorY: 0.5
});
rottenAsset.width = 100;
rottenAsset.height = 100;
rottenAsset.color = 0x7B2F7B; // purple
// Falling speed (will be set on spawn)
self.speed = 8;
// Update method: move down
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xE3F6FF // light blue
});
/****
* Game Code
****/
// Game area dimensions
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Start music at game start
LK.playMusic('music');
// Score and timer
var score = 0;
var timeLeft = 60; // seconds
// Game speed
var baseSpeed = 8;
var speedIncrease = 0.5; // per 10 seconds
var maxSpeed = 28;
// Arrays for fruits
var kiwis = [];
var rottenFruits = [];
// Basket
var basket = new Basket();
game.addChild(basket);
// Position basket at bottom center
basket.x = GAME_WIDTH / 2;
basket.y = GAME_HEIGHT - 200;
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#222"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Timer text
var timerTxt = new Text2('30', {
size: 90,
fill: "#222"
});
timerTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(timerTxt);
// Dragging
var dragNode = null;
var dragOffsetX = 0;
// Helper: clamp basket within screen
function clampBasketX(x) {
var halfWidth = basket.width / 2;
if (x < halfWidth) return halfWidth;
if (x > GAME_WIDTH - halfWidth) return GAME_WIDTH - halfWidth;
return x;
}
// Move handler: drag basket horizontally
function handleMove(x, y, obj) {
if (dragNode === basket) {
// Only move horizontally
var newX = clampBasketX(x - dragOffsetX);
basket.x = newX;
}
}
// Down: start dragging if touch is on basket
game.down = function (x, y, obj) {
// Only allow drag if touch is on basket
var local = basket.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x >= -basket.width / 2 && local.x <= basket.width / 2 && local.y >= -basket.height / 2 && local.y <= basket.height / 2) {
dragNode = basket;
dragOffsetX = x - basket.x;
}
};
// Up: stop dragging
game.up = function (x, y, obj) {
dragNode = null;
};
// Move: handle dragging
game.move = handleMove;
// Fruit spawn timers
var kiwiSpawnInterval = 40; // frames
var rottenSpawnInterval = 90; // frames
var lastKiwiSpawn = 0;
var lastRottenSpawn = 0;
// Timer for game countdown
var timerInterval = LK.setInterval(function () {
timeLeft -= 1;
if (timeLeft < 0) timeLeft = 0;
timerTxt.setText(timeLeft + '');
if (timeLeft <= 0) {
LK.showGameOver();
}
}, 1000);
// Main game update
game.update = function () {
// Increase speed as time passes
var elapsed = 30 - timeLeft;
var currentSpeed = Math.min(baseSpeed + Math.floor(elapsed / 10) * speedIncrease, maxSpeed);
// Spawn kiwis
if (LK.ticks - lastKiwiSpawn >= kiwiSpawnInterval) {
var kiwi = new Kiwi();
kiwi.x = 150 + Math.random() * (GAME_WIDTH - 300);
kiwi.y = -60;
kiwi.speed = currentSpeed;
kiwis.push(kiwi);
game.addChild(kiwi);
lastKiwiSpawn = LK.ticks;
}
// Spawn rotten fruit
if (LK.ticks - lastRottenSpawn >= rottenSpawnInterval) {
var rotten = new RottenFruit();
rotten.x = 150 + Math.random() * (GAME_WIDTH - 300);
rotten.y = -60;
rotten.speed = currentSpeed + 1.5;
rottenFruits.push(rotten);
game.addChild(rotten);
lastRottenSpawn = LK.ticks;
}
// Update kiwis
for (var i = kiwis.length - 1; i >= 0; i--) {
var kiwi = kiwis[i];
kiwi.update();
// Off screen
if (kiwi.y > GAME_HEIGHT + 80) {
kiwi.destroy();
kiwis.splice(i, 1);
continue;
}
// Collision with basket
if (kiwi.intersects(basket)) {
// Play yummy sound
LK.getSound('yummy').play();
// Score up
score += 1;
scoreTxt.setText(score + '');
LK.setScore(score);
// Win condition: if score reaches 60, show win
if (score >= 60) {
LK.showYouWin();
return;
}
// Flash basket green
LK.effects.flashObject(basket, 0x7ED957, 300);
kiwi.destroy();
kiwis.splice(i, 1);
continue;
}
}
// Update rotten fruits
for (var j = rottenFruits.length - 1; j >= 0; j--) {
var rotten = rottenFruits[j];
rotten.update();
// Off screen
if (rotten.y > GAME_HEIGHT + 80) {
rotten.destroy();
rottenFruits.splice(j, 1);
continue;
}
// Collision with basket
if (rotten.intersects(basket)) {
// Play vomiting sound
LK.getSound('vomiting').play();
// Score down (min 0)
score = Math.max(0, score - 2);
scoreTxt.setText(score + '');
LK.setScore(score);
// Flash basket red
LK.effects.flashObject(basket, 0xB22222, 400);
rotten.destroy();
rottenFruits.splice(j, 1);
continue;
}
}
};
// Clean up timer on game over (handled by LK, but for completeness)
game.onDestroy = function () {
LK.clearInterval(timerInterval);
}; ===================================================================
--- original.js
+++ change.js
@@ -224,8 +224,10 @@
continue;
}
// Collision with basket
if (rotten.intersects(basket)) {
+ // Play vomiting sound
+ LK.getSound('vomiting').play();
// Score down (min 0)
score = Math.max(0, score - 2);
scoreTxt.setText(score + '');
LK.setScore(score);