Code edit (1 edits merged)
Please save this source code
User prompt
Shake & Drop: Food Fall Challenge
Initial prompt
Toca food fall (2005). The powerpuff girls do not eat anything. Level 1 cauliflower and cabbage shake your device 10 times to make cauliflower and cabbage fall, level 2 baked beans shake your device 10 times to make baked beans fall, level 3 bananas shake your device 10 times to make the bananas fall, level 4 oranges shake your device 10 times to make the oranges fall, or level 5 apples shake your device 10 times to make the green apples fall
/**** * 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(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,224 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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();
+};
\ No newline at end of file