/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bee class (bees to be eaten) var Bee = Container.expand(function () { var self = Container.call(this); // Attach Bee asset (smaller yellow ellipse) var bee = self.attachAsset('bee', { anchorX: 0.5, anchorY: 0.5 }); // Randomize bee size a bit var scale = 0.5 + Math.random() * 0.2; bee.scaleX = scale; bee.scaleY = scale; // Bee speed (for chaos mode) self.vx = 0; self.vy = 0; self.escaping = false; // For chaos mode: set bee to escape in a random direction self.startEscape = function () { self.escaping = true; // Random direction and speed var angle = Math.random() * Math.PI * 2; var speed = 8 + Math.random() * 6; self.vx = Math.cos(angle) * speed; self.vy = Math.sin(angle) * speed; }; // Update method for bee self.update = function () { if (self.escaping) { self.x += self.vx; self.y += self.vy; } }; return self; }); // KingBee class (the player) var KingBee = Container.expand(function () { var self = Container.call(this); // Attach King Bee asset (big yellow ellipse) var kingBee = self.attachAsset('kingBee', { anchorX: 0.5, anchorY: 0.5 }); // Set initial scale for King Bee kingBee.scaleX = 1.2; kingBee.scaleY = 1.2; // For collision, use self as the hitbox // Dragging state self.isDragging = false; // Event handlers for touch 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: 0xffe066 // Honey yellow background }); /**** * Game Code ****/ // Tween plugin for animations // Game constants var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; var BEE_LIMIT = 60; var INITIAL_BEE_COUNT = 20; var CHAOS_BEE_COUNT = 30; // Game state var kingBee; var bees = []; var chaosMode = false; var beesEaten = 0; var dragNode = null; var lastIntersectingBee = null; var scoreTxt; var infoTxt; var chaosTxt; var chaosTimeout = null; // --- Asset Initialization (shapes) --- // For dead bees // --- GUI Elements --- scoreTxt = new Text2('0', { size: 120, fill: 0x222222 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); infoTxt = new Text2('Eat bees! Don\'t exceed 60.', { size: 70, fill: 0x222222 }); infoTxt.anchor.set(0.5, 0); LK.gui.top.addChild(infoTxt); infoTxt.y = 130; chaosTxt = new Text2('CHAOS! Eliminate survivors!', { size: 120, fill: 0xFF2222 }); chaosTxt.anchor.set(0.5, 0.5); chaosTxt.visible = false; LK.gui.center.addChild(chaosTxt); // --- King Bee --- kingBee = new KingBee(); game.addChild(kingBee); // Start in the center of the hive kingBee.x = GAME_WIDTH / 2; kingBee.y = GAME_HEIGHT / 2 + 200; // --- Bee Spawning --- function spawnBee(x, y) { var bee = new Bee(); bee.x = x; bee.y = y; bees.push(bee); game.addChild(bee); return bee; } // Place bees randomly in the hive (not too close to King Bee) function spawnInitialBees(count) { for (var i = 0; i < count; i++) { var placed = false; var tries = 0; while (!placed && tries < 20) { var bx = 200 + Math.random() * (GAME_WIDTH - 400); var by = 400 + Math.random() * (GAME_HEIGHT - 800); // Don't spawn too close to King Bee var dx = bx - kingBee.x; var dy = by - kingBee.y; if (dx * dx + dy * dy > 400 * 400) { spawnBee(bx, by); placed = true; } tries++; } } } spawnInitialBees(INITIAL_BEE_COUNT); // --- Dragging King Bee --- function handleMove(x, y, obj) { if (dragNode) { // Clamp to game area, keep King Bee inside var kbw = kingBee.width / 2; var kbh = kingBee.height / 2; kingBee.x = Math.max(kbw, Math.min(GAME_WIDTH - kbw, x)); kingBee.y = Math.max(kbh, Math.min(GAME_HEIGHT - kbh, y)); } } game.move = handleMove; game.down = function (x, y, obj) { // Only start drag if touch is on King Bee var local = kingBee.toLocal(game.toGlobal({ x: x, y: y })); if (Math.abs(local.x) < kingBee.width / 2 && Math.abs(local.y) < kingBee.height / 2) { dragNode = kingBee; } }; game.up = function (x, y, obj) { dragNode = null; }; // --- Eating Bees --- function eatBee(bee) { // Animate bee shrinking and fading out tween(bee, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 250, easing: tween.easeIn, onFinish: function onFinish() { bee.destroy(); } }); // Remove from bees array for (var i = 0; i < bees.length; i++) { if (bees[i] === bee) { bees.splice(i, 1); break; } } beesEaten++; scoreTxt.setText(beesEaten); // King Bee grows slightly tween(kingBee, { scaleX: 1.2 + beesEaten * 0.01, scaleY: 1.2 + beesEaten * 0.01 }, { duration: 200, easing: tween.easeOut }); // Check for chaos trigger if (!chaosMode && beesEaten > BEE_LIMIT) { triggerChaos(); } } // --- Chaos Mode --- function triggerChaos() { chaosMode = true; chaosTxt.visible = true; infoTxt.setText('Too many bees eaten!'); // All remaining bees start escaping for (var i = 0; i < bees.length; i++) { bees[i].startEscape(); } // Spawn extra survivor bees for (var j = 0; j < CHAOS_BEE_COUNT; j++) { var bx = 200 + Math.random() * (GAME_WIDTH - 400); var by = 400 + Math.random() * (GAME_HEIGHT - 800); var bee = spawnBee(bx, by); bee.startEscape(); } // King Bee shakes (flash red) LK.effects.flashObject(kingBee, 0xff2222, 800); // Show chaos message for 2 seconds if (chaosTimeout) LK.clearTimeout(chaosTimeout); chaosTimeout = LK.setTimeout(function () { chaosTxt.visible = false; }, 2000); } // --- Eliminating Survivor Bees in Chaos Mode --- function eliminateBee(bee) { // Animate bee turning gray and shrinking var deadBee = LK.getAsset('beeDead', { anchorX: 0.5, anchorY: 0.5, x: bee.x, y: bee.y, scaleX: bee.scaleX, scaleY: bee.scaleY }); game.addChild(deadBee); tween(deadBee, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { deadBee.destroy(); } }); bee.destroy(); for (var i = 0; i < bees.length; i++) { if (bees[i] === bee) { bees.splice(i, 1); break; } } // If all bees eliminated, restore order (win) if (bees.length === 0) { LK.setScore(beesEaten); LK.showYouWin(); } } // --- Main Game Update --- game.update = function () { // Update all bees for (var i = bees.length - 1; i >= 0; i--) { var bee = bees[i]; if (bee.update) bee.update(); // If bee is escaping and out of bounds, remove it if (bee.escaping) { if (bee.x < -100 || bee.x > GAME_WIDTH + 100 || bee.y < -100 || bee.y > GAME_HEIGHT + 100) { bee.destroy(); bees.splice(i, 1); continue; } } // If not in chaos mode, check for eating if (!chaosMode) { if (kingBee.intersects(bee)) { eatBee(bee); } } } }; // --- Touch to eliminate bees in chaos mode --- game.down = function (x, y, obj) { // Drag King Bee if not in chaos mode if (!chaosMode) { var local = kingBee.toLocal(game.toGlobal({ x: x, y: y })); if (Math.abs(local.x) < kingBee.width / 2 && Math.abs(local.y) < kingBee.height / 2) { dragNode = kingBee; } } else { // In chaos mode, tap bees to eliminate for (var i = bees.length - 1; i >= 0; i--) { var bee = bees[i]; var local = bee.toLocal(game.toGlobal({ x: x, y: y })); if (Math.abs(local.x) < bee.width / 2 && Math.abs(local.y) < bee.height / 2) { eliminateBee(bee); break; } } } }; game.up = function (x, y, obj) { dragNode = null; }; // --- Reset on Game Over --- game.onGameOver = function () { // Not needed, LK handles reset }; // --- Prevent elements in top left 100x100 --- /* All GUI elements are centered or top center, and bees/king bee are not spawned in top left. */ /* End of game code */
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bee class (bees to be eaten)
var Bee = Container.expand(function () {
var self = Container.call(this);
// Attach Bee asset (smaller yellow ellipse)
var bee = self.attachAsset('bee', {
anchorX: 0.5,
anchorY: 0.5
});
// Randomize bee size a bit
var scale = 0.5 + Math.random() * 0.2;
bee.scaleX = scale;
bee.scaleY = scale;
// Bee speed (for chaos mode)
self.vx = 0;
self.vy = 0;
self.escaping = false;
// For chaos mode: set bee to escape in a random direction
self.startEscape = function () {
self.escaping = true;
// Random direction and speed
var angle = Math.random() * Math.PI * 2;
var speed = 8 + Math.random() * 6;
self.vx = Math.cos(angle) * speed;
self.vy = Math.sin(angle) * speed;
};
// Update method for bee
self.update = function () {
if (self.escaping) {
self.x += self.vx;
self.y += self.vy;
}
};
return self;
});
// KingBee class (the player)
var KingBee = Container.expand(function () {
var self = Container.call(this);
// Attach King Bee asset (big yellow ellipse)
var kingBee = self.attachAsset('kingBee', {
anchorX: 0.5,
anchorY: 0.5
});
// Set initial scale for King Bee
kingBee.scaleX = 1.2;
kingBee.scaleY = 1.2;
// For collision, use self as the hitbox
// Dragging state
self.isDragging = false;
// Event handlers for touch
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: 0xffe066 // Honey yellow background
});
/****
* Game Code
****/
// Tween plugin for animations
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var BEE_LIMIT = 60;
var INITIAL_BEE_COUNT = 20;
var CHAOS_BEE_COUNT = 30;
// Game state
var kingBee;
var bees = [];
var chaosMode = false;
var beesEaten = 0;
var dragNode = null;
var lastIntersectingBee = null;
var scoreTxt;
var infoTxt;
var chaosTxt;
var chaosTimeout = null;
// --- Asset Initialization (shapes) ---
// For dead bees
// --- GUI Elements ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
infoTxt = new Text2('Eat bees! Don\'t exceed 60.', {
size: 70,
fill: 0x222222
});
infoTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(infoTxt);
infoTxt.y = 130;
chaosTxt = new Text2('CHAOS! Eliminate survivors!', {
size: 120,
fill: 0xFF2222
});
chaosTxt.anchor.set(0.5, 0.5);
chaosTxt.visible = false;
LK.gui.center.addChild(chaosTxt);
// --- King Bee ---
kingBee = new KingBee();
game.addChild(kingBee);
// Start in the center of the hive
kingBee.x = GAME_WIDTH / 2;
kingBee.y = GAME_HEIGHT / 2 + 200;
// --- Bee Spawning ---
function spawnBee(x, y) {
var bee = new Bee();
bee.x = x;
bee.y = y;
bees.push(bee);
game.addChild(bee);
return bee;
}
// Place bees randomly in the hive (not too close to King Bee)
function spawnInitialBees(count) {
for (var i = 0; i < count; i++) {
var placed = false;
var tries = 0;
while (!placed && tries < 20) {
var bx = 200 + Math.random() * (GAME_WIDTH - 400);
var by = 400 + Math.random() * (GAME_HEIGHT - 800);
// Don't spawn too close to King Bee
var dx = bx - kingBee.x;
var dy = by - kingBee.y;
if (dx * dx + dy * dy > 400 * 400) {
spawnBee(bx, by);
placed = true;
}
tries++;
}
}
}
spawnInitialBees(INITIAL_BEE_COUNT);
// --- Dragging King Bee ---
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp to game area, keep King Bee inside
var kbw = kingBee.width / 2;
var kbh = kingBee.height / 2;
kingBee.x = Math.max(kbw, Math.min(GAME_WIDTH - kbw, x));
kingBee.y = Math.max(kbh, Math.min(GAME_HEIGHT - kbh, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on King Bee
var local = kingBee.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) < kingBee.width / 2 && Math.abs(local.y) < kingBee.height / 2) {
dragNode = kingBee;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// --- Eating Bees ---
function eatBee(bee) {
// Animate bee shrinking and fading out
tween(bee, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 250,
easing: tween.easeIn,
onFinish: function onFinish() {
bee.destroy();
}
});
// Remove from bees array
for (var i = 0; i < bees.length; i++) {
if (bees[i] === bee) {
bees.splice(i, 1);
break;
}
}
beesEaten++;
scoreTxt.setText(beesEaten);
// King Bee grows slightly
tween(kingBee, {
scaleX: 1.2 + beesEaten * 0.01,
scaleY: 1.2 + beesEaten * 0.01
}, {
duration: 200,
easing: tween.easeOut
});
// Check for chaos trigger
if (!chaosMode && beesEaten > BEE_LIMIT) {
triggerChaos();
}
}
// --- Chaos Mode ---
function triggerChaos() {
chaosMode = true;
chaosTxt.visible = true;
infoTxt.setText('Too many bees eaten!');
// All remaining bees start escaping
for (var i = 0; i < bees.length; i++) {
bees[i].startEscape();
}
// Spawn extra survivor bees
for (var j = 0; j < CHAOS_BEE_COUNT; j++) {
var bx = 200 + Math.random() * (GAME_WIDTH - 400);
var by = 400 + Math.random() * (GAME_HEIGHT - 800);
var bee = spawnBee(bx, by);
bee.startEscape();
}
// King Bee shakes (flash red)
LK.effects.flashObject(kingBee, 0xff2222, 800);
// Show chaos message for 2 seconds
if (chaosTimeout) LK.clearTimeout(chaosTimeout);
chaosTimeout = LK.setTimeout(function () {
chaosTxt.visible = false;
}, 2000);
}
// --- Eliminating Survivor Bees in Chaos Mode ---
function eliminateBee(bee) {
// Animate bee turning gray and shrinking
var deadBee = LK.getAsset('beeDead', {
anchorX: 0.5,
anchorY: 0.5,
x: bee.x,
y: bee.y,
scaleX: bee.scaleX,
scaleY: bee.scaleY
});
game.addChild(deadBee);
tween(deadBee, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
deadBee.destroy();
}
});
bee.destroy();
for (var i = 0; i < bees.length; i++) {
if (bees[i] === bee) {
bees.splice(i, 1);
break;
}
}
// If all bees eliminated, restore order (win)
if (bees.length === 0) {
LK.setScore(beesEaten);
LK.showYouWin();
}
}
// --- Main Game Update ---
game.update = function () {
// Update all bees
for (var i = bees.length - 1; i >= 0; i--) {
var bee = bees[i];
if (bee.update) bee.update();
// If bee is escaping and out of bounds, remove it
if (bee.escaping) {
if (bee.x < -100 || bee.x > GAME_WIDTH + 100 || bee.y < -100 || bee.y > GAME_HEIGHT + 100) {
bee.destroy();
bees.splice(i, 1);
continue;
}
}
// If not in chaos mode, check for eating
if (!chaosMode) {
if (kingBee.intersects(bee)) {
eatBee(bee);
}
}
}
};
// --- Touch to eliminate bees in chaos mode ---
game.down = function (x, y, obj) {
// Drag King Bee if not in chaos mode
if (!chaosMode) {
var local = kingBee.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) < kingBee.width / 2 && Math.abs(local.y) < kingBee.height / 2) {
dragNode = kingBee;
}
} else {
// In chaos mode, tap bees to eliminate
for (var i = bees.length - 1; i >= 0; i--) {
var bee = bees[i];
var local = bee.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) < bee.width / 2 && Math.abs(local.y) < bee.height / 2) {
eliminateBee(bee);
break;
}
}
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// --- Reset on Game Over ---
game.onGameOver = function () {
// Not needed, LK handles reset
};
// --- Prevent elements in top left 100x100 ---
/* All GUI elements are centered or top center, and bees/king bee are not spawned in top left. */
/* End of game code */