/**** * 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 }); self.targetX = 2048 / 2; self.update = function () { var diff = self.targetX - self.x; self.x += diff * 0.1; }; return self; }); var FoodItem = Container.expand(function (foodType) { var self = Container.call(this); self.foodType = foodType; self.speed = Math.random() * 3 + 2; self.rotationSpeed = (Math.random() - 0.5) * 0.1; self.collected = false; var foodGraphics = self.attachAsset(foodType, { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { if (!self.collected) { self.y += self.speed; self.rotation += self.rotationSpeed; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var currentLevel = 1; var shakeCount = 0; var requiredShakes = 10; var foodItems = []; var basket; var lastAcceleration = 0; var shakeThreshold = 15; var levelFoodTypes = { 1: ['cauliflower', 'cabbage'], 2: ['bakedBean'], 3: ['banana'], 4: ['orange'], 5: ['greenApple'] }; var levelNames = { 1: 'Vegetables', 2: 'Baked Beans', 3: 'Bananas', 4: 'Oranges', 5: 'Green Apples' }; // UI Elements var levelText = new Text2('Level 1: Vegetables', { size: 80, fill: '#FFFFFF' }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); levelText.y = 120; var shakeText = new Text2('Shake Count: 0/10', { size: 60, fill: '#FFFFFF' }); shakeText.anchor.set(0.5, 0); LK.gui.top.addChild(shakeText); shakeText.y = 220; var instructionText = new Text2('Shake your device to make food fall!', { size: 50, fill: '#FFFF00' }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 300; // Create basket basket = game.addChild(new Basket()); basket.x = 2048 / 2; basket.y = 2732 - 200; // Load saved level var savedLevel = storage.currentLevel || 1; if (savedLevel > 1) { currentLevel = savedLevel; updateLevelUI(); } function updateLevelUI() { levelText.setText('Level ' + currentLevel + ': ' + levelNames[currentLevel]); shakeText.setText('Shake Count: ' + shakeCount + '/' + requiredShakes); } function detectShake() { // Simple shake detection using device motion simulation var currentTime = Date.now(); var acceleration = Math.abs(Math.sin(currentTime * 0.01)) * 20; if (acceleration > shakeThreshold && lastAcceleration <= shakeThreshold) { shakeCount++; LK.getSound('shakeSound').play(); updateLevelUI(); if (shakeCount >= requiredShakes) { triggerFoodDrop(); } } lastAcceleration = acceleration; } function triggerFoodDrop() { var foodTypes = levelFoodTypes[currentLevel]; for (var i = 0; i < 15; i++) { var randomFoodType = foodTypes[Math.floor(Math.random() * foodTypes.length)]; var foodItem = new FoodItem(randomFoodType); foodItem.x = Math.random() * 1800 + 124; foodItem.y = -100 - Math.random() * 200; foodItems.push(foodItem); game.addChild(foodItem); } } function checkCollisions() { for (var i = foodItems.length - 1; i >= 0; i--) { var food = foodItems[i]; if (food.collected) continue; if (food.intersects(basket)) { food.collected = true; LK.getSound('collectFood').play(); LK.setScore(LK.getScore() + 10); // Visual feedback tween(food, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 300, onFinish: function onFinish() { food.destroy(); } }); foodItems.splice(i, 1); // Check if enough food collected for level completion if (LK.getScore() >= currentLevel * 50) { completeLevel(); } } else if (food.y > 2732 + 100) { // Remove food that fell off screen food.destroy(); foodItems.splice(i, 1); } } } function completeLevel() { LK.getSound('levelComplete').play(); // Flash screen green LK.effects.flashScreen(0x00FF00, 800); currentLevel++; shakeCount = 0; // Save progress storage.currentLevel = currentLevel; if (currentLevel > 5) { // Game completed LK.showYouWin(); } else { updateLevelUI(); // Clear remaining food items for (var i = foodItems.length - 1; i >= 0; i--) { foodItems[i].destroy(); } foodItems = []; // Show level complete message temporarily var levelCompleteText = new Text2('Level Complete!', { size: 100, fill: '#00FF00' }); levelCompleteText.anchor.set(0.5, 0.5); levelCompleteText.x = 2048 / 2; levelCompleteText.y = 2732 / 2; game.addChild(levelCompleteText); tween(levelCompleteText, { alpha: 0 }, { duration: 2000, onFinish: function onFinish() { levelCompleteText.destroy(); } }); } } // Touch controls for basket movement game.move = function (x, y, obj) { basket.targetX = x; }; game.down = function (x, y, obj) { basket.targetX = x; }; // Alternative shake trigger for testing/accessibility game.up = function (x, y, obj) { if (y < 400) { // Tap top of screen to simulate shake shakeCount++; LK.getSound('shakeSound').play(); updateLevelUI(); if (shakeCount >= requiredShakes) { triggerFoodDrop(); } } }; game.update = function () { detectShake(); checkCollisions(); };
/****
* 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
});
self.targetX = 2048 / 2;
self.update = function () {
var diff = self.targetX - self.x;
self.x += diff * 0.1;
};
return self;
});
var FoodItem = Container.expand(function (foodType) {
var self = Container.call(this);
self.foodType = foodType;
self.speed = Math.random() * 3 + 2;
self.rotationSpeed = (Math.random() - 0.5) * 0.1;
self.collected = false;
var foodGraphics = self.attachAsset(foodType, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.collected) {
self.y += self.speed;
self.rotation += self.rotationSpeed;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var currentLevel = 1;
var shakeCount = 0;
var requiredShakes = 10;
var foodItems = [];
var basket;
var lastAcceleration = 0;
var shakeThreshold = 15;
var levelFoodTypes = {
1: ['cauliflower', 'cabbage'],
2: ['bakedBean'],
3: ['banana'],
4: ['orange'],
5: ['greenApple']
};
var levelNames = {
1: 'Vegetables',
2: 'Baked Beans',
3: 'Bananas',
4: 'Oranges',
5: 'Green Apples'
};
// UI Elements
var levelText = new Text2('Level 1: Vegetables', {
size: 80,
fill: '#FFFFFF'
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
levelText.y = 120;
var shakeText = new Text2('Shake Count: 0/10', {
size: 60,
fill: '#FFFFFF'
});
shakeText.anchor.set(0.5, 0);
LK.gui.top.addChild(shakeText);
shakeText.y = 220;
var instructionText = new Text2('Shake your device to make food fall!', {
size: 50,
fill: '#FFFF00'
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 300;
// Create basket
basket = game.addChild(new Basket());
basket.x = 2048 / 2;
basket.y = 2732 - 200;
// Load saved level
var savedLevel = storage.currentLevel || 1;
if (savedLevel > 1) {
currentLevel = savedLevel;
updateLevelUI();
}
function updateLevelUI() {
levelText.setText('Level ' + currentLevel + ': ' + levelNames[currentLevel]);
shakeText.setText('Shake Count: ' + shakeCount + '/' + requiredShakes);
}
function detectShake() {
// Simple shake detection using device motion simulation
var currentTime = Date.now();
var acceleration = Math.abs(Math.sin(currentTime * 0.01)) * 20;
if (acceleration > shakeThreshold && lastAcceleration <= shakeThreshold) {
shakeCount++;
LK.getSound('shakeSound').play();
updateLevelUI();
if (shakeCount >= requiredShakes) {
triggerFoodDrop();
}
}
lastAcceleration = acceleration;
}
function triggerFoodDrop() {
var foodTypes = levelFoodTypes[currentLevel];
for (var i = 0; i < 15; i++) {
var randomFoodType = foodTypes[Math.floor(Math.random() * foodTypes.length)];
var foodItem = new FoodItem(randomFoodType);
foodItem.x = Math.random() * 1800 + 124;
foodItem.y = -100 - Math.random() * 200;
foodItems.push(foodItem);
game.addChild(foodItem);
}
}
function checkCollisions() {
for (var i = foodItems.length - 1; i >= 0; i--) {
var food = foodItems[i];
if (food.collected) continue;
if (food.intersects(basket)) {
food.collected = true;
LK.getSound('collectFood').play();
LK.setScore(LK.getScore() + 10);
// Visual feedback
tween(food, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
onFinish: function onFinish() {
food.destroy();
}
});
foodItems.splice(i, 1);
// Check if enough food collected for level completion
if (LK.getScore() >= currentLevel * 50) {
completeLevel();
}
} else if (food.y > 2732 + 100) {
// Remove food that fell off screen
food.destroy();
foodItems.splice(i, 1);
}
}
}
function completeLevel() {
LK.getSound('levelComplete').play();
// Flash screen green
LK.effects.flashScreen(0x00FF00, 800);
currentLevel++;
shakeCount = 0;
// Save progress
storage.currentLevel = currentLevel;
if (currentLevel > 5) {
// Game completed
LK.showYouWin();
} else {
updateLevelUI();
// Clear remaining food items
for (var i = foodItems.length - 1; i >= 0; i--) {
foodItems[i].destroy();
}
foodItems = [];
// Show level complete message temporarily
var levelCompleteText = new Text2('Level Complete!', {
size: 100,
fill: '#00FF00'
});
levelCompleteText.anchor.set(0.5, 0.5);
levelCompleteText.x = 2048 / 2;
levelCompleteText.y = 2732 / 2;
game.addChild(levelCompleteText);
tween(levelCompleteText, {
alpha: 0
}, {
duration: 2000,
onFinish: function onFinish() {
levelCompleteText.destroy();
}
});
}
}
// Touch controls for basket movement
game.move = function (x, y, obj) {
basket.targetX = x;
};
game.down = function (x, y, obj) {
basket.targetX = x;
};
// Alternative shake trigger for testing/accessibility
game.up = function (x, y, obj) {
if (y < 400) {
// Tap top of screen to simulate shake
shakeCount++;
LK.getSound('shakeSound').play();
updateLevelUI();
if (shakeCount >= requiredShakes) {
triggerFoodDrop();
}
}
};
game.update = function () {
detectShake();
checkCollisions();
};