/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerAsset = self.attachAsset('player', { anchorX: 0.5, anchorY: 1 }); // For jump animation self.isJumping = false; return self; }); // Tree class var Tree = Container.expand(function () { var self = Container.call(this); var treeAsset = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1 }); // Add a money icon on the tree var moneyAsset = self.attachAsset('money', { anchorX: 0.5, anchorY: 0.5, y: -treeAsset.height * 0.7 }); // Used to know if this tree has been collected self.collected = false; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1e5631 // deep forest green }); /**** * Game Code ****/ // Ajoute l'asset image de fond personnalisé (remplace l'id par celui de ton image) // Ajoute l'image de fond personnalisé derrière tout le reste var backgroundImg = LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: BOARD_WIDTH, height: BOARD_HEIGHT }); game.addChildAt(backgroundImg, 0); // Ajoute au fond (index 0) // Les bonnes réponses sont définies par l'index 'c' pour chaque question // Game constants // Tree asset: green ellipse // Money asset: yellow box // Player asset: blue box /**** * Game Code /**** * Questions ****/ var QUESTIONS = [{ q: "Combien de bananes faut-il pour faire un vélo ?", a: ["Aucune, c'est absurde !", "42", "3, si elles sont très grandes"], c: 0 }, { q: "Quel animal est le plus susceptible de devenir président ?", a: ["Le lama", "Le poisson rouge", "Le pigeon voyageur"], c: 2 }, { q: "Si un arbre tombe dans une forêt et que personne ne l’entend, fait-il du bruit ?", a: ["Oui, mais il chuchote", "Non, il chante", "Seulement les jours pairs"], c: 0 }, { q: "Quelle est la couleur du cheval vert d’Henri IV ?", a: ["Vert", "Bleu", "Invisible"], c: 0 }, { q: "Combien de lunes autour de la Terre un mardi ?", a: ["Une", "Trois", "Aucune, elles sont en vacances"], c: 0 }, { q: "Quel est le cri du billet de banque ?", a: ["Chling !", "Miaou", "Bip bip"], c: 0 }, { q: "Si tu plantes une pièce de 1€, que poussera-t-il ?", a: ["Un arbre à billets", "Un distributeur", "Un cactus doré"], c: 0 }, { q: "Quel est le sport préféré des arbres ?", a: ["Le tronc-volant", "Le basket-feuille", "Le branché-ball"], c: 1 }, { q: "Combien de temps met un escargot pour faire le tour d’un arbre ?", a: ["Le temps qu’il veut", "Jamais, il s’arrête pour dormir", "42 jours"], c: 0 }, { q: "Quel est le prénom du plus riche des arbres ?", a: ["Billet", "Feuille", "Racine"], c: 1 }, // 40 nouvelles questions débiles { q: "Pourquoi les poissons ne volent-ils pas en avion ?", a: ["Ils préfèrent nager", "Ils n'ont pas de passeport", "Ils ont peur du vide"], c: 0 }, { q: "Combien de chaussettes faut-il pour habiller une pieuvre ?", a: ["Huit", "Seize", "Aucune, elle préfère être pieds nus"], c: 0 }, { q: "Quel est le fruit préféré des ordinateurs ?", a: ["La pomme", "La banane USB", "La fraise pixelisée"], c: 0 }, { q: "Que fait un canard quand il a soif ?", a: ["Il boit", "Il fait coin-coin", "Il nage à l’envers"], c: 0 }, { q: "Pourquoi les girafes n’utilisent-elles pas d’ascenseur ?", a: ["Elles sont trop grandes", "Elles préfèrent les escaliers", "Elles volent"], c: 0 }, { q: "Combien de moustaches a un chat qui se prend pour un tigre ?", a: ["Autant qu’un chat", "Aucune, il les a perdues", "42"], c: 0 }, { q: "Quel est le plat préféré des licornes ?", a: ["La salade arc-en-ciel", "Le gratin de nuages", "Les frites magiques"], c: 0 }, { q: "Pourquoi les nuages ne tombent-ils pas du ciel ?", a: ["Ils sont légers", "Ils ont des parachutes", "Ils sont collés avec du scotch"], c: 0 }, { q: "Combien de roues a un vélo carré ?", a: ["Quatre", "Aucune, il ne roule pas", "Deux, mais elles sont carrées"], c: 2 }, { q: "Quel est le métier rêvé d’un escargot ?", a: ["Pilote de Formule 1", "Coureur de marathon", "Astronaute"], c: 0 }, { q: "Pourquoi les arbres ne dansent-ils pas la salsa ?", a: ["Ils sont enracinés", "Ils préfèrent le rock", "Ils n’ont pas de chaussures"], c: 0 }, { q: "Combien de doigts a une main de géant ?", a: ["Cinq, mais très gros", "Dix", "Aucun, il a des pattes"], c: 0 }, { q: "Quel est le rêve secret d’un caillou ?", a: ["Devenir une montagne", "Voler", "Faire du surf"], c: 0 }, { q: "Pourquoi les grenouilles ne portent-elles pas de lunettes ?", a: ["Elles voient très bien", "Elles préfèrent les lentilles", "Elles n’ont pas d’oreilles"], c: 0 }, { q: "Combien de pages dans un livre invisible ?", a: ["Aucune", "42", "Autant qu’on veut"], c: 2 }, { q: "Quel est le sport préféré des fourmis ?", a: ["Le levé de miettes", "Le foot", "Le saut de brindille"], c: 0 }, { q: "Pourquoi les horloges ne mangent-elles jamais de pizza ?", a: ["Elles n’ont pas de bouche", "Elles préfèrent les pâtes", "Elles sont au régime"], c: 0 }, { q: "Combien de couleurs dans un arc-en-ciel en noir et blanc ?", a: ["Aucune", "Deux", "Sept"], c: 1 }, { q: "Quel est le cri du nuage ?", a: ["Pschhh", "Boum", "Ploc"], c: 0 }, { q: "Pourquoi les lapins ne font-ils pas de vélo ?", a: ["Ils préfèrent sauter", "Ils n’ont pas de casque", "Ils sont trop rapides"], c: 0 }, { q: "Combien de dents a un crocodile en peluche ?", a: ["Aucune", "Deux", "Autant qu’il veut"], c: 0 }, { q: "Quel est le dessert préféré des robots ?", a: ["Le circuit glacé", "La tarte à la RAM", "Le gâteau binaire"], c: 0 }, { q: "Pourquoi les étoiles filantes ne s’arrêtent-elles jamais ?", a: ["Elles sont pressées", "Elles n’ont pas de freins", "Elles aiment voyager"], c: 1 }, { q: "Combien de boutons sur la chemise d’un fantôme ?", a: ["Aucun", "Un", "Autant que de trous"], c: 0 }, { q: "Quel est le jeu préféré des grenouilles ?", a: ["La marelle", "Le saute-mouton", "Le cache-cache"], c: 0 }, { q: "Pourquoi les éléphants ne se cachent-ils pas dans les arbres ?", a: ["On les verrait", "Ils sont trop gros", "Ils ont le vertige"], c: 1 }, { q: "Combien de plumes sur un poulet sans plumes ?", a: ["Aucune", "Deux", "Autant que de poils sur un œuf"], c: 0 }, { q: "Quel est le rêve d’un réveil ?", a: ["Dormir", "Sonner toute la journée", "Devenir une horloge"], c: 0 }, { q: "Pourquoi les pizzas ne chantent-elles pas ?", a: ["Elles n’ont pas de bouche", "Elles sont trop chaudes", "Elles préfèrent danser"], c: 0 }, { q: "Combien de roues sur un avion en papier ?", a: ["Aucune", "Deux", "Quatre"], c: 0 }, { q: "Quel est le plat préféré des fantômes ?", a: ["La soupe de brouillard", "Le gratin d’ombre", "Le gâteau transparent"], c: 0 }, { q: "Pourquoi les crayons ne mangent-ils pas de soupe ?", a: ["Ils n’ont pas de bouche", "Ils préfèrent les gommes", "Ils sont allergiques"], c: 0 }, { q: "Combien de poils sur la tête d’un chauve ?", a: ["Aucun", "Un", "Autant qu’il veut"], c: 0 }, { q: "Quel est le sport préféré des nuages ?", a: ["Le vol plané", "Le saut de pluie", "Le cache-soleil"], c: 0 }, { q: "Pourquoi les tortues ne courent-elles pas le marathon ?", a: ["Elles préfèrent marcher", "Elles n’aiment pas courir", "Elles sont déjà rapides"], c: 0 }, { q: "Combien de pages dans un livre fermé ?", a: ["Autant qu’ouvert", "Aucune", "42"], c: 0 }, { q: "Quel est le cri du soleil ?", a: ["Aïe, ça chauffe !", "Bzzz", "Chut"], c: 0 }, { q: "Pourquoi les arbres ne portent-ils pas de chapeaux ?", a: ["Ils ont déjà des feuilles", "Ils n’aiment pas la mode", "Ils préfèrent les casques"], c: 0 }, { q: "Combien de roues sur un train fantôme ?", a: ["Aucune", "Autant qu’il veut", "Quatre"], c: 1 }, { q: "Quel est le rêve d’un nuage ?", a: ["Devenir une pluie", "Devenir un arc-en-ciel", "Devenir un mouton"], c: 0 }, { q: "Pourquoi les poissons ne jouent-ils pas au foot ?", a: ["Ils n’ont pas de pieds", "Ils préfèrent nager", "Ils n’aiment pas le ballon"], c: 0 }, { q: "Combien de dents a un requin en peluche ?", a: ["Aucune", "Deux", "Autant qu’il veut"], c: 0 }, { q: "Quel est le plat préféré des arbres ?", a: ["La soupe de feuilles", "Le gratin de racines", "Le gâteau de sève"], c: 0 }, { q: "Pourquoi les oiseaux ne font-ils pas de vélo ?", a: ["Ils préfèrent voler", "Ils n’ont pas de roues", "Ils sont trop petits"], c: 0 }, { q: "Combien de boutons sur la chemise d’un arbre ?", a: ["Aucun", "Un", "Autant que de feuilles"], c: 2 }, { q: "Quel est le rêve d’un poisson rouge ?", a: ["Devenir un dauphin", "Voler", "Faire du vélo"], c: 0 }, { q: "Pourquoi les éléphants ne volent-ils pas ?", a: ["Ils sont trop lourds", "Ils n’ont pas d’ailes", "Ils préfèrent marcher"], c: 1 }, { q: "Combien de pages dans un livre de sable ?", a: ["Aucune", "Autant qu’on veut", "42"], c: 1 }, { q: "Quel est le sport préféré des arbres en hiver ?", a: ["Le ski de branche", "Le patinage sur sève", "Le lancer de feuille morte"], c: 0 }]; var BOARD_WIDTH = 2048; var BOARD_HEIGHT = 2732; var GROUND_Y = 2300; // y position of the ground var TREE_MIN_X = 200; var TREE_MAX_X = BOARD_WIDTH - 200; var TREE_MIN_Y = 800; var TREE_MAX_Y = GROUND_Y - 200; var TREE_COUNT = 5; // Game state var trees = []; var player = null; var score = 0; var level = 1; var moneyNeeded = 500; var questionIndex = 0; var currentTree = null; var isQuestionActive = false; var questionPanel = null; var answerButtons = []; var collectedMoney = 0; var jumpTarget = null; var canJump = true; // GUI var scoreTxt = new Text2('0 €', { size: 120, fill: 0xFFF700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('Niveau 1', { size: 80, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 130; // Helper: random int function randInt(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } // Helper: pick random question (avoid repeats in a session) function pickRandomQuestions(n) { var used = {}; var arr = []; while (arr.length < n) { var idx = randInt(0, QUESTIONS.length - 1); if (!used[idx]) { arr.push(QUESTIONS[idx]); used[idx] = true; } } return arr; } // Place trees randomly function spawnTrees() { // Remove old trees for (var i = 0; i < trees.length; i++) { trees[i].destroy(); } trees = []; for (var i = 0; i < TREE_COUNT; i++) { var t = new Tree(); // Random position, not too close to edges or each other var tries = 0; var ok = false; while (!ok && tries < 20) { t.x = randInt(TREE_MIN_X, TREE_MAX_X); t.y = randInt(TREE_MIN_Y, TREE_MAX_Y); ok = true; for (var j = 0; j < trees.length; j++) { var dx = t.x - trees[j].x; var dy = t.y - trees[j].y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 400) ok = false; } tries++; } trees.push(t); game.addChild(t); } } // Place player at a random tree function placePlayer() { var idx = randInt(0, trees.length - 1); var t = trees[idx]; player.x = t.x; player.y = t.y - 10; } // Find nearest tree to (x, y) not already collected function findNearestTree(x, y) { var minDist = 99999; var nearest = null; for (var i = 0; i < trees.length; i++) { if (trees[i].collected) continue; var dx = trees[i].x - x; var dy = trees[i].y - y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; nearest = trees[i]; } } return nearest; } // Show question panel function showQuestions(tree, onFinish) { isQuestionActive = true; questionPanel = new Container(); // Panel background var panelBg = LK.getAsset('tree', { width: 1200, height: 900, color: 0x222222, anchorX: 0.5, anchorY: 0.5 }); panelBg.alpha = 0.95; questionPanel.addChild(panelBg); questionPanel.x = BOARD_WIDTH / 2; questionPanel.y = BOARD_HEIGHT / 2; // Pick 3 random questions var qs = pickRandomQuestions(3); // Ensure each question has only one correct answer (c always 0, and a[0] is the correct one) for (var i = 0; i < qs.length; i++) { if (qs[i].c !== 0) { // Swap correct answer to first position var correctIdx = qs[i].c; var tmp = qs[i].a[0]; qs[i].a[0] = qs[i].a[correctIdx]; qs[i].a[correctIdx] = tmp; qs[i].c = 0; } } questionIndex = 0; var correctCount = 0; var moneyWon = 0; // Question text var qTxt = new Text2('', { size: 70, fill: "#fff" }); qTxt.anchor.set(0.5, 0); qTxt.y = -350; questionPanel.addChild(qTxt); // Answer buttons answerButtons = []; for (var i = 0; i < 3; i++) { var btn = new Container(); var btnBg = LK.getAsset('money', { width: 900, height: 120, color: 0x3cb371, anchorX: 0.5, anchorY: 0.5 }); btn.addChild(btnBg); var btnTxt = new Text2('', { size: 55, fill: "#222" }); btnTxt.anchor.set(0.5, 0.5); btn.addChild(btnTxt); btn.y = -100 + i * 180; btn.buttonIndex = i; btn.down = function (x, y, obj) { if (!isQuestionActive) return; var idx = obj.buttonIndex; var q = qs[questionIndex]; if (idx === q.c) { correctCount++; // Donne de l'argent pour chaque bonne réponse (mais l'argent pour l'arbre est donné à la collecte de l'arbre, pas ici) var moneyForThis = 0; // Pas d'argent ici, l'argent est donné à la collecte de l'arbre LK.setScore(score); scoreTxt.setText(score + " €"); // Animate button green if (obj.children && obj.children[0]) { tween(obj.children[0], { tint: 0x83de44 }, { duration: 200, onFinish: function onFinish() { if (obj.children && obj.children[0]) { tween(obj.children[0], { tint: 0x3cb371 }, { duration: 200 }); } } }); } // Animate money gain var moneyAnim = LK.getAsset('money', { width: 200, height: 100, color: 0xffe066, anchorX: 0.5, anchorY: 0.5 }); moneyAnim.x = 0; moneyAnim.y = 250; questionPanel.addChild(moneyAnim); var moneyText = new Text2("+" + moneyForThis + " €", { size: 70, fill: "#222" }); moneyText.anchor.set(0.5, 0.5); moneyAnim.addChild(moneyText); tween(moneyAnim, { y: 100, alpha: 0 }, { duration: 900, onFinish: function onFinish() { moneyAnim.destroy(); } }); // Check for level up after awarding money checkLevelUp(); } else { // Animate button red if (obj.children && obj.children[0]) { tween(obj.children[0], { tint: 0xd83318 }, { duration: 200, onFinish: function onFinish() { if (obj.children && obj.children[0]) { tween(obj.children[0], { tint: 0x3cb371 }, { duration: 200 }); } } }); } } // Next question or finish LK.setTimeout(function () { questionIndex++; if (questionIndex < 3) { setQuestion(); } else { // Bonus à la fin de la série de questions si au moins une bonne réponse if (correctCount > 0) { // Bonus supplémentaire var bonus = randInt(50, 100); score += bonus; LK.setScore(score); scoreTxt.setText(score + " €"); // Animation du bonus var moneyAnim = LK.getAsset('money', { width: 200, height: 100, color: 0xffe066, anchorX: 0.5, anchorY: 0.5 }); moneyAnim.x = 0; moneyAnim.y = 250; questionPanel.addChild(moneyAnim); var moneyText = new Text2("+" + bonus + " € (bonus)", { size: 70, fill: "#222" }); moneyText.anchor.set(0.5, 0.5); moneyAnim.addChild(moneyText); tween(moneyAnim, { y: 100, alpha: 0 }, { duration: 900, onFinish: function onFinish() { moneyAnim.destroy(); finishPanel(); } }); // Vérifie si le joueur passe au niveau suivant après le bonus checkLevelUp(); } else { finishPanel(); } } }, 400); }; answerButtons.push(btn); questionPanel.addChild(btn); } // Set question/answers function setQuestion() { var q = qs[questionIndex]; qTxt.setText(q.q); if (qTxt && typeof qTxt.setStyle === "function") { qTxt.setStyle({ fill: 0xD83318 }); // rouge vif pour la question } for (var i = 0; i < 3; i++) { answerButtons[i].children[1].setText(q.a[i]); if (answerButtons[i].children[1] && typeof answerButtons[i].children[1].setStyle === "function") { answerButtons[i].children[1].setStyle({ fill: 0xD83318 }); // rouge vif pour les réponses } } } // Remove panel and call onFinish function finishPanel() { isQuestionActive = false; if (questionPanel) { questionPanel.destroy(); questionPanel = null; } answerButtons = []; if (onFinish) onFinish(correctCount > 0, collectedMoney); } setQuestion(); game.addChild(questionPanel); } // Level up logic function checkLevelUp() { while (score >= moneyNeeded) { level++; moneyNeeded *= 2; levelTxt.setText("Niveau " + level); // Update score and level display in case of level up scoreTxt.setText(score + " €"); levelTxt.setText("Niveau " + level); // Flash effect LK.effects.flashScreen(0x83de44, 800); // Respawn trees, reset player spawnTrees(); placePlayer(); } } // Initialize game function startGame() { score = 0; level = 1; moneyNeeded = 500; collectedMoney = 0; scoreTxt.setText(score + " €"); levelTxt.setText("Niveau " + level); spawnTrees(); if (player) player.destroy(); player = new Player(); game.addChild(player); placePlayer(); canJump = true; isQuestionActive = false; if (questionPanel) { questionPanel.destroy(); questionPanel = null; } // Play background music in loop at game start LK.playMusic('bgmusic', { loop: true }); } // Handle tap: jump to nearest uncollected tree game.down = function (x, y, obj) { if (isQuestionActive || !canJump) return; // Find nearest uncollected tree not at current position var nearest = null; var minDist = 99999; for (var i = 0; i < trees.length; i++) { if (trees[i].collected) continue; var dx = trees[i].x - player.x; var dy = trees[i].y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 50 && dist < minDist) { minDist = dist; nearest = trees[i]; } } if (!nearest) return; canJump = false; player.isJumping = true; jumpTarget = { x: nearest.x, y: nearest.y - 10 }; // Animate jump var startY = player.y; var midY = startY - 180; tween(player, { y: midY }, { duration: 180, easing: tween.easeOut, onFinish: function onFinish() { tween(player, { y: jumpTarget.y }, { duration: 180, easing: tween.easeIn, onFinish: function onFinish() { player.x = jumpTarget.x; player.y = jumpTarget.y; player.isJumping = false; canJump = true; // Check collision with tree for (var i = 0; i < trees.length; i++) { var t = trees[i]; if (!t.collected && Math.abs(player.x - t.x) < 80 && Math.abs(player.y - (t.y - 10)) < 80) { t.collected = true; // Animate tree tween(t, { alpha: 0.3 }, { duration: 400 }); // Donne de l'argent à la collecte de l'arbre (avant les questions) var moneyForTree = randInt(50, 100); score += moneyForTree; collectedMoney += moneyForTree; LK.setScore(score); scoreTxt.setText(score + " €"); // Vérifie si le joueur passe au niveau suivant après chaque arbre collecté checkLevelUp(); // Animation de gain d'argent à la collecte de l'arbre var moneyAnim = LK.getAsset('money', { width: 200, height: 100, color: 0xffe066, anchorX: 0.5, anchorY: 0.5 }); moneyAnim.x = t.x; moneyAnim.y = t.y - 200; game.addChild(moneyAnim); var moneyText = new Text2("+" + moneyForTree + " €", { size: 70, fill: "#222" }); moneyText.anchor.set(0.5, 0.5); moneyAnim.addChild(moneyText); tween(moneyAnim, { y: moneyAnim.y - 100, alpha: 0 }, { duration: 900, onFinish: function onFinish() { moneyAnim.destroy(); } }); // Show questions showQuestions(t, function (success, money) { if (success) { // Animate money to score LK.effects.flashObject(scoreTxt, 0xffe066, 600); } // If all trees collected, respawn var allCollected = true; for (var j = 0; j < trees.length; j++) { if (!trees[j].collected) allCollected = false; } if (allCollected) { spawnTrees(); placePlayer(); } }); break; } } } }); } }); }; // Prevent drag game.move = function (x, y, obj) { // No drag, only tap to jump }; // Main update loop game.update = function () { // Nothing needed here for now }; // Start game startGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerAsset = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 1
});
// For jump animation
self.isJumping = false;
return self;
});
// Tree class
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeAsset = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 1
});
// Add a money icon on the tree
var moneyAsset = self.attachAsset('money', {
anchorX: 0.5,
anchorY: 0.5,
y: -treeAsset.height * 0.7
});
// Used to know if this tree has been collected
self.collected = false;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1e5631 // deep forest green
});
/****
* Game Code
****/
// Ajoute l'asset image de fond personnalisé (remplace l'id par celui de ton image)
// Ajoute l'image de fond personnalisé derrière tout le reste
var backgroundImg = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: BOARD_WIDTH,
height: BOARD_HEIGHT
});
game.addChildAt(backgroundImg, 0); // Ajoute au fond (index 0)
// Les bonnes réponses sont définies par l'index 'c' pour chaque question
// Game constants
// Tree asset: green ellipse
// Money asset: yellow box
// Player asset: blue box
/****
* Game Code
/****
* Questions
****/
var QUESTIONS = [{
q: "Combien de bananes faut-il pour faire un vélo ?",
a: ["Aucune, c'est absurde !", "42", "3, si elles sont très grandes"],
c: 0
}, {
q: "Quel animal est le plus susceptible de devenir président ?",
a: ["Le lama", "Le poisson rouge", "Le pigeon voyageur"],
c: 2
}, {
q: "Si un arbre tombe dans une forêt et que personne ne l’entend, fait-il du bruit ?",
a: ["Oui, mais il chuchote", "Non, il chante", "Seulement les jours pairs"],
c: 0
}, {
q: "Quelle est la couleur du cheval vert d’Henri IV ?",
a: ["Vert", "Bleu", "Invisible"],
c: 0
}, {
q: "Combien de lunes autour de la Terre un mardi ?",
a: ["Une", "Trois", "Aucune, elles sont en vacances"],
c: 0
}, {
q: "Quel est le cri du billet de banque ?",
a: ["Chling !", "Miaou", "Bip bip"],
c: 0
}, {
q: "Si tu plantes une pièce de 1€, que poussera-t-il ?",
a: ["Un arbre à billets", "Un distributeur", "Un cactus doré"],
c: 0
}, {
q: "Quel est le sport préféré des arbres ?",
a: ["Le tronc-volant", "Le basket-feuille", "Le branché-ball"],
c: 1
}, {
q: "Combien de temps met un escargot pour faire le tour d’un arbre ?",
a: ["Le temps qu’il veut", "Jamais, il s’arrête pour dormir", "42 jours"],
c: 0
}, {
q: "Quel est le prénom du plus riche des arbres ?",
a: ["Billet", "Feuille", "Racine"],
c: 1
},
// 40 nouvelles questions débiles
{
q: "Pourquoi les poissons ne volent-ils pas en avion ?",
a: ["Ils préfèrent nager", "Ils n'ont pas de passeport", "Ils ont peur du vide"],
c: 0
}, {
q: "Combien de chaussettes faut-il pour habiller une pieuvre ?",
a: ["Huit", "Seize", "Aucune, elle préfère être pieds nus"],
c: 0
}, {
q: "Quel est le fruit préféré des ordinateurs ?",
a: ["La pomme", "La banane USB", "La fraise pixelisée"],
c: 0
}, {
q: "Que fait un canard quand il a soif ?",
a: ["Il boit", "Il fait coin-coin", "Il nage à l’envers"],
c: 0
}, {
q: "Pourquoi les girafes n’utilisent-elles pas d’ascenseur ?",
a: ["Elles sont trop grandes", "Elles préfèrent les escaliers", "Elles volent"],
c: 0
}, {
q: "Combien de moustaches a un chat qui se prend pour un tigre ?",
a: ["Autant qu’un chat", "Aucune, il les a perdues", "42"],
c: 0
}, {
q: "Quel est le plat préféré des licornes ?",
a: ["La salade arc-en-ciel", "Le gratin de nuages", "Les frites magiques"],
c: 0
}, {
q: "Pourquoi les nuages ne tombent-ils pas du ciel ?",
a: ["Ils sont légers", "Ils ont des parachutes", "Ils sont collés avec du scotch"],
c: 0
}, {
q: "Combien de roues a un vélo carré ?",
a: ["Quatre", "Aucune, il ne roule pas", "Deux, mais elles sont carrées"],
c: 2
}, {
q: "Quel est le métier rêvé d’un escargot ?",
a: ["Pilote de Formule 1", "Coureur de marathon", "Astronaute"],
c: 0
}, {
q: "Pourquoi les arbres ne dansent-ils pas la salsa ?",
a: ["Ils sont enracinés", "Ils préfèrent le rock", "Ils n’ont pas de chaussures"],
c: 0
}, {
q: "Combien de doigts a une main de géant ?",
a: ["Cinq, mais très gros", "Dix", "Aucun, il a des pattes"],
c: 0
}, {
q: "Quel est le rêve secret d’un caillou ?",
a: ["Devenir une montagne", "Voler", "Faire du surf"],
c: 0
}, {
q: "Pourquoi les grenouilles ne portent-elles pas de lunettes ?",
a: ["Elles voient très bien", "Elles préfèrent les lentilles", "Elles n’ont pas d’oreilles"],
c: 0
}, {
q: "Combien de pages dans un livre invisible ?",
a: ["Aucune", "42", "Autant qu’on veut"],
c: 2
}, {
q: "Quel est le sport préféré des fourmis ?",
a: ["Le levé de miettes", "Le foot", "Le saut de brindille"],
c: 0
}, {
q: "Pourquoi les horloges ne mangent-elles jamais de pizza ?",
a: ["Elles n’ont pas de bouche", "Elles préfèrent les pâtes", "Elles sont au régime"],
c: 0
}, {
q: "Combien de couleurs dans un arc-en-ciel en noir et blanc ?",
a: ["Aucune", "Deux", "Sept"],
c: 1
}, {
q: "Quel est le cri du nuage ?",
a: ["Pschhh", "Boum", "Ploc"],
c: 0
}, {
q: "Pourquoi les lapins ne font-ils pas de vélo ?",
a: ["Ils préfèrent sauter", "Ils n’ont pas de casque", "Ils sont trop rapides"],
c: 0
}, {
q: "Combien de dents a un crocodile en peluche ?",
a: ["Aucune", "Deux", "Autant qu’il veut"],
c: 0
}, {
q: "Quel est le dessert préféré des robots ?",
a: ["Le circuit glacé", "La tarte à la RAM", "Le gâteau binaire"],
c: 0
}, {
q: "Pourquoi les étoiles filantes ne s’arrêtent-elles jamais ?",
a: ["Elles sont pressées", "Elles n’ont pas de freins", "Elles aiment voyager"],
c: 1
}, {
q: "Combien de boutons sur la chemise d’un fantôme ?",
a: ["Aucun", "Un", "Autant que de trous"],
c: 0
}, {
q: "Quel est le jeu préféré des grenouilles ?",
a: ["La marelle", "Le saute-mouton", "Le cache-cache"],
c: 0
}, {
q: "Pourquoi les éléphants ne se cachent-ils pas dans les arbres ?",
a: ["On les verrait", "Ils sont trop gros", "Ils ont le vertige"],
c: 1
}, {
q: "Combien de plumes sur un poulet sans plumes ?",
a: ["Aucune", "Deux", "Autant que de poils sur un œuf"],
c: 0
}, {
q: "Quel est le rêve d’un réveil ?",
a: ["Dormir", "Sonner toute la journée", "Devenir une horloge"],
c: 0
}, {
q: "Pourquoi les pizzas ne chantent-elles pas ?",
a: ["Elles n’ont pas de bouche", "Elles sont trop chaudes", "Elles préfèrent danser"],
c: 0
}, {
q: "Combien de roues sur un avion en papier ?",
a: ["Aucune", "Deux", "Quatre"],
c: 0
}, {
q: "Quel est le plat préféré des fantômes ?",
a: ["La soupe de brouillard", "Le gratin d’ombre", "Le gâteau transparent"],
c: 0
}, {
q: "Pourquoi les crayons ne mangent-ils pas de soupe ?",
a: ["Ils n’ont pas de bouche", "Ils préfèrent les gommes", "Ils sont allergiques"],
c: 0
}, {
q: "Combien de poils sur la tête d’un chauve ?",
a: ["Aucun", "Un", "Autant qu’il veut"],
c: 0
}, {
q: "Quel est le sport préféré des nuages ?",
a: ["Le vol plané", "Le saut de pluie", "Le cache-soleil"],
c: 0
}, {
q: "Pourquoi les tortues ne courent-elles pas le marathon ?",
a: ["Elles préfèrent marcher", "Elles n’aiment pas courir", "Elles sont déjà rapides"],
c: 0
}, {
q: "Combien de pages dans un livre fermé ?",
a: ["Autant qu’ouvert", "Aucune", "42"],
c: 0
}, {
q: "Quel est le cri du soleil ?",
a: ["Aïe, ça chauffe !", "Bzzz", "Chut"],
c: 0
}, {
q: "Pourquoi les arbres ne portent-ils pas de chapeaux ?",
a: ["Ils ont déjà des feuilles", "Ils n’aiment pas la mode", "Ils préfèrent les casques"],
c: 0
}, {
q: "Combien de roues sur un train fantôme ?",
a: ["Aucune", "Autant qu’il veut", "Quatre"],
c: 1
}, {
q: "Quel est le rêve d’un nuage ?",
a: ["Devenir une pluie", "Devenir un arc-en-ciel", "Devenir un mouton"],
c: 0
}, {
q: "Pourquoi les poissons ne jouent-ils pas au foot ?",
a: ["Ils n’ont pas de pieds", "Ils préfèrent nager", "Ils n’aiment pas le ballon"],
c: 0
}, {
q: "Combien de dents a un requin en peluche ?",
a: ["Aucune", "Deux", "Autant qu’il veut"],
c: 0
}, {
q: "Quel est le plat préféré des arbres ?",
a: ["La soupe de feuilles", "Le gratin de racines", "Le gâteau de sève"],
c: 0
}, {
q: "Pourquoi les oiseaux ne font-ils pas de vélo ?",
a: ["Ils préfèrent voler", "Ils n’ont pas de roues", "Ils sont trop petits"],
c: 0
}, {
q: "Combien de boutons sur la chemise d’un arbre ?",
a: ["Aucun", "Un", "Autant que de feuilles"],
c: 2
}, {
q: "Quel est le rêve d’un poisson rouge ?",
a: ["Devenir un dauphin", "Voler", "Faire du vélo"],
c: 0
}, {
q: "Pourquoi les éléphants ne volent-ils pas ?",
a: ["Ils sont trop lourds", "Ils n’ont pas d’ailes", "Ils préfèrent marcher"],
c: 1
}, {
q: "Combien de pages dans un livre de sable ?",
a: ["Aucune", "Autant qu’on veut", "42"],
c: 1
}, {
q: "Quel est le sport préféré des arbres en hiver ?",
a: ["Le ski de branche", "Le patinage sur sève", "Le lancer de feuille morte"],
c: 0
}];
var BOARD_WIDTH = 2048;
var BOARD_HEIGHT = 2732;
var GROUND_Y = 2300; // y position of the ground
var TREE_MIN_X = 200;
var TREE_MAX_X = BOARD_WIDTH - 200;
var TREE_MIN_Y = 800;
var TREE_MAX_Y = GROUND_Y - 200;
var TREE_COUNT = 5;
// Game state
var trees = [];
var player = null;
var score = 0;
var level = 1;
var moneyNeeded = 500;
var questionIndex = 0;
var currentTree = null;
var isQuestionActive = false;
var questionPanel = null;
var answerButtons = [];
var collectedMoney = 0;
var jumpTarget = null;
var canJump = true;
// GUI
var scoreTxt = new Text2('0 €', {
size: 120,
fill: 0xFFF700
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Niveau 1', {
size: 80,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
levelTxt.y = 130;
// Helper: random int
function randInt(min, max) {
return min + Math.floor(Math.random() * (max - min + 1));
}
// Helper: pick random question (avoid repeats in a session)
function pickRandomQuestions(n) {
var used = {};
var arr = [];
while (arr.length < n) {
var idx = randInt(0, QUESTIONS.length - 1);
if (!used[idx]) {
arr.push(QUESTIONS[idx]);
used[idx] = true;
}
}
return arr;
}
// Place trees randomly
function spawnTrees() {
// Remove old trees
for (var i = 0; i < trees.length; i++) {
trees[i].destroy();
}
trees = [];
for (var i = 0; i < TREE_COUNT; i++) {
var t = new Tree();
// Random position, not too close to edges or each other
var tries = 0;
var ok = false;
while (!ok && tries < 20) {
t.x = randInt(TREE_MIN_X, TREE_MAX_X);
t.y = randInt(TREE_MIN_Y, TREE_MAX_Y);
ok = true;
for (var j = 0; j < trees.length; j++) {
var dx = t.x - trees[j].x;
var dy = t.y - trees[j].y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 400) ok = false;
}
tries++;
}
trees.push(t);
game.addChild(t);
}
}
// Place player at a random tree
function placePlayer() {
var idx = randInt(0, trees.length - 1);
var t = trees[idx];
player.x = t.x;
player.y = t.y - 10;
}
// Find nearest tree to (x, y) not already collected
function findNearestTree(x, y) {
var minDist = 99999;
var nearest = null;
for (var i = 0; i < trees.length; i++) {
if (trees[i].collected) continue;
var dx = trees[i].x - x;
var dy = trees[i].y - y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < minDist) {
minDist = dist;
nearest = trees[i];
}
}
return nearest;
}
// Show question panel
function showQuestions(tree, onFinish) {
isQuestionActive = true;
questionPanel = new Container();
// Panel background
var panelBg = LK.getAsset('tree', {
width: 1200,
height: 900,
color: 0x222222,
anchorX: 0.5,
anchorY: 0.5
});
panelBg.alpha = 0.95;
questionPanel.addChild(panelBg);
questionPanel.x = BOARD_WIDTH / 2;
questionPanel.y = BOARD_HEIGHT / 2;
// Pick 3 random questions
var qs = pickRandomQuestions(3);
// Ensure each question has only one correct answer (c always 0, and a[0] is the correct one)
for (var i = 0; i < qs.length; i++) {
if (qs[i].c !== 0) {
// Swap correct answer to first position
var correctIdx = qs[i].c;
var tmp = qs[i].a[0];
qs[i].a[0] = qs[i].a[correctIdx];
qs[i].a[correctIdx] = tmp;
qs[i].c = 0;
}
}
questionIndex = 0;
var correctCount = 0;
var moneyWon = 0;
// Question text
var qTxt = new Text2('', {
size: 70,
fill: "#fff"
});
qTxt.anchor.set(0.5, 0);
qTxt.y = -350;
questionPanel.addChild(qTxt);
// Answer buttons
answerButtons = [];
for (var i = 0; i < 3; i++) {
var btn = new Container();
var btnBg = LK.getAsset('money', {
width: 900,
height: 120,
color: 0x3cb371,
anchorX: 0.5,
anchorY: 0.5
});
btn.addChild(btnBg);
var btnTxt = new Text2('', {
size: 55,
fill: "#222"
});
btnTxt.anchor.set(0.5, 0.5);
btn.addChild(btnTxt);
btn.y = -100 + i * 180;
btn.buttonIndex = i;
btn.down = function (x, y, obj) {
if (!isQuestionActive) return;
var idx = obj.buttonIndex;
var q = qs[questionIndex];
if (idx === q.c) {
correctCount++;
// Donne de l'argent pour chaque bonne réponse (mais l'argent pour l'arbre est donné à la collecte de l'arbre, pas ici)
var moneyForThis = 0; // Pas d'argent ici, l'argent est donné à la collecte de l'arbre
LK.setScore(score);
scoreTxt.setText(score + " €");
// Animate button green
if (obj.children && obj.children[0]) {
tween(obj.children[0], {
tint: 0x83de44
}, {
duration: 200,
onFinish: function onFinish() {
if (obj.children && obj.children[0]) {
tween(obj.children[0], {
tint: 0x3cb371
}, {
duration: 200
});
}
}
});
}
// Animate money gain
var moneyAnim = LK.getAsset('money', {
width: 200,
height: 100,
color: 0xffe066,
anchorX: 0.5,
anchorY: 0.5
});
moneyAnim.x = 0;
moneyAnim.y = 250;
questionPanel.addChild(moneyAnim);
var moneyText = new Text2("+" + moneyForThis + " €", {
size: 70,
fill: "#222"
});
moneyText.anchor.set(0.5, 0.5);
moneyAnim.addChild(moneyText);
tween(moneyAnim, {
y: 100,
alpha: 0
}, {
duration: 900,
onFinish: function onFinish() {
moneyAnim.destroy();
}
});
// Check for level up after awarding money
checkLevelUp();
} else {
// Animate button red
if (obj.children && obj.children[0]) {
tween(obj.children[0], {
tint: 0xd83318
}, {
duration: 200,
onFinish: function onFinish() {
if (obj.children && obj.children[0]) {
tween(obj.children[0], {
tint: 0x3cb371
}, {
duration: 200
});
}
}
});
}
}
// Next question or finish
LK.setTimeout(function () {
questionIndex++;
if (questionIndex < 3) {
setQuestion();
} else {
// Bonus à la fin de la série de questions si au moins une bonne réponse
if (correctCount > 0) {
// Bonus supplémentaire
var bonus = randInt(50, 100);
score += bonus;
LK.setScore(score);
scoreTxt.setText(score + " €");
// Animation du bonus
var moneyAnim = LK.getAsset('money', {
width: 200,
height: 100,
color: 0xffe066,
anchorX: 0.5,
anchorY: 0.5
});
moneyAnim.x = 0;
moneyAnim.y = 250;
questionPanel.addChild(moneyAnim);
var moneyText = new Text2("+" + bonus + " € (bonus)", {
size: 70,
fill: "#222"
});
moneyText.anchor.set(0.5, 0.5);
moneyAnim.addChild(moneyText);
tween(moneyAnim, {
y: 100,
alpha: 0
}, {
duration: 900,
onFinish: function onFinish() {
moneyAnim.destroy();
finishPanel();
}
});
// Vérifie si le joueur passe au niveau suivant après le bonus
checkLevelUp();
} else {
finishPanel();
}
}
}, 400);
};
answerButtons.push(btn);
questionPanel.addChild(btn);
}
// Set question/answers
function setQuestion() {
var q = qs[questionIndex];
qTxt.setText(q.q);
if (qTxt && typeof qTxt.setStyle === "function") {
qTxt.setStyle({
fill: 0xD83318
}); // rouge vif pour la question
}
for (var i = 0; i < 3; i++) {
answerButtons[i].children[1].setText(q.a[i]);
if (answerButtons[i].children[1] && typeof answerButtons[i].children[1].setStyle === "function") {
answerButtons[i].children[1].setStyle({
fill: 0xD83318
}); // rouge vif pour les réponses
}
}
}
// Remove panel and call onFinish
function finishPanel() {
isQuestionActive = false;
if (questionPanel) {
questionPanel.destroy();
questionPanel = null;
}
answerButtons = [];
if (onFinish) onFinish(correctCount > 0, collectedMoney);
}
setQuestion();
game.addChild(questionPanel);
}
// Level up logic
function checkLevelUp() {
while (score >= moneyNeeded) {
level++;
moneyNeeded *= 2;
levelTxt.setText("Niveau " + level);
// Update score and level display in case of level up
scoreTxt.setText(score + " €");
levelTxt.setText("Niveau " + level);
// Flash effect
LK.effects.flashScreen(0x83de44, 800);
// Respawn trees, reset player
spawnTrees();
placePlayer();
}
}
// Initialize game
function startGame() {
score = 0;
level = 1;
moneyNeeded = 500;
collectedMoney = 0;
scoreTxt.setText(score + " €");
levelTxt.setText("Niveau " + level);
spawnTrees();
if (player) player.destroy();
player = new Player();
game.addChild(player);
placePlayer();
canJump = true;
isQuestionActive = false;
if (questionPanel) {
questionPanel.destroy();
questionPanel = null;
}
// Play background music in loop at game start
LK.playMusic('bgmusic', {
loop: true
});
}
// Handle tap: jump to nearest uncollected tree
game.down = function (x, y, obj) {
if (isQuestionActive || !canJump) return;
// Find nearest uncollected tree not at current position
var nearest = null;
var minDist = 99999;
for (var i = 0; i < trees.length; i++) {
if (trees[i].collected) continue;
var dx = trees[i].x - player.x;
var dy = trees[i].y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 50 && dist < minDist) {
minDist = dist;
nearest = trees[i];
}
}
if (!nearest) return;
canJump = false;
player.isJumping = true;
jumpTarget = {
x: nearest.x,
y: nearest.y - 10
};
// Animate jump
var startY = player.y;
var midY = startY - 180;
tween(player, {
y: midY
}, {
duration: 180,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(player, {
y: jumpTarget.y
}, {
duration: 180,
easing: tween.easeIn,
onFinish: function onFinish() {
player.x = jumpTarget.x;
player.y = jumpTarget.y;
player.isJumping = false;
canJump = true;
// Check collision with tree
for (var i = 0; i < trees.length; i++) {
var t = trees[i];
if (!t.collected && Math.abs(player.x - t.x) < 80 && Math.abs(player.y - (t.y - 10)) < 80) {
t.collected = true;
// Animate tree
tween(t, {
alpha: 0.3
}, {
duration: 400
});
// Donne de l'argent à la collecte de l'arbre (avant les questions)
var moneyForTree = randInt(50, 100);
score += moneyForTree;
collectedMoney += moneyForTree;
LK.setScore(score);
scoreTxt.setText(score + " €");
// Vérifie si le joueur passe au niveau suivant après chaque arbre collecté
checkLevelUp();
// Animation de gain d'argent à la collecte de l'arbre
var moneyAnim = LK.getAsset('money', {
width: 200,
height: 100,
color: 0xffe066,
anchorX: 0.5,
anchorY: 0.5
});
moneyAnim.x = t.x;
moneyAnim.y = t.y - 200;
game.addChild(moneyAnim);
var moneyText = new Text2("+" + moneyForTree + " €", {
size: 70,
fill: "#222"
});
moneyText.anchor.set(0.5, 0.5);
moneyAnim.addChild(moneyText);
tween(moneyAnim, {
y: moneyAnim.y - 100,
alpha: 0
}, {
duration: 900,
onFinish: function onFinish() {
moneyAnim.destroy();
}
});
// Show questions
showQuestions(t, function (success, money) {
if (success) {
// Animate money to score
LK.effects.flashObject(scoreTxt, 0xffe066, 600);
}
// If all trees collected, respawn
var allCollected = true;
for (var j = 0; j < trees.length; j++) {
if (!trees[j].collected) allCollected = false;
}
if (allCollected) {
spawnTrees();
placePlayer();
}
});
break;
}
}
}
});
}
});
};
// Prevent drag
game.move = function (x, y, obj) {
// No drag, only tap to jump
};
// Main update loop
game.update = function () {
// Nothing needed here for now
};
// Start game
startGame();