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