/****
* 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
});