/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // AI Bee var AIBee = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('aiBeeBody', { anchorX: 0.5, anchorY: 0.5 }); var stripe1 = self.attachAsset('aiBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: -18 }); var stripe2 = self.attachAsset('aiBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: 0 }); var stripe3 = self.attachAsset('aiBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: 18 }); var wingL = self.attachAsset('aiBeeWingL', { anchorX: 0.7, anchorY: 0.7, x: -28, y: -18, rotation: -0.3 }); var wingR = self.attachAsset('aiBeeWingR', { anchorX: 0.3, anchorY: 0.7, x: 28, y: -18, rotation: 0.3 }); // Movement variables self.dir = Math.random() * Math.PI * 2; self.speed = 6 + Math.random() * 4; self.wanderTime = 60 + Math.floor(Math.random() * 120); self.update = function () { self.x += Math.cos(self.dir) * self.speed; self.y += Math.sin(self.dir) * self.speed; self.wanderTime--; if (self.wanderTime <= 0) { self.dir += (Math.random() - 0.5) * 1.2; self.speed = 6 + Math.random() * 4; self.wanderTime = 60 + Math.floor(Math.random() * 120); } // Bounce off edges if (self.x < 80) { self.x = 80; self.dir = Math.PI - self.dir; } if (self.x > 2048 - 80) { self.x = 2048 - 80; self.dir = Math.PI - self.dir; } if (self.y < 200) { self.y = 200; self.dir = -self.dir; } if (self.y > 2732 - 120) { self.y = 2732 - 120; self.dir = -self.dir; } }; return self; }); // Directional Button var DirButton = Container.expand(function () { var self = Container.call(this); // bg var bg = self.attachAsset('buttonBg', { anchorX: 0.5, anchorY: 0.5 }); // arrow self.arrow = null; // will be set by user return self; }); // Flower var Flower = Container.expand(function () { var self = Container.call(this); // 5 petals for (var i = 0; i < 5; i++) { var angle = i * (Math.PI * 2 / 5); var petal = self.attachAsset('flowerPetal', { anchorX: 0.5, anchorY: 0.5, x: Math.cos(angle) * 28, y: Math.sin(angle) * 28, rotation: angle }); } // Center var center = self.attachAsset('flowerCenter', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; return self; }); // Hive var Hive = Container.expand(function () { var self = Container.call(this); var base = self.attachAsset('hiveBase', { anchorX: 0.5, anchorY: 0.5 }); var entrance = self.attachAsset('hiveEntrance', { anchorX: 0.5, anchorY: 0.5, y: 30 }); return self; }); // Player Bee var PlayerBee = Container.expand(function () { var self = Container.call(this); // Body var body = self.attachAsset('playerBeeBody', { anchorX: 0.5, anchorY: 0.5 }); // Stripes var stripe1 = self.attachAsset('playerBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: -30 }); var stripe2 = self.attachAsset('playerBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: 0 }); var stripe3 = self.attachAsset('playerBeeStripe', { anchorX: 0.5, anchorY: 0.5, x: 30 }); // Wings var wingL = self.attachAsset('playerBeeWingL', { anchorX: 0.7, anchorY: 0.7, x: -40, y: -30, rotation: -0.3 }); var wingR = self.attachAsset('playerBeeWingR', { anchorX: 0.3, anchorY: 0.7, x: 40, y: -30, rotation: 0.3 }); // Hair (pink, cartoon, big) var hair = self.attachAsset('playerBeeHair', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -40, scaleX: 1.2, scaleY: 1.2 }); // Eyes (blue, cartoon, big) var eyeL = self.attachAsset('playerBeeEyeL', { anchorX: 0.5, anchorY: 0.5, x: -22, y: -10, scaleX: 1.2, scaleY: 1.2 }); var eyeR = self.attachAsset('playerBeeEyeR', { anchorX: 0.5, anchorY: 0.5, x: 22, y: -10, scaleX: 1.2, scaleY: 1.2 }); // Pollen (shows when carrying) var pollen = self.attachAsset('pollen', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 50 }); pollen.visible = false; self.hasPollen = false; self.showPollen = function (show) { pollen.visible = show; self.hasPollen = show; }; // For movement self.speed = 16; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x9be7a6 // prairie green }); /**** * Game Code ****/ // Add cartoon flower field background var bgFlowers = []; for (var i = 0; i < 60; i++) { var flower = new Flower(); flower.x = 100 + Math.random() * (2048 - 200); flower.y = 250 + Math.random() * (2732 - 400); flower.alpha = 0.18 + Math.random() * 0.12; bgFlowers.push(flower); game.addChild(flower); } // UI // Pollen (carried by bee) // Hive // Flower (collectible) // AI bee (simpler, yellow/black) // Main bee (player) - cartoon, pink hair, blue eyes // --- Global variables --- var playerBee; var aiBees = []; var flowers = []; var hive; var pollenDelivered = 0; var pollenRequired = 6; var level = 1; var canMove = { up: false, down: false, left: false, right: false }; var moveCooldown = 0; var playerName = ''; var nameTxt, pinkBar; var pollenTxt; var levelTxt; var dirButtons = {}; var lastMoveTick = 0; // --- Helper: Generate random bee name (French style) --- function randomBeeName() { var prenoms = ["Maya", "Jahia", "Mielys", "Pollenis", "Sara", "Bubuze", "willy", "Eva", "mona", "Gina", "Aya", "Clem", "Julie", "Olivia", "Martine", "Paula", "Tina", "Karine", "laura"]; var suffixes = ["-Rbzz", "-Rmiel"]; var prenom = prenoms[Math.floor(Math.random() * prenoms.length)]; var suffix = suffixes[Math.floor(Math.random() * suffixes.length)]; var chiffres = ""; for (var i = 0; i < 6; i++) { chiffres += Math.floor(Math.random() * 10); } return prenom + suffix + chiffres; } // --- Helper: Place flowers randomly, not too close to hive or each other --- function placeFlowers(num) { flowers = []; for (var i = 0; i < num; i++) { var tries = 0; var fx, fy, ok; do { fx = 180 + Math.random() * (2048 - 360); fy = 350 + Math.random() * (2732 - 700); ok = true; // Not too close to hive if (Math.abs(fx - hive.x) < 220 && Math.abs(fy - hive.y) < 220) { ok = false; } // Not too close to other flowers for (var j = 0; j < flowers.length; j++) { var f2 = flowers[j]; if (Math.abs(fx - f2.x) < 120 && Math.abs(fy - f2.y) < 120) { ok = false; } } tries++; } while (!ok && tries < 20); var flower = new Flower(); flower.x = fx; flower.y = fy; flowers.push(flower); game.addChild(flower); } } // --- Helper: Place AI bees randomly --- function placeAIBees(num) { aiBees = []; for (var i = 0; i < num; i++) { var bee = new AIBee(); bee.x = 200 + Math.random() * (2048 - 400); bee.y = 400 + Math.random() * (2732 - 800); aiBees.push(bee); game.addChild(bee); } } // --- Helper: Reset level --- function startLevel(lvl) { level = lvl; pollenDelivered = 0; pollenRequired = 6 * Math.pow(2, level - 1); // Remove old flowers for (var i = 0; i < flowers.length; i++) { flowers[i].destroy(); } flowers = []; // Place new flowers placeFlowers(Math.min(8 + level * 2, 20)); // Update pollen text pollenTxt.setText('Pollen: ' + pollenDelivered + ' / ' + pollenRequired); // Update level and next pollen requirement text in pink bar levelTxt.setText('Niveau: ' + level); if (typeof nextPollenTxt !== "undefined") { var pollenRestant = Math.max(0, pollenRequired - pollenDelivered); nextPollenTxt.setText('Pollen avant niveau sup.: ' + pollenRestant); } // Reset bee playerBee.x = 2048 / 2; playerBee.y = 2732 - 300; playerBee.showPollen(false); playerBee.lastWasInHive = false; } // --- Helper: Check collision (circle approx) --- function isColliding(a, b, r) { var dx = a.x - b.x; var dy = a.y - b.y; return dx * dx + dy * dy < r * r; } // --- UI: Pink bar and name, level, pollen requirement --- // Create a container for the pink bar UI and add it to the top GUI (centered) var pinkBarContainer = new Container(); // Center the pink bar at the top of the screen using LK.gui.top (centered horizontally) pinkBarContainer.x = 0; pinkBarContainer.y = 0; LK.gui.top.addChild(pinkBarContainer); // Pink bar background pinkBar = LK.getAsset('pinkBar', { anchorX: 0.5, anchorY: 0, x: 0, y: 0 }); pinkBarContainer.addChild(pinkBar); // Generate player name as described playerName = randomBeeName(); nameTxt = new Text2(playerName, { size: 60, fill: "#111" // noir }); nameTxt.anchor.set(0.5, 0.5); nameTxt.x = 0; nameTxt.y = 45; pinkBarContainer.addChild(nameTxt); // Level and pollen requirement, stacked vertically and centered levelTxt = new Text2('Niveau: 1', { size: 44, fill: "#111" }); levelTxt.anchor.set(0.5, 0.5); levelTxt.x = 0; levelTxt.y = nameTxt.y + 55; pinkBarContainer.addChild(levelTxt); nextPollenTxt = new Text2('Prochain niveau: 12 pollen', { size: 38, fill: "#111" }); nextPollenTxt.anchor.set(0.5, 0.5); nextPollenTxt.x = 0; nextPollenTxt.y = levelTxt.y + 48; pinkBarContainer.addChild(nextPollenTxt); // --- UI: Pollen counter --- pollenTxt = new Text2('Pollen: 0 / 6', { size: 60, fill: "#222" }); pollenTxt.anchor.set(0.5, 0.5); pollenTxt.x = 2048 / 2; // Place pollen counter below the pink bar for clarity pollenTxt.y = pinkBarContainer.y + pinkBar.height + 30; LK.gui.top.addChild(pollenTxt); // --- Place hive --- hive = new Hive(); hive.x = 2048 / 2; hive.y = 320; game.addChild(hive); // --- Place player bee --- playerBee = new PlayerBee(); playerBee.x = 2048 / 2; playerBee.y = 2732 - 300; playerBee.lastWasInHive = false; game.addChild(playerBee); // --- Place AI bees --- placeAIBees(6); // --- Place flowers --- placeFlowers(10); // --- Directional Buttons (bottom left/right) --- function createDirButton(dir, x, y, arrowType) { var btn = new DirButton(); btn.x = x; btn.y = y; // Arrow var arrow; if (arrowType === 'up') { arrow = btn.attachAsset('buttonArrowUp', { anchorX: 0.5, anchorY: 0.5, y: -10 }); } else if (arrowType === 'down') { arrow = btn.attachAsset('buttonArrowDown', { anchorX: 0.5, anchorY: 0.5, y: 10, rotation: Math.PI }); } else if (arrowType === 'left') { arrow = btn.attachAsset('buttonArrowLeft', { anchorX: 0.5, anchorY: 0.5, x: -10, rotation: -Math.PI / 2 }); } else if (arrowType === 'right') { arrow = btn.attachAsset('buttonArrowRight', { anchorX: 0.5, anchorY: 0.5, x: 10, rotation: Math.PI / 2 }); } btn.arrow = arrow; // Touch events btn.down = function (x, y, obj) { canMove[dir] = true; lastMoveTick = LK.ticks; }; btn.up = function (x, y, obj) { canMove[dir] = false; }; btn.move = function (x, y, obj) { // If finger moves off, stop // Use the x, y provided by the event, which are already in game coordinates // Convert to local coordinates of the button var globalPoint = { x: x, y: y }; // Manually convert global to local for btn var local = { x: globalPoint.x - btn.x, y: globalPoint.y - btn.y }; if (local.x < -80 || local.x > 80 || local.y < -80 || local.y > 80) { canMove[dir] = false; } }; LK.gui.bottomLeft.addChild(btn); return btn; } // Place buttons, avoid top left 100x100 dirButtons.up = createDirButton('up', 180, -220, 'up'); dirButtons.down = createDirButton('down', 180, -60, 'down'); dirButtons.left = createDirButton('left', 60, -140, 'left'); dirButtons.right = createDirButton('right', 300, -140, 'right'); // --- Movement logic --- function movePlayerBee() { var dx = 0, dy = 0; if (canMove.up) { dy -= 1; } if (canMove.down) { dy += 1; } if (canMove.left) { dx -= 1; } if (canMove.right) { dx += 1; } if (dx !== 0 || dy !== 0) { var len = Math.sqrt(dx * dx + dy * dy); dx /= len; dy /= len; var nx = playerBee.x + dx * playerBee.speed; var ny = playerBee.y + dy * playerBee.speed; // Clamp to game area nx = Math.max(80, Math.min(2048 - 80, nx)); ny = Math.max(220, Math.min(2732 - 120, ny)); playerBee.x = nx; playerBee.y = ny; } } // --- Main game update --- game.update = function () { // Move player movePlayerBee(); // Move AI bees for (var i = 0; i < aiBees.length; i++) { aiBees[i].update(); } // If not carrying pollen, check for flower collision if (!playerBee.hasPollen) { for (var i = 0; i < flowers.length; i++) { var f = flowers[i]; if (!f.collected && isColliding(playerBee, f, 70)) { f.collected = true; f.visible = false; playerBee.showPollen(true); break; } } // If all flowers are collected, generate new ones var allCollected = true; for (var i = 0; i < flowers.length; i++) { if (!flowers[i].collected) { allCollected = false; break; } } if (allCollected) { // Remove old flower objects from game for (var i = 0; i < flowers.length; i++) { flowers[i].destroy(); } // Place new flowers (same number as before, or at least 10) placeFlowers(Math.max(10, Math.min(8 + level * 2, 20))); } } else { // Only count pollen as delivered when bee enters hive (collision transition) if (playerBee.lastWasInHive !== true && isColliding(playerBee, hive, 100) && playerBee.hasPollen) { pollenDelivered++; playerBee.showPollen(false); pollenTxt.setText('Pollen: ' + pollenDelivered + ' / ' + pollenRequired); // Update next pollen text to show remaining pollen before next level if (typeof nextPollenTxt !== "undefined") { var pollenRestant = Math.max(0, pollenRequired - pollenDelivered); nextPollenTxt.setText('Pollen avant niveau sup.: ' + pollenRestant); } // Level up if (pollenDelivered >= pollenRequired) { // Show win, then start next level LK.effects.flashScreen(0xffe066, 800); LK.setTimeout(function () { startLevel(level + 1); }, 1200); } } playerBee.lastWasInHive = isColliding(playerBee, hive, 100); } }; // --- Start first level --- startLevel(1); // --- Touch up anywhere stops movement --- game.up = function (x, y, obj) { canMove.up = canMove.down = canMove.left = canMove.right = false; }; // --- Prevent accidental movement on drag off buttons --- game.move = function (x, y, obj) { // No-op, handled in button.move }; // Play background music using LK engine LK.playMusic('bgmusic', { loop: true });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// AI Bee
var AIBee = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('aiBeeBody', {
anchorX: 0.5,
anchorY: 0.5
});
var stripe1 = self.attachAsset('aiBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: -18
});
var stripe2 = self.attachAsset('aiBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: 0
});
var stripe3 = self.attachAsset('aiBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: 18
});
var wingL = self.attachAsset('aiBeeWingL', {
anchorX: 0.7,
anchorY: 0.7,
x: -28,
y: -18,
rotation: -0.3
});
var wingR = self.attachAsset('aiBeeWingR', {
anchorX: 0.3,
anchorY: 0.7,
x: 28,
y: -18,
rotation: 0.3
});
// Movement variables
self.dir = Math.random() * Math.PI * 2;
self.speed = 6 + Math.random() * 4;
self.wanderTime = 60 + Math.floor(Math.random() * 120);
self.update = function () {
self.x += Math.cos(self.dir) * self.speed;
self.y += Math.sin(self.dir) * self.speed;
self.wanderTime--;
if (self.wanderTime <= 0) {
self.dir += (Math.random() - 0.5) * 1.2;
self.speed = 6 + Math.random() * 4;
self.wanderTime = 60 + Math.floor(Math.random() * 120);
}
// Bounce off edges
if (self.x < 80) {
self.x = 80;
self.dir = Math.PI - self.dir;
}
if (self.x > 2048 - 80) {
self.x = 2048 - 80;
self.dir = Math.PI - self.dir;
}
if (self.y < 200) {
self.y = 200;
self.dir = -self.dir;
}
if (self.y > 2732 - 120) {
self.y = 2732 - 120;
self.dir = -self.dir;
}
};
return self;
});
// Directional Button
var DirButton = Container.expand(function () {
var self = Container.call(this);
// bg
var bg = self.attachAsset('buttonBg', {
anchorX: 0.5,
anchorY: 0.5
});
// arrow
self.arrow = null; // will be set by user
return self;
});
// Flower
var Flower = Container.expand(function () {
var self = Container.call(this);
// 5 petals
for (var i = 0; i < 5; i++) {
var angle = i * (Math.PI * 2 / 5);
var petal = self.attachAsset('flowerPetal', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.cos(angle) * 28,
y: Math.sin(angle) * 28,
rotation: angle
});
}
// Center
var center = self.attachAsset('flowerCenter', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
return self;
});
// Hive
var Hive = Container.expand(function () {
var self = Container.call(this);
var base = self.attachAsset('hiveBase', {
anchorX: 0.5,
anchorY: 0.5
});
var entrance = self.attachAsset('hiveEntrance', {
anchorX: 0.5,
anchorY: 0.5,
y: 30
});
return self;
});
// Player Bee
var PlayerBee = Container.expand(function () {
var self = Container.call(this);
// Body
var body = self.attachAsset('playerBeeBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Stripes
var stripe1 = self.attachAsset('playerBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: -30
});
var stripe2 = self.attachAsset('playerBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: 0
});
var stripe3 = self.attachAsset('playerBeeStripe', {
anchorX: 0.5,
anchorY: 0.5,
x: 30
});
// Wings
var wingL = self.attachAsset('playerBeeWingL', {
anchorX: 0.7,
anchorY: 0.7,
x: -40,
y: -30,
rotation: -0.3
});
var wingR = self.attachAsset('playerBeeWingR', {
anchorX: 0.3,
anchorY: 0.7,
x: 40,
y: -30,
rotation: 0.3
});
// Hair (pink, cartoon, big)
var hair = self.attachAsset('playerBeeHair', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -40,
scaleX: 1.2,
scaleY: 1.2
});
// Eyes (blue, cartoon, big)
var eyeL = self.attachAsset('playerBeeEyeL', {
anchorX: 0.5,
anchorY: 0.5,
x: -22,
y: -10,
scaleX: 1.2,
scaleY: 1.2
});
var eyeR = self.attachAsset('playerBeeEyeR', {
anchorX: 0.5,
anchorY: 0.5,
x: 22,
y: -10,
scaleX: 1.2,
scaleY: 1.2
});
// Pollen (shows when carrying)
var pollen = self.attachAsset('pollen', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 50
});
pollen.visible = false;
self.hasPollen = false;
self.showPollen = function (show) {
pollen.visible = show;
self.hasPollen = show;
};
// For movement
self.speed = 16;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x9be7a6 // prairie green
});
/****
* Game Code
****/
// Add cartoon flower field background
var bgFlowers = [];
for (var i = 0; i < 60; i++) {
var flower = new Flower();
flower.x = 100 + Math.random() * (2048 - 200);
flower.y = 250 + Math.random() * (2732 - 400);
flower.alpha = 0.18 + Math.random() * 0.12;
bgFlowers.push(flower);
game.addChild(flower);
}
// UI
// Pollen (carried by bee)
// Hive
// Flower (collectible)
// AI bee (simpler, yellow/black)
// Main bee (player) - cartoon, pink hair, blue eyes
// --- Global variables ---
var playerBee;
var aiBees = [];
var flowers = [];
var hive;
var pollenDelivered = 0;
var pollenRequired = 6;
var level = 1;
var canMove = {
up: false,
down: false,
left: false,
right: false
};
var moveCooldown = 0;
var playerName = '';
var nameTxt, pinkBar;
var pollenTxt;
var levelTxt;
var dirButtons = {};
var lastMoveTick = 0;
// --- Helper: Generate random bee name (French style) ---
function randomBeeName() {
var prenoms = ["Maya", "Jahia", "Mielys", "Pollenis", "Sara", "Bubuze", "willy", "Eva", "mona", "Gina", "Aya", "Clem", "Julie", "Olivia", "Martine", "Paula", "Tina", "Karine", "laura"];
var suffixes = ["-Rbzz", "-Rmiel"];
var prenom = prenoms[Math.floor(Math.random() * prenoms.length)];
var suffix = suffixes[Math.floor(Math.random() * suffixes.length)];
var chiffres = "";
for (var i = 0; i < 6; i++) {
chiffres += Math.floor(Math.random() * 10);
}
return prenom + suffix + chiffres;
}
// --- Helper: Place flowers randomly, not too close to hive or each other ---
function placeFlowers(num) {
flowers = [];
for (var i = 0; i < num; i++) {
var tries = 0;
var fx, fy, ok;
do {
fx = 180 + Math.random() * (2048 - 360);
fy = 350 + Math.random() * (2732 - 700);
ok = true;
// Not too close to hive
if (Math.abs(fx - hive.x) < 220 && Math.abs(fy - hive.y) < 220) {
ok = false;
}
// Not too close to other flowers
for (var j = 0; j < flowers.length; j++) {
var f2 = flowers[j];
if (Math.abs(fx - f2.x) < 120 && Math.abs(fy - f2.y) < 120) {
ok = false;
}
}
tries++;
} while (!ok && tries < 20);
var flower = new Flower();
flower.x = fx;
flower.y = fy;
flowers.push(flower);
game.addChild(flower);
}
}
// --- Helper: Place AI bees randomly ---
function placeAIBees(num) {
aiBees = [];
for (var i = 0; i < num; i++) {
var bee = new AIBee();
bee.x = 200 + Math.random() * (2048 - 400);
bee.y = 400 + Math.random() * (2732 - 800);
aiBees.push(bee);
game.addChild(bee);
}
}
// --- Helper: Reset level ---
function startLevel(lvl) {
level = lvl;
pollenDelivered = 0;
pollenRequired = 6 * Math.pow(2, level - 1);
// Remove old flowers
for (var i = 0; i < flowers.length; i++) {
flowers[i].destroy();
}
flowers = [];
// Place new flowers
placeFlowers(Math.min(8 + level * 2, 20));
// Update pollen text
pollenTxt.setText('Pollen: ' + pollenDelivered + ' / ' + pollenRequired);
// Update level and next pollen requirement text in pink bar
levelTxt.setText('Niveau: ' + level);
if (typeof nextPollenTxt !== "undefined") {
var pollenRestant = Math.max(0, pollenRequired - pollenDelivered);
nextPollenTxt.setText('Pollen avant niveau sup.: ' + pollenRestant);
}
// Reset bee
playerBee.x = 2048 / 2;
playerBee.y = 2732 - 300;
playerBee.showPollen(false);
playerBee.lastWasInHive = false;
}
// --- Helper: Check collision (circle approx) ---
function isColliding(a, b, r) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return dx * dx + dy * dy < r * r;
}
// --- UI: Pink bar and name, level, pollen requirement ---
// Create a container for the pink bar UI and add it to the top GUI (centered)
var pinkBarContainer = new Container();
// Center the pink bar at the top of the screen using LK.gui.top (centered horizontally)
pinkBarContainer.x = 0;
pinkBarContainer.y = 0;
LK.gui.top.addChild(pinkBarContainer);
// Pink bar background
pinkBar = LK.getAsset('pinkBar', {
anchorX: 0.5,
anchorY: 0,
x: 0,
y: 0
});
pinkBarContainer.addChild(pinkBar);
// Generate player name as described
playerName = randomBeeName();
nameTxt = new Text2(playerName, {
size: 60,
fill: "#111" // noir
});
nameTxt.anchor.set(0.5, 0.5);
nameTxt.x = 0;
nameTxt.y = 45;
pinkBarContainer.addChild(nameTxt);
// Level and pollen requirement, stacked vertically and centered
levelTxt = new Text2('Niveau: 1', {
size: 44,
fill: "#111"
});
levelTxt.anchor.set(0.5, 0.5);
levelTxt.x = 0;
levelTxt.y = nameTxt.y + 55;
pinkBarContainer.addChild(levelTxt);
nextPollenTxt = new Text2('Prochain niveau: 12 pollen', {
size: 38,
fill: "#111"
});
nextPollenTxt.anchor.set(0.5, 0.5);
nextPollenTxt.x = 0;
nextPollenTxt.y = levelTxt.y + 48;
pinkBarContainer.addChild(nextPollenTxt);
// --- UI: Pollen counter ---
pollenTxt = new Text2('Pollen: 0 / 6', {
size: 60,
fill: "#222"
});
pollenTxt.anchor.set(0.5, 0.5);
pollenTxt.x = 2048 / 2;
// Place pollen counter below the pink bar for clarity
pollenTxt.y = pinkBarContainer.y + pinkBar.height + 30;
LK.gui.top.addChild(pollenTxt);
// --- Place hive ---
hive = new Hive();
hive.x = 2048 / 2;
hive.y = 320;
game.addChild(hive);
// --- Place player bee ---
playerBee = new PlayerBee();
playerBee.x = 2048 / 2;
playerBee.y = 2732 - 300;
playerBee.lastWasInHive = false;
game.addChild(playerBee);
// --- Place AI bees ---
placeAIBees(6);
// --- Place flowers ---
placeFlowers(10);
// --- Directional Buttons (bottom left/right) ---
function createDirButton(dir, x, y, arrowType) {
var btn = new DirButton();
btn.x = x;
btn.y = y;
// Arrow
var arrow;
if (arrowType === 'up') {
arrow = btn.attachAsset('buttonArrowUp', {
anchorX: 0.5,
anchorY: 0.5,
y: -10
});
} else if (arrowType === 'down') {
arrow = btn.attachAsset('buttonArrowDown', {
anchorX: 0.5,
anchorY: 0.5,
y: 10,
rotation: Math.PI
});
} else if (arrowType === 'left') {
arrow = btn.attachAsset('buttonArrowLeft', {
anchorX: 0.5,
anchorY: 0.5,
x: -10,
rotation: -Math.PI / 2
});
} else if (arrowType === 'right') {
arrow = btn.attachAsset('buttonArrowRight', {
anchorX: 0.5,
anchorY: 0.5,
x: 10,
rotation: Math.PI / 2
});
}
btn.arrow = arrow;
// Touch events
btn.down = function (x, y, obj) {
canMove[dir] = true;
lastMoveTick = LK.ticks;
};
btn.up = function (x, y, obj) {
canMove[dir] = false;
};
btn.move = function (x, y, obj) {
// If finger moves off, stop
// Use the x, y provided by the event, which are already in game coordinates
// Convert to local coordinates of the button
var globalPoint = {
x: x,
y: y
};
// Manually convert global to local for btn
var local = {
x: globalPoint.x - btn.x,
y: globalPoint.y - btn.y
};
if (local.x < -80 || local.x > 80 || local.y < -80 || local.y > 80) {
canMove[dir] = false;
}
};
LK.gui.bottomLeft.addChild(btn);
return btn;
}
// Place buttons, avoid top left 100x100
dirButtons.up = createDirButton('up', 180, -220, 'up');
dirButtons.down = createDirButton('down', 180, -60, 'down');
dirButtons.left = createDirButton('left', 60, -140, 'left');
dirButtons.right = createDirButton('right', 300, -140, 'right');
// --- Movement logic ---
function movePlayerBee() {
var dx = 0,
dy = 0;
if (canMove.up) {
dy -= 1;
}
if (canMove.down) {
dy += 1;
}
if (canMove.left) {
dx -= 1;
}
if (canMove.right) {
dx += 1;
}
if (dx !== 0 || dy !== 0) {
var len = Math.sqrt(dx * dx + dy * dy);
dx /= len;
dy /= len;
var nx = playerBee.x + dx * playerBee.speed;
var ny = playerBee.y + dy * playerBee.speed;
// Clamp to game area
nx = Math.max(80, Math.min(2048 - 80, nx));
ny = Math.max(220, Math.min(2732 - 120, ny));
playerBee.x = nx;
playerBee.y = ny;
}
}
// --- Main game update ---
game.update = function () {
// Move player
movePlayerBee();
// Move AI bees
for (var i = 0; i < aiBees.length; i++) {
aiBees[i].update();
}
// If not carrying pollen, check for flower collision
if (!playerBee.hasPollen) {
for (var i = 0; i < flowers.length; i++) {
var f = flowers[i];
if (!f.collected && isColliding(playerBee, f, 70)) {
f.collected = true;
f.visible = false;
playerBee.showPollen(true);
break;
}
}
// If all flowers are collected, generate new ones
var allCollected = true;
for (var i = 0; i < flowers.length; i++) {
if (!flowers[i].collected) {
allCollected = false;
break;
}
}
if (allCollected) {
// Remove old flower objects from game
for (var i = 0; i < flowers.length; i++) {
flowers[i].destroy();
}
// Place new flowers (same number as before, or at least 10)
placeFlowers(Math.max(10, Math.min(8 + level * 2, 20)));
}
} else {
// Only count pollen as delivered when bee enters hive (collision transition)
if (playerBee.lastWasInHive !== true && isColliding(playerBee, hive, 100) && playerBee.hasPollen) {
pollenDelivered++;
playerBee.showPollen(false);
pollenTxt.setText('Pollen: ' + pollenDelivered + ' / ' + pollenRequired);
// Update next pollen text to show remaining pollen before next level
if (typeof nextPollenTxt !== "undefined") {
var pollenRestant = Math.max(0, pollenRequired - pollenDelivered);
nextPollenTxt.setText('Pollen avant niveau sup.: ' + pollenRestant);
}
// Level up
if (pollenDelivered >= pollenRequired) {
// Show win, then start next level
LK.effects.flashScreen(0xffe066, 800);
LK.setTimeout(function () {
startLevel(level + 1);
}, 1200);
}
}
playerBee.lastWasInHive = isColliding(playerBee, hive, 100);
}
};
// --- Start first level ---
startLevel(1);
// --- Touch up anywhere stops movement ---
game.up = function (x, y, obj) {
canMove.up = canMove.down = canMove.left = canMove.right = false;
};
// --- Prevent accidental movement on drag off buttons ---
game.move = function (x, y, obj) {
// No-op, handled in button.move
};
// Play background music using LK engine
LK.playMusic('bgmusic', {
loop: true
});