/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Basket = Container.expand(function () {
var self = Container.call(this);
var basketGraphics = self.attachAsset('basket', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1.5
});
self.width = basketGraphics.width * 2;
self.height = basketGraphics.height * 1.5;
self.down = function (x, y, obj) {
self.dragging = true;
};
self.up = function (x, y, obj) {
self.dragging = false;
};
return self;
});
var Fruit = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'apple';
self.speed = 3 + Math.random() * 2;
self.value = 10;
if (self.type === 'banana') {
self.value = 15;
self.speed += 1;
} else if (self.type === 'orange') {
self.value = 20;
self.speed += 2;
} else if (self.type === 'goldenApple') {
self.value = 50;
self.speed += 3;
} else if (self.type === 'rottenFruit') {
self.value = -20;
self.speed += 1;
} else if (self.type === 'bomb') {
self.value = -1; // Special value for bomb
self.speed += 2;
}
var fruitGraphics = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed * gameSpeed;
// Add some swinging motion for realistic falling
self.x += Math.sin(LK.ticks / 20 + self.y / 100) * 1;
// Add slight rotation
fruitGraphics.rotation += 0.01;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
var basket;
var fruits = [];
var score = 0;
var lives = 3;
var gameSpeed = 1;
var fruitTypes = ['apple', 'banana', 'orange', 'rottenFruit', 'goldenApple', 'bomb'];
var fruitSpawnRate = 60; // Frames between fruit spawns
var lastFruitSpawn = 0;
var speedIncreaseInterval = 1000; // Frames between speed increases
var isPaused = false;
var isGameOver = false;
var dragNode = null;
// UI elements
var scoreTxt, livesTxt, gameSpeedTxt;
// Initialize game
function initGame() {
// Create basket
basket = new Basket();
basket.x = 2048 / 2;
basket.y = 2732 - 200;
game.addChild(basket);
// Initialize score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
// Initialize lives display
livesTxt = new Text2('Lives: ' + lives, {
size: 80,
fill: 0xFFFFFF
});
livesTxt.anchor.set(0, 0);
LK.gui.top.addChild(livesTxt);
// Initialize game speed display
gameSpeedTxt = new Text2('Speed: 1.0x', {
size: 60,
fill: 0xFFFFFF
});
gameSpeedTxt.anchor.set(1, 0);
LK.gui.bottomRight.addChild(gameSpeedTxt);
// Play background music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
// Initialize stored high score if needed
if (!storage.highScore) {
storage.highScore = 0;
}
}
// Spawn a new fruit
function spawnFruit() {
var randomType = fruitTypes[Math.floor(Math.random() * fruitTypes.length)];
// Adjust probabilities for special items
if (randomType === 'goldenApple' && Math.random() < 0.8) {
randomType = fruitTypes[Math.floor(Math.random() * 3)]; // More likely to be a common fruit
}
if (randomType === 'bomb' && Math.random() < 0.7) {
randomType = fruitTypes[Math.floor(Math.random() * 3)]; // More likely to be a common fruit
}
var fruit = new Fruit(randomType);
fruit.x = Math.random() * (2048 - 100) + 50; // Random position
fruit.y = -50; // Start above the screen
game.addChild(fruit);
fruits.push(fruit);
}
// Update score display
function updateScore(points) {
score += points;
LK.setScore(score);
scoreTxt.setText('Score: ' + score);
// Check if we have a new high score
if (score > storage.highScore) {
storage.highScore = score;
}
}
// Handle fruit catching and collisions
function checkCollisions() {
for (var i = fruits.length - 1; i >= 0; i--) {
var fruit = fruits[i];
// Check if fruit is below the screen (missed)
if (fruit.y > 2732 + 50) {
fruit.destroy();
fruits.splice(i, 1);
continue;
}
// Check collision with basket
if (fruit.intersects(basket)) {
// Handle different fruit types
if (fruit.type === 'bomb') {
// Bomb - lose a life
lives--;
livesTxt.setText('Lives: ' + lives);
LK.getSound('explosion').play();
LK.effects.flashScreen(0xFF0000, 500);
if (lives <= 0) {
gameOver();
}
} else if (fruit.type === 'goldenApple') {
// Golden apple - bonus points and speed boost
updateScore(fruit.value);
gameSpeed += 0.1;
gameSpeedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
LK.getSound('powerup').play();
} else if (fruit.type === 'rottenFruit') {
// Rotten fruit - lose points and 0.5 lives
updateScore(fruit.value);
lives -= 0.5;
livesTxt.setText('Lives: ' + lives);
LK.getSound('loseLife').play();
// Check if player has lost all lives
if (lives <= 0) {
gameOver();
}
} else {
// Regular fruit - add points
updateScore(fruit.value);
LK.getSound('catch').play();
}
// Remove caught fruit
fruit.destroy();
fruits.splice(i, 1);
// Visual feedback
if (fruit.type !== 'bomb') {
LK.effects.flashObject(basket, 0x00FF00, 200);
}
}
}
}
// Game over function
function gameOver() {
isGameOver = true;
LK.showGameOver();
}
// Handle dragging the basket
function handleMove(x, y, obj) {
if (dragNode === basket) {
basket.x = x;
// Keep basket within screen bounds
if (basket.x < basket.width / 2) {
basket.x = basket.width / 2;
} else if (basket.x > 2048 - basket.width / 2) {
basket.x = 2048 - basket.width / 2;
}
}
}
// Set up event handlers
game.down = function (x, y, obj) {
dragNode = basket;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = handleMove;
// Main game update function
game.update = function () {
if (isGameOver) return;
// Spawn new fruits
if (LK.ticks - lastFruitSpawn > fruitSpawnRate) {
spawnFruit();
lastFruitSpawn = LK.ticks;
// Gradually decrease spawn rate for increasing difficulty
if (fruitSpawnRate > 20) {
fruitSpawnRate -= 0.1;
}
}
// Increase game speed over time
if (LK.ticks % speedIncreaseInterval === 0) {
gameSpeed += 0.005;
gameSpeedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
}
// Update all fruits
for (var i = 0; i < fruits.length; i++) {
fruits[i].update();
}
// Check for catches and misses
checkCollisions();
};
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -179,11 +179,17 @@
gameSpeed += 0.1;
gameSpeedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
LK.getSound('powerup').play();
} else if (fruit.type === 'rottenFruit') {
- // Rotten fruit - lose points
+ // Rotten fruit - lose points and 0.5 lives
updateScore(fruit.value);
+ lives -= 0.5;
+ livesTxt.setText('Lives: ' + lives);
LK.getSound('loseLife').play();
+ // Check if player has lost all lives
+ if (lives <= 0) {
+ gameOver();
+ }
} else {
// Regular fruit - add points
updateScore(fruit.value);
LK.getSound('catch').play();
a pixel art of a basket. In-Game asset. 2d. High contrast. No shadows
pixel art of a rotten apple. In-Game asset. 2d. High contrast. No shadows
pixel art of an apple. In-Game asset. 2d. High contrast. No shadows
pixel art of a apple but golden. In-Game asset. 2d. High contrast. No shadows
pixel art of a lemon. In-Game asset. 2d. High contrast. No shadows
pixel art of a orange. In-Game asset. 2d. High contrast. No shadows
a pixel art of a banana. In-Game asset. 2d. High contrast. No shadows
a pixel art of a bomb. In-Game asset. 2d. High contrast. No shadows