/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Character = Container.expand(function (type) { var self = Container.call(this); var characterGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.isEating = false; // Character food preferences self.preferences = { female: { loves: ['strawberry', 'watermelon', 'pineapple'], likes: ['lettuce', 'broccoli'], dislikes: ['fish', 'sausage', 'potato'] }, male: { loves: ['sausage', 'fish', 'potato'], likes: ['watermelon', 'pineapple'], dislikes: ['lettuce', 'broccoli', 'strawberry'] }, monster: { loves: ['broccoli', 'lettuce', 'fish'], likes: ['potato', 'sausage'], dislikes: ['strawberry', 'watermelon', 'pineapple'] } }; self.feedFood = function (foodType) { if (self.isEating) return; self.isEating = true; var preference = self.getPreference(foodType); // Feeding animation tween(characterGraphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(characterGraphics, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeIn }); } }); // Reaction animation based on preference if (preference === 'loves') { self.showLoveReaction(); LK.getSound('happy').play(); } else if (preference === 'likes') { self.showLikeReaction(); LK.getSound('neutral').play(); } else { self.showDislikeReaction(); LK.getSound('dislike').play(); } LK.setTimeout(function () { self.isEating = false; }, 1000); }; self.getPreference = function (foodType) { var prefs = self.preferences[self.type]; if (prefs.loves.indexOf(foodType) !== -1) return 'loves'; if (prefs.likes.indexOf(foodType) !== -1) return 'likes'; return 'dislikes'; }; self.showLoveReaction = function () { // Happy bounce animation tween(characterGraphics, { y: characterGraphics.y - 30 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(characterGraphics, { y: characterGraphics.y + 30 }, { duration: 150, easing: tween.bounceOut }); } }); // Happy color flash var originalTint = characterGraphics.tint; characterGraphics.tint = 0xFFFF00; LK.setTimeout(function () { characterGraphics.tint = originalTint; }, 300); }; self.showLikeReaction = function () { // Gentle nod animation tween(characterGraphics, { rotation: 0.1 }, { duration: 200, easing: tween.easeInOut, onFinish: function onFinish() { tween(characterGraphics, { rotation: 0 }, { duration: 200, easing: tween.easeInOut }); } }); }; self.showDislikeReaction = function () { // Shake animation var originalX = characterGraphics.x; tween(characterGraphics, { x: originalX - 20 }, { duration: 100, easing: tween.easeInOut, onFinish: function onFinish() { tween(characterGraphics, { x: originalX + 20 }, { duration: 100, easing: tween.easeInOut, onFinish: function onFinish() { tween(characterGraphics, { x: originalX }, { duration: 100, easing: tween.easeInOut }); } }); } }); // Dislike color flash var originalTint = characterGraphics.tint; characterGraphics.tint = 0xFF0000; LK.setTimeout(function () { characterGraphics.tint = originalTint; }, 300); }; return self; }); var FoodItem = Container.expand(function (type) { var self = Container.call(this); var foodGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.originalX = 0; self.originalY = 0; self.isDragging = false; self.setOriginalPosition = function (x, y) { self.originalX = x; self.originalY = y; self.x = x; self.y = y; }; self.resetPosition = function () { tween(self, { x: self.originalX, y: self.originalY }, { duration: 300, easing: tween.easeOut }); }; self.down = function (x, y, obj) { self.isDragging = true; tween(foodGraphics, { scaleX: 1.1, scaleY: 1.1 }, { duration: 100, easing: tween.easeOut }); }; self.up = function (x, y, obj) { self.isDragging = false; tween(foodGraphics, { scaleX: 1, scaleY: 1 }, { duration: 100, easing: tween.easeIn }); // Check if dropped on character if (selectedCharacter && self.intersects(selectedCharacter)) { selectedCharacter.feedFood(self.type); } self.resetPosition(); }; return self; }); var SelectionButton = Container.expand(function (characterType) { var self = Container.call(this); var buttonBg = self.attachAsset('selectButton', { anchorX: 0.5, anchorY: 0.5 }); var characterPreview = self.attachAsset(characterType, { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); var buttonText = new Text2(characterType.toUpperCase(), { size: 24, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); buttonText.y = 40; self.addChild(buttonText); self.characterType = characterType; self.down = function (x, y, obj) { tween(buttonBg, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(buttonBg, { scaleX: 1, scaleY: 1 }, { duration: 100, easing: tween.easeIn }); } }); selectCharacter(self.characterType); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Sound effects // UI elements // Food assets // Character assets // Game states var gameState = 'selection'; // 'selection' or 'playing' var selectedCharacter = null; var foodItems = []; var selectionButtons = []; // Food types var foodTypes = ['lettuce', 'pineapple', 'fish', 'sausage', 'strawberry', 'potato', 'broccoli', 'watermelon']; // Title text var titleText = new Text2('Feed the Creatures', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 200; game.addChild(titleText); // Instruction text var instructionText = new Text2('Choose Your Character', { size: 40, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 1024; instructionText.y = 300; game.addChild(instructionText); // Create character selection buttons var characterTypes = ['female', 'male', 'monster']; for (var i = 0; i < characterTypes.length; i++) { var button = new SelectionButton(characterTypes[i]); button.x = 1024 + (i - 1) * 300; button.y = 600; selectionButtons.push(button); game.addChild(button); } // Create food items (initially hidden) for (var i = 0; i < foodTypes.length; i++) { var food = new FoodItem(foodTypes[i]); food.visible = false; foodItems.push(food); game.addChild(food); } // Reset button (initially hidden) var resetButton = LK.getAsset('resetButton', { anchorX: 0.5, anchorY: 0.5 }); resetButton.x = 1024; resetButton.y = 150; resetButton.visible = false; game.addChild(resetButton); var resetText = new Text2('RESET', { size: 28, fill: 0xFFFFFF }); resetText.anchor.set(0.5, 0.5); resetText.x = 1024; resetText.y = 150; resetText.visible = false; game.addChild(resetText); // Function to select character function selectCharacter(type) { gameState = 'playing'; // Hide selection UI titleText.visible = false; instructionText.visible = false; for (var i = 0; i < selectionButtons.length; i++) { selectionButtons[i].visible = false; } // Create selected character selectedCharacter = new Character(type); selectedCharacter.x = 1024; selectedCharacter.y = 900; game.addChild(selectedCharacter); // Show and position food items setupFoodItems(); // Show reset button resetButton.visible = true; resetText.visible = true; // Show feeding instruction instructionText.setText('Drag food to feed your character!'); instructionText.y = 2500; instructionText.visible = true; } // Function to setup food items function setupFoodItems() { var startX = 200; var startY = 1400; var spacing = 200; for (var i = 0; i < foodItems.length; i++) { var food = foodItems[i]; var row = Math.floor(i / 4); var col = i % 4; var x = startX + col * spacing + col * 80; var y = startY + row * spacing; food.setOriginalPosition(x, y); food.visible = true; } } // Function to reset game function resetGame() { gameState = 'selection'; // Remove selected character if (selectedCharacter) { selectedCharacter.destroy(); selectedCharacter = null; } // Hide food items for (var i = 0; i < foodItems.length; i++) { foodItems[i].visible = false; } // Hide reset button resetButton.visible = false; resetText.visible = false; // Show selection UI titleText.visible = true; instructionText.setText('Choose Your Character'); instructionText.y = 300; instructionText.visible = true; for (var i = 0; i < selectionButtons.length; i++) { selectionButtons[i].visible = true; } } // Drag handling var draggedFood = null; game.move = function (x, y, obj) { if (draggedFood) { draggedFood.x = x; draggedFood.y = y; } }; game.down = function (x, y, obj) { // Check if reset button was clicked if (resetButton.visible) { var resetBounds = { x: resetButton.x - 90, y: resetButton.y - 30, width: 180, height: 60 }; if (x >= resetBounds.x && x <= resetBounds.x + resetBounds.width && y >= resetBounds.y && y <= resetBounds.y + resetBounds.height) { resetGame(); return; } } // Find clicked food item for (var i = 0; i < foodItems.length; i++) { var food = foodItems[i]; if (food.visible && food.intersects({ x: x, y: y, width: 1, height: 1 })) { draggedFood = food; break; } } }; game.up = function (x, y, obj) { draggedFood = null; }; // Game update loop game.update = function () { // No continuous updates needed for this game };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function (type) {
var self = Container.call(this);
var characterGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.isEating = false;
// Character food preferences
self.preferences = {
female: {
loves: ['strawberry', 'watermelon', 'pineapple'],
likes: ['lettuce', 'broccoli'],
dislikes: ['fish', 'sausage', 'potato']
},
male: {
loves: ['sausage', 'fish', 'potato'],
likes: ['watermelon', 'pineapple'],
dislikes: ['lettuce', 'broccoli', 'strawberry']
},
monster: {
loves: ['broccoli', 'lettuce', 'fish'],
likes: ['potato', 'sausage'],
dislikes: ['strawberry', 'watermelon', 'pineapple']
}
};
self.feedFood = function (foodType) {
if (self.isEating) return;
self.isEating = true;
var preference = self.getPreference(foodType);
// Feeding animation
tween(characterGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(characterGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
// Reaction animation based on preference
if (preference === 'loves') {
self.showLoveReaction();
LK.getSound('happy').play();
} else if (preference === 'likes') {
self.showLikeReaction();
LK.getSound('neutral').play();
} else {
self.showDislikeReaction();
LK.getSound('dislike').play();
}
LK.setTimeout(function () {
self.isEating = false;
}, 1000);
};
self.getPreference = function (foodType) {
var prefs = self.preferences[self.type];
if (prefs.loves.indexOf(foodType) !== -1) return 'loves';
if (prefs.likes.indexOf(foodType) !== -1) return 'likes';
return 'dislikes';
};
self.showLoveReaction = function () {
// Happy bounce animation
tween(characterGraphics, {
y: characterGraphics.y - 30
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(characterGraphics, {
y: characterGraphics.y + 30
}, {
duration: 150,
easing: tween.bounceOut
});
}
});
// Happy color flash
var originalTint = characterGraphics.tint;
characterGraphics.tint = 0xFFFF00;
LK.setTimeout(function () {
characterGraphics.tint = originalTint;
}, 300);
};
self.showLikeReaction = function () {
// Gentle nod animation
tween(characterGraphics, {
rotation: 0.1
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(characterGraphics, {
rotation: 0
}, {
duration: 200,
easing: tween.easeInOut
});
}
});
};
self.showDislikeReaction = function () {
// Shake animation
var originalX = characterGraphics.x;
tween(characterGraphics, {
x: originalX - 20
}, {
duration: 100,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(characterGraphics, {
x: originalX + 20
}, {
duration: 100,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(characterGraphics, {
x: originalX
}, {
duration: 100,
easing: tween.easeInOut
});
}
});
}
});
// Dislike color flash
var originalTint = characterGraphics.tint;
characterGraphics.tint = 0xFF0000;
LK.setTimeout(function () {
characterGraphics.tint = originalTint;
}, 300);
};
return self;
});
var FoodItem = Container.expand(function (type) {
var self = Container.call(this);
var foodGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.originalX = 0;
self.originalY = 0;
self.isDragging = false;
self.setOriginalPosition = function (x, y) {
self.originalX = x;
self.originalY = y;
self.x = x;
self.y = y;
};
self.resetPosition = function () {
tween(self, {
x: self.originalX,
y: self.originalY
}, {
duration: 300,
easing: tween.easeOut
});
};
self.down = function (x, y, obj) {
self.isDragging = true;
tween(foodGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut
});
};
self.up = function (x, y, obj) {
self.isDragging = false;
tween(foodGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100,
easing: tween.easeIn
});
// Check if dropped on character
if (selectedCharacter && self.intersects(selectedCharacter)) {
selectedCharacter.feedFood(self.type);
}
self.resetPosition();
};
return self;
});
var SelectionButton = Container.expand(function (characterType) {
var self = Container.call(this);
var buttonBg = self.attachAsset('selectButton', {
anchorX: 0.5,
anchorY: 0.5
});
var characterPreview = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
var buttonText = new Text2(characterType.toUpperCase(), {
size: 24,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
buttonText.y = 40;
self.addChild(buttonText);
self.characterType = characterType;
self.down = function (x, y, obj) {
tween(buttonBg, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(buttonBg, {
scaleX: 1,
scaleY: 1
}, {
duration: 100,
easing: tween.easeIn
});
}
});
selectCharacter(self.characterType);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Sound effects
// UI elements
// Food assets
// Character assets
// Game states
var gameState = 'selection'; // 'selection' or 'playing'
var selectedCharacter = null;
var foodItems = [];
var selectionButtons = [];
// Food types
var foodTypes = ['lettuce', 'pineapple', 'fish', 'sausage', 'strawberry', 'potato', 'broccoli', 'watermelon'];
// Title text
var titleText = new Text2('Feed the Creatures', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 200;
game.addChild(titleText);
// Instruction text
var instructionText = new Text2('Choose Your Character', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
game.addChild(instructionText);
// Create character selection buttons
var characterTypes = ['female', 'male', 'monster'];
for (var i = 0; i < characterTypes.length; i++) {
var button = new SelectionButton(characterTypes[i]);
button.x = 1024 + (i - 1) * 300;
button.y = 600;
selectionButtons.push(button);
game.addChild(button);
}
// Create food items (initially hidden)
for (var i = 0; i < foodTypes.length; i++) {
var food = new FoodItem(foodTypes[i]);
food.visible = false;
foodItems.push(food);
game.addChild(food);
}
// Reset button (initially hidden)
var resetButton = LK.getAsset('resetButton', {
anchorX: 0.5,
anchorY: 0.5
});
resetButton.x = 1024;
resetButton.y = 150;
resetButton.visible = false;
game.addChild(resetButton);
var resetText = new Text2('RESET', {
size: 28,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetText.x = 1024;
resetText.y = 150;
resetText.visible = false;
game.addChild(resetText);
// Function to select character
function selectCharacter(type) {
gameState = 'playing';
// Hide selection UI
titleText.visible = false;
instructionText.visible = false;
for (var i = 0; i < selectionButtons.length; i++) {
selectionButtons[i].visible = false;
}
// Create selected character
selectedCharacter = new Character(type);
selectedCharacter.x = 1024;
selectedCharacter.y = 900;
game.addChild(selectedCharacter);
// Show and position food items
setupFoodItems();
// Show reset button
resetButton.visible = true;
resetText.visible = true;
// Show feeding instruction
instructionText.setText('Drag food to feed your character!');
instructionText.y = 2500;
instructionText.visible = true;
}
// Function to setup food items
function setupFoodItems() {
var startX = 200;
var startY = 1400;
var spacing = 200;
for (var i = 0; i < foodItems.length; i++) {
var food = foodItems[i];
var row = Math.floor(i / 4);
var col = i % 4;
var x = startX + col * spacing + col * 80;
var y = startY + row * spacing;
food.setOriginalPosition(x, y);
food.visible = true;
}
}
// Function to reset game
function resetGame() {
gameState = 'selection';
// Remove selected character
if (selectedCharacter) {
selectedCharacter.destroy();
selectedCharacter = null;
}
// Hide food items
for (var i = 0; i < foodItems.length; i++) {
foodItems[i].visible = false;
}
// Hide reset button
resetButton.visible = false;
resetText.visible = false;
// Show selection UI
titleText.visible = true;
instructionText.setText('Choose Your Character');
instructionText.y = 300;
instructionText.visible = true;
for (var i = 0; i < selectionButtons.length; i++) {
selectionButtons[i].visible = true;
}
}
// Drag handling
var draggedFood = null;
game.move = function (x, y, obj) {
if (draggedFood) {
draggedFood.x = x;
draggedFood.y = y;
}
};
game.down = function (x, y, obj) {
// Check if reset button was clicked
if (resetButton.visible) {
var resetBounds = {
x: resetButton.x - 90,
y: resetButton.y - 30,
width: 180,
height: 60
};
if (x >= resetBounds.x && x <= resetBounds.x + resetBounds.width && y >= resetBounds.y && y <= resetBounds.y + resetBounds.height) {
resetGame();
return;
}
}
// Find clicked food item
for (var i = 0; i < foodItems.length; i++) {
var food = foodItems[i];
if (food.visible && food.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
draggedFood = food;
break;
}
}
};
game.up = function (x, y, obj) {
draggedFood = null;
};
// Game update loop
game.update = function () {
// No continuous updates needed for this game
};