/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Banana = Container.expand(function () {
var self = Container.call(this);
var bananaGraphics = self.attachAsset('banana', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 4
});
self.isCollected = false;
self.isDragging = false;
self.down = function (x, y, obj) {
if (!self.isCollected) {
self.isDragging = true;
LK.getSound('pickup').play();
}
};
self.up = function (x, y, obj) {
self.isDragging = false;
if (self.intersects(collectionDesk) && !self.isCollected) {
self.isCollected = true;
// Animate banana to center of desk
var deskGlobal = collectionDesk.toGlobal({
x: 0,
y: 0
});
var deskLocal = game.toLocal(deskGlobal);
tween(self, {
x: deskLocal.x + collectionDesk.width / 2,
y: deskLocal.y + 50 + collectedBananas * 30
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
collectedBananas++;
updateCollectionCounter();
LK.getSound('drop').play();
if (collectedBananas === totalBananas) {
LK.setTimeout(function () {
LK.getSound('success').play();
LK.showYouWin();
}, 1000);
}
}
});
}
};
return self;
});
var CollectionDesk = Container.expand(function () {
var self = Container.call(this);
var deskGraphics = self.attachAsset('desk', {
anchorX: 0.5,
anchorY: 0.5
});
var labelText = new Text2('Collection Desk', {
size: 40,
fill: 0xFFFFFF
});
labelText.anchor.set(0.5, 0.5);
labelText.position.set(0, -60);
self.addChild(labelText);
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('pillow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0xFF0000 // Red tint for enemy
});
// Speed of enemy chasing player
self.speed = 2;
self.lastPosition = {
x: 0,
y: 0
};
self.lastIntersecting = false;
self.update = function () {
// Save last position for intersection detection
self.lastPosition.x = self.x;
self.lastPosition.y = self.y;
if (player) {
// Calculate direction to player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Normalize and apply speed
if (distance > 0) {
dx = dx / distance * self.speed;
dy = dy / distance * self.speed;
// Store potential new position
var newX = self.x + dx;
var newY = self.y + dy;
// Check collision with map boundaries
var enemyRadius = self.width * 0.4;
var isColliding = false;
// Map boundary collision
if (newX < enemyRadius || newX > background.width - enemyRadius || newY < enemyRadius || newY > background.height - enemyRadius) {
isColliding = true;
}
// Furniture collision
if (!isColliding) {
for (var i = 0; i < furniturePieces.length; i++) {
var furniture = furniturePieces[i];
// Calculate distance between centers
var fdx = newX - furniture.x;
var fdy = newY - furniture.y;
var minDistX = enemyRadius + furniture.width / 2;
var minDistY = enemyRadius + furniture.height / 2;
// Check rectangular collision
if (Math.abs(fdx) < minDistX && Math.abs(fdy) < minDistY) {
isColliding = true;
break;
}
}
}
// Only move if no collision
if (!isColliding) {
// Move towards player
self.x = newX;
self.y = newY;
}
}
}
};
return self;
});
var FurniturePiece = Container.expand(function (assetName, width, height) {
var self = Container.call(this);
var furnitureGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = width;
self.height = height;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
// Create a simple player character using an existing shape
var playerGraphics = self.attachAsset('pillow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0x00AAFF // Blue tint to distinguish from other pillows
});
// Track if player is being dragged
self.isDragging = false;
self.down = function (x, y, obj) {
self.isDragging = true;
};
self.up = function (x, y, obj) {
self.isDragging = false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xF5F5DC
});
/****
* Game Code
****/
// Game constants
var totalBananas = 20;
var collectedBananas = 0;
var bananas = [];
var draggedBanana = null;
var player = null;
var enemy = null;
// Initialize game position for camera system
game.x = 0;
game.y = 0;
// Add room background
var background = game.addChild(LK.getAsset('roomBackground', {
anchorX: 0,
anchorY: 0
}));
background.width = 6144; // Triple the width
background.height = 8196; // Triple the height
// Add furniture pieces
var furniturePieces = [];
// Bed
var bed = new FurniturePiece('bed', 600, 300);
bed.x = 5000;
bed.y = 1500;
game.addChild(bed);
furniturePieces.push(bed);
// Table
var table = new FurniturePiece('table', 300, 150);
table.x = 1500;
table.y = 3800;
game.addChild(table);
furniturePieces.push(table);
// Sofa
var sofa = new FurniturePiece('sofa', 500, 200);
sofa.x = 1800;
sofa.y = 5600;
game.addChild(sofa);
furniturePieces.push(sofa);
// Bookshelf
var bookshelf = new FurniturePiece('bookshelf', 300, 500);
bookshelf.x = 5200;
bookshelf.y = 4500;
game.addChild(bookshelf);
furniturePieces.push(bookshelf);
// Plant
var plant = new FurniturePiece('plant', 150, 200);
plant.x = 4600;
plant.y = 6200;
game.addChild(plant);
furniturePieces.push(plant);
// Lamp
var lamp = new FurniturePiece('lamp', 100, 250);
lamp.x = 1000;
lamp.y = 1800;
game.addChild(lamp);
furniturePieces.push(lamp);
// Pillow
var pillow = new FurniturePiece('pillow', 150, 150);
pillow.x = 5400;
pillow.y = 2000;
game.addChild(pillow);
furniturePieces.push(pillow);
// Additional furniture
// Second bookshelf
var bookshelf2 = new FurniturePiece('bookshelf', 300, 500);
bookshelf2.x = 800;
bookshelf2.y = 4000;
game.addChild(bookshelf2);
furniturePieces.push(bookshelf2);
// Second desk
var desk2 = new FurniturePiece('desk', 400, 200);
desk2.x = 3500;
desk2.y = 2200;
game.addChild(desk2);
furniturePieces.push(desk2);
// Second plant
var plant2 = new FurniturePiece('plant', 150, 200);
plant2.x = 2600;
plant2.y = 1400;
game.addChild(plant2);
furniturePieces.push(plant2);
// Second lamp
var lamp2 = new FurniturePiece('lamp', 100, 250);
lamp2.x = 4800;
lamp2.y = 3300;
game.addChild(lamp2);
furniturePieces.push(lamp2);
// Second bed
var bed2 = new FurniturePiece('bed', 600, 300);
bed2.x = 3000;
bed2.y = 6000;
game.addChild(bed2);
furniturePieces.push(bed2);
// Armchair (using sofa asset with different size)
var armchair = new FurniturePiece('sofa', 300, 200);
armchair.x = 4200;
armchair.y = 1800;
game.addChild(armchair);
furniturePieces.push(armchair);
// Coffee table (using table with different dimensions)
var coffeeTable = new FurniturePiece('table', 250, 120);
coffeeTable.x = 2300;
coffeeTable.y = 2800;
game.addChild(coffeeTable);
furniturePieces.push(coffeeTable);
// Add collection desk
var collectionDesk = new CollectionDesk();
collectionDesk.x = 3072; // Center of larger map
collectionDesk.y = 7800; // Bottom of larger screen
game.addChild(collectionDesk);
// Add collection counter
var collectionCounter = new Text2('0/' + totalBananas + ' bananas', {
size: 60,
fill: 0x000000
});
collectionCounter.anchor.set(0.5, 0);
LK.gui.top.addChild(collectionCounter);
function updateCollectionCounter() {
collectionCounter.setText(collectedBananas + "/" + totalBananas + " bananas");
}
updateCollectionCounter();
// Create and hide bananas around the room
function createBananas() {
var bananaPositions = [{
x: 5100,
y: 1300
},
// Near the bed
{
x: 1600,
y: 3700
},
// On the table
{
x: 1400,
y: 5500
},
// Behind the sofa
{
x: 5300,
y: 4200
},
// On bookshelf
{
x: 4700,
y: 6100
},
// Behind plant
{
x: 900,
y: 1700
},
// Near lamp
{
x: 5500,
y: 2100
},
// Under pillow
// Additional banana positions
{
x: 3800,
y: 1400
},
// Near top center
{
x: 1200,
y: 3200
},
// Left middle area
{
x: 2300,
y: 4700
},
// Middle area
{
x: 4300,
y: 5500
},
// Right middle area
{
x: 800,
y: 7000
},
// Bottom left corner
{
x: 2700,
y: 7500
},
// Near collection desk
{
x: 4500,
y: 7200
},
// Bottom right area
{
x: 5800,
y: 2800
},
// Far right middle
{
x: 3400,
y: 2600
},
// Upper middle
{
x: 1900,
y: 1900
},
// Upper left
{
x: 4000,
y: 4100
},
// Dead center
{
x: 5700,
y: 5000
},
// Lower right
{
x: 600,
y: 5000
} // Lower left
];
for (var i = 0; i < totalBananas; i++) {
var banana = new Banana();
banana.x = bananaPositions[i].x;
banana.y = bananaPositions[i].y;
// Add slight random rotation
banana.rotation = (Math.random() - 0.5) * 0.5;
bananas.push(banana);
game.addChild(banana);
}
}
createBananas();
// Add Math.lerp utility function for smooth interpolation
Math.lerp = function (start, end, amt) {
return (1 - amt) * start + amt * end;
};
// Create and add player character
player = new Player();
player.x = 3072; // Start at center of larger map horizontally
player.y = 4098; // Middle of the larger map vertically
game.addChild(player);
// Create and add enemy character
enemy = new Enemy();
enemy.x = 800; // Start at left side of screen
enemy.y = 800; // Top portion of screen
game.addChild(enemy);
// Game event handlers
game.down = function (x, y, obj) {
// Check if player was clicked
if (obj.target === player) {
player.isDragging = true;
}
};
game.move = function (x, y, obj) {
// Move any dragged banana
for (var i = 0; i < bananas.length; i++) {
if (bananas[i].isDragging) {
bananas[i].x = x;
bananas[i].y = y;
}
}
// Move player if being dragged
if (player && player.isDragging) {
// Direct movement - same speed as enemy
player.x = x;
player.y = y;
}
};
game.up = function (x, y, obj) {
// Handled by individual banana objects
if (player) {
player.isDragging = false;
}
};
// Update function to check for player-banana collisions and handle camera
game.update = function () {
// Keep track of player's previous position to restore on collision
if (!player.lastX) player.lastX = player.x;
if (!player.lastY) player.lastY = player.y;
// Check wall boundaries
var playerRadius = player.width * 0.4; // Assuming player size
var isColliding = false;
// Collision with map boundaries
if (player.x < playerRadius || player.x > background.width - playerRadius || player.y < playerRadius || player.y > background.height - playerRadius) {
isColliding = true;
}
// Collision with furniture
for (var i = 0; i < furniturePieces.length; i++) {
var furniture = furniturePieces[i];
// Calculate distance between centers
var dx = player.x - furniture.x;
var dy = player.y - furniture.y;
var minDistX = playerRadius + furniture.width / 2;
var minDistY = playerRadius + furniture.height / 2;
// Check rectangular collision
if (Math.abs(dx) < minDistX && Math.abs(dy) < minDistY) {
isColliding = true;
break;
}
}
// If collision detected, restore previous position
if (isColliding) {
player.x = player.lastX;
player.y = player.lastY;
} else {
// Save current valid position
player.lastX = player.x;
player.lastY = player.y;
}
// Update camera position to follow player
if (player) {
// Calculate camera target position
var cameraX = Math.max(1024, Math.min(background.width - 1024, player.x));
var cameraY = Math.max(1366, Math.min(background.height - 1366, player.y));
// Smoothly move the camera (game position) to follow the player
game.x = Math.lerp(game.x, -cameraX + 1024, 0.1);
game.y = Math.lerp(game.y, -cameraY + 1366, 0.1);
// Update enemy
if (enemy) {
// Save last intersection status
enemy.lastIntersecting = enemy.intersects(player);
// Update enemy position (chase player)
enemy.update();
// Check if enemy touches player (automatic kill)
if (enemy.intersects(player)) {
// Flash screen red for game over effect
LK.effects.flashScreen(0xFF0000, 1000);
// Show game over
LK.showGameOver();
}
}
// Check if player touches any banana
for (var i = 0; i < bananas.length; i++) {
if (!bananas[i].isCollected && !bananas[i].isDragging && player.intersects(bananas[i])) {
// Collect the banana
bananas[i].isCollected = true;
// Animate banana to center of desk
var deskGlobal = collectionDesk.toGlobal({
x: 0,
y: 0
});
var deskLocal = game.toLocal(deskGlobal);
// Play pickup sound
LK.getSound('pickup').play();
tween(bananas[i], {
x: deskLocal.x + collectionDesk.width / 2,
y: deskLocal.y + 50 + collectedBananas * 30
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
collectedBananas++;
updateCollectionCounter();
LK.getSound('drop').play();
if (collectedBananas === totalBananas) {
LK.setTimeout(function () {
LK.getSound('success').play();
LK.showYouWin();
}, 1000);
}
}
});
}
}
}
};
// Play background music
LK.playMusic('bgmusic');
// Instructions
var instructionsText = new Text2("Find 20 hidden bananas and\ndrag them to the collection desk!\nAvoid the red enemy!", {
size: 50,
fill: 0x000000
});
instructionsText.anchor.set(0.5, 0);
instructionsText.y = 100;
LK.gui.top.addChild(instructionsText);
// Auto-hide instructions after 5 seconds
LK.setTimeout(function () {
tween(instructionsText, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut
});
}, 5000); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Banana = Container.expand(function () {
var self = Container.call(this);
var bananaGraphics = self.attachAsset('banana', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 4
});
self.isCollected = false;
self.isDragging = false;
self.down = function (x, y, obj) {
if (!self.isCollected) {
self.isDragging = true;
LK.getSound('pickup').play();
}
};
self.up = function (x, y, obj) {
self.isDragging = false;
if (self.intersects(collectionDesk) && !self.isCollected) {
self.isCollected = true;
// Animate banana to center of desk
var deskGlobal = collectionDesk.toGlobal({
x: 0,
y: 0
});
var deskLocal = game.toLocal(deskGlobal);
tween(self, {
x: deskLocal.x + collectionDesk.width / 2,
y: deskLocal.y + 50 + collectedBananas * 30
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
collectedBananas++;
updateCollectionCounter();
LK.getSound('drop').play();
if (collectedBananas === totalBananas) {
LK.setTimeout(function () {
LK.getSound('success').play();
LK.showYouWin();
}, 1000);
}
}
});
}
};
return self;
});
var CollectionDesk = Container.expand(function () {
var self = Container.call(this);
var deskGraphics = self.attachAsset('desk', {
anchorX: 0.5,
anchorY: 0.5
});
var labelText = new Text2('Collection Desk', {
size: 40,
fill: 0xFFFFFF
});
labelText.anchor.set(0.5, 0.5);
labelText.position.set(0, -60);
self.addChild(labelText);
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('pillow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0xFF0000 // Red tint for enemy
});
// Speed of enemy chasing player
self.speed = 2;
self.lastPosition = {
x: 0,
y: 0
};
self.lastIntersecting = false;
self.update = function () {
// Save last position for intersection detection
self.lastPosition.x = self.x;
self.lastPosition.y = self.y;
if (player) {
// Calculate direction to player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Normalize and apply speed
if (distance > 0) {
dx = dx / distance * self.speed;
dy = dy / distance * self.speed;
// Store potential new position
var newX = self.x + dx;
var newY = self.y + dy;
// Check collision with map boundaries
var enemyRadius = self.width * 0.4;
var isColliding = false;
// Map boundary collision
if (newX < enemyRadius || newX > background.width - enemyRadius || newY < enemyRadius || newY > background.height - enemyRadius) {
isColliding = true;
}
// Furniture collision
if (!isColliding) {
for (var i = 0; i < furniturePieces.length; i++) {
var furniture = furniturePieces[i];
// Calculate distance between centers
var fdx = newX - furniture.x;
var fdy = newY - furniture.y;
var minDistX = enemyRadius + furniture.width / 2;
var minDistY = enemyRadius + furniture.height / 2;
// Check rectangular collision
if (Math.abs(fdx) < minDistX && Math.abs(fdy) < minDistY) {
isColliding = true;
break;
}
}
}
// Only move if no collision
if (!isColliding) {
// Move towards player
self.x = newX;
self.y = newY;
}
}
}
};
return self;
});
var FurniturePiece = Container.expand(function (assetName, width, height) {
var self = Container.call(this);
var furnitureGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = width;
self.height = height;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
// Create a simple player character using an existing shape
var playerGraphics = self.attachAsset('pillow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0x00AAFF // Blue tint to distinguish from other pillows
});
// Track if player is being dragged
self.isDragging = false;
self.down = function (x, y, obj) {
self.isDragging = true;
};
self.up = function (x, y, obj) {
self.isDragging = false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xF5F5DC
});
/****
* Game Code
****/
// Game constants
var totalBananas = 20;
var collectedBananas = 0;
var bananas = [];
var draggedBanana = null;
var player = null;
var enemy = null;
// Initialize game position for camera system
game.x = 0;
game.y = 0;
// Add room background
var background = game.addChild(LK.getAsset('roomBackground', {
anchorX: 0,
anchorY: 0
}));
background.width = 6144; // Triple the width
background.height = 8196; // Triple the height
// Add furniture pieces
var furniturePieces = [];
// Bed
var bed = new FurniturePiece('bed', 600, 300);
bed.x = 5000;
bed.y = 1500;
game.addChild(bed);
furniturePieces.push(bed);
// Table
var table = new FurniturePiece('table', 300, 150);
table.x = 1500;
table.y = 3800;
game.addChild(table);
furniturePieces.push(table);
// Sofa
var sofa = new FurniturePiece('sofa', 500, 200);
sofa.x = 1800;
sofa.y = 5600;
game.addChild(sofa);
furniturePieces.push(sofa);
// Bookshelf
var bookshelf = new FurniturePiece('bookshelf', 300, 500);
bookshelf.x = 5200;
bookshelf.y = 4500;
game.addChild(bookshelf);
furniturePieces.push(bookshelf);
// Plant
var plant = new FurniturePiece('plant', 150, 200);
plant.x = 4600;
plant.y = 6200;
game.addChild(plant);
furniturePieces.push(plant);
// Lamp
var lamp = new FurniturePiece('lamp', 100, 250);
lamp.x = 1000;
lamp.y = 1800;
game.addChild(lamp);
furniturePieces.push(lamp);
// Pillow
var pillow = new FurniturePiece('pillow', 150, 150);
pillow.x = 5400;
pillow.y = 2000;
game.addChild(pillow);
furniturePieces.push(pillow);
// Additional furniture
// Second bookshelf
var bookshelf2 = new FurniturePiece('bookshelf', 300, 500);
bookshelf2.x = 800;
bookshelf2.y = 4000;
game.addChild(bookshelf2);
furniturePieces.push(bookshelf2);
// Second desk
var desk2 = new FurniturePiece('desk', 400, 200);
desk2.x = 3500;
desk2.y = 2200;
game.addChild(desk2);
furniturePieces.push(desk2);
// Second plant
var plant2 = new FurniturePiece('plant', 150, 200);
plant2.x = 2600;
plant2.y = 1400;
game.addChild(plant2);
furniturePieces.push(plant2);
// Second lamp
var lamp2 = new FurniturePiece('lamp', 100, 250);
lamp2.x = 4800;
lamp2.y = 3300;
game.addChild(lamp2);
furniturePieces.push(lamp2);
// Second bed
var bed2 = new FurniturePiece('bed', 600, 300);
bed2.x = 3000;
bed2.y = 6000;
game.addChild(bed2);
furniturePieces.push(bed2);
// Armchair (using sofa asset with different size)
var armchair = new FurniturePiece('sofa', 300, 200);
armchair.x = 4200;
armchair.y = 1800;
game.addChild(armchair);
furniturePieces.push(armchair);
// Coffee table (using table with different dimensions)
var coffeeTable = new FurniturePiece('table', 250, 120);
coffeeTable.x = 2300;
coffeeTable.y = 2800;
game.addChild(coffeeTable);
furniturePieces.push(coffeeTable);
// Add collection desk
var collectionDesk = new CollectionDesk();
collectionDesk.x = 3072; // Center of larger map
collectionDesk.y = 7800; // Bottom of larger screen
game.addChild(collectionDesk);
// Add collection counter
var collectionCounter = new Text2('0/' + totalBananas + ' bananas', {
size: 60,
fill: 0x000000
});
collectionCounter.anchor.set(0.5, 0);
LK.gui.top.addChild(collectionCounter);
function updateCollectionCounter() {
collectionCounter.setText(collectedBananas + "/" + totalBananas + " bananas");
}
updateCollectionCounter();
// Create and hide bananas around the room
function createBananas() {
var bananaPositions = [{
x: 5100,
y: 1300
},
// Near the bed
{
x: 1600,
y: 3700
},
// On the table
{
x: 1400,
y: 5500
},
// Behind the sofa
{
x: 5300,
y: 4200
},
// On bookshelf
{
x: 4700,
y: 6100
},
// Behind plant
{
x: 900,
y: 1700
},
// Near lamp
{
x: 5500,
y: 2100
},
// Under pillow
// Additional banana positions
{
x: 3800,
y: 1400
},
// Near top center
{
x: 1200,
y: 3200
},
// Left middle area
{
x: 2300,
y: 4700
},
// Middle area
{
x: 4300,
y: 5500
},
// Right middle area
{
x: 800,
y: 7000
},
// Bottom left corner
{
x: 2700,
y: 7500
},
// Near collection desk
{
x: 4500,
y: 7200
},
// Bottom right area
{
x: 5800,
y: 2800
},
// Far right middle
{
x: 3400,
y: 2600
},
// Upper middle
{
x: 1900,
y: 1900
},
// Upper left
{
x: 4000,
y: 4100
},
// Dead center
{
x: 5700,
y: 5000
},
// Lower right
{
x: 600,
y: 5000
} // Lower left
];
for (var i = 0; i < totalBananas; i++) {
var banana = new Banana();
banana.x = bananaPositions[i].x;
banana.y = bananaPositions[i].y;
// Add slight random rotation
banana.rotation = (Math.random() - 0.5) * 0.5;
bananas.push(banana);
game.addChild(banana);
}
}
createBananas();
// Add Math.lerp utility function for smooth interpolation
Math.lerp = function (start, end, amt) {
return (1 - amt) * start + amt * end;
};
// Create and add player character
player = new Player();
player.x = 3072; // Start at center of larger map horizontally
player.y = 4098; // Middle of the larger map vertically
game.addChild(player);
// Create and add enemy character
enemy = new Enemy();
enemy.x = 800; // Start at left side of screen
enemy.y = 800; // Top portion of screen
game.addChild(enemy);
// Game event handlers
game.down = function (x, y, obj) {
// Check if player was clicked
if (obj.target === player) {
player.isDragging = true;
}
};
game.move = function (x, y, obj) {
// Move any dragged banana
for (var i = 0; i < bananas.length; i++) {
if (bananas[i].isDragging) {
bananas[i].x = x;
bananas[i].y = y;
}
}
// Move player if being dragged
if (player && player.isDragging) {
// Direct movement - same speed as enemy
player.x = x;
player.y = y;
}
};
game.up = function (x, y, obj) {
// Handled by individual banana objects
if (player) {
player.isDragging = false;
}
};
// Update function to check for player-banana collisions and handle camera
game.update = function () {
// Keep track of player's previous position to restore on collision
if (!player.lastX) player.lastX = player.x;
if (!player.lastY) player.lastY = player.y;
// Check wall boundaries
var playerRadius = player.width * 0.4; // Assuming player size
var isColliding = false;
// Collision with map boundaries
if (player.x < playerRadius || player.x > background.width - playerRadius || player.y < playerRadius || player.y > background.height - playerRadius) {
isColliding = true;
}
// Collision with furniture
for (var i = 0; i < furniturePieces.length; i++) {
var furniture = furniturePieces[i];
// Calculate distance between centers
var dx = player.x - furniture.x;
var dy = player.y - furniture.y;
var minDistX = playerRadius + furniture.width / 2;
var minDistY = playerRadius + furniture.height / 2;
// Check rectangular collision
if (Math.abs(dx) < minDistX && Math.abs(dy) < minDistY) {
isColliding = true;
break;
}
}
// If collision detected, restore previous position
if (isColliding) {
player.x = player.lastX;
player.y = player.lastY;
} else {
// Save current valid position
player.lastX = player.x;
player.lastY = player.y;
}
// Update camera position to follow player
if (player) {
// Calculate camera target position
var cameraX = Math.max(1024, Math.min(background.width - 1024, player.x));
var cameraY = Math.max(1366, Math.min(background.height - 1366, player.y));
// Smoothly move the camera (game position) to follow the player
game.x = Math.lerp(game.x, -cameraX + 1024, 0.1);
game.y = Math.lerp(game.y, -cameraY + 1366, 0.1);
// Update enemy
if (enemy) {
// Save last intersection status
enemy.lastIntersecting = enemy.intersects(player);
// Update enemy position (chase player)
enemy.update();
// Check if enemy touches player (automatic kill)
if (enemy.intersects(player)) {
// Flash screen red for game over effect
LK.effects.flashScreen(0xFF0000, 1000);
// Show game over
LK.showGameOver();
}
}
// Check if player touches any banana
for (var i = 0; i < bananas.length; i++) {
if (!bananas[i].isCollected && !bananas[i].isDragging && player.intersects(bananas[i])) {
// Collect the banana
bananas[i].isCollected = true;
// Animate banana to center of desk
var deskGlobal = collectionDesk.toGlobal({
x: 0,
y: 0
});
var deskLocal = game.toLocal(deskGlobal);
// Play pickup sound
LK.getSound('pickup').play();
tween(bananas[i], {
x: deskLocal.x + collectionDesk.width / 2,
y: deskLocal.y + 50 + collectedBananas * 30
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
collectedBananas++;
updateCollectionCounter();
LK.getSound('drop').play();
if (collectedBananas === totalBananas) {
LK.setTimeout(function () {
LK.getSound('success').play();
LK.showYouWin();
}, 1000);
}
}
});
}
}
}
};
// Play background music
LK.playMusic('bgmusic');
// Instructions
var instructionsText = new Text2("Find 20 hidden bananas and\ndrag them to the collection desk!\nAvoid the red enemy!", {
size: 50,
fill: 0x000000
});
instructionsText.anchor.set(0.5, 0);
instructionsText.y = 100;
LK.gui.top.addChild(instructionsText);
// Auto-hide instructions after 5 seconds
LK.setTimeout(function () {
tween(instructionsText, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut
});
}, 5000);