User prompt
Le nombre de coeurs gagnes doit correspondre à la performance réelle dans le microphone, par rapport a la chanson originale ↪💡 Consider importing and using the following plugins: @upit/facekit.v1
User prompt
Le jeu doit capter la ressemblance entre la performance du joueur ans le microphone et les vrais bonnes notes de la chanson, ça ne doit pas être aléatoire ↪💡 Consider importing and using the following plugins: @upit/facekit.v1
User prompt
Le joueur ne doit gagne seulement les coeurs gagnes en chantant selon sa performance, et ces coeurs la cumule servent a monter en niveau, mais le nombre de coeurs gagnes doit correspondre à la performance !
User prompt
Fait en sorte que le jeu ne donne seulement les coeurs gagnes correspondant a la performance dans les coeurs requis pour monter en niveau, le bon nombre de coeurs (par exemple si le joueur na gagnes 0 coeurs, il ne gagne aucun coeur dans son niveau et ne monte pas, et le nombre de coeurs gagnes dans le niveau doit correspondre au nombre de coeurs gagnes en chantant)
User prompt
Fait en sorte que le joueur ne monte pas en niveau tout le temps, mais uniquement quand il a collé te assez de coeurs pour son niveau actuel
User prompt
Fait en sorte que le jeu ne donne seulement les coeurs gagnes correspondant a la performance dans les coeurs requis pour monter en niveau, le bon nombre de coeurs (par exemple si le joueur na gagnes 0 coeurs, il ne gagne aucun coeur dans son niveau et ne monte pas, et le nombre de coeurs gagnes dans le niveau doit correspondre au nombre de coeurs gagnes en chantant)
User prompt
Fait en sorte que le jeu ne donne seulement les coeurs gagnes correspondant a la performance dans les coeurs requis pour monter en niveau
User prompt
Mets les textes de niveau et de coeurs de L'ui en noir pour une meilleure visibilité
User prompt
Le jeu ne doit pas demander accès a la caméra, uniquement au microphone, le fond du jeu doit être mon asset personnalisé ↪💡 Consider importing and using the following plugins: @upit/facekit.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Sing Heart
Initial prompt
Crée mon jeu "Sing heart", Sing heart est littéralement un jeu dans lequel faut chanter le mieux possible pour collecter des points et monter en niveau (je suis un peu folle mdr), voici la description du jeu, du gameplay et des mécaniques : Le jeu se présente sous forme d'écran mignon aux designs de karaoker et de coeurs (je veux personnaliser le fond avec mon propre asset), Sur lequel un énorme récipient (une énorme boîte transparente) est affiché, et présent dans de grosses dimensions, Le jeu contient 220 niveaux, et le joueur monte en niveau en accumulant des coeurs (littéralement), il faut 5 coeurs au joueur pour monter au niveau 2, puis à chaque nouveau niveau il lui faut le double pour monter au niveau supérieur ! Le jeu se joue en chantant des chansons le mieux possible (no fake), Le but étant de gagner des cœurs pour monter en niveau et remplir l'énorme récipient (de touts petit cœur minuscules apparaissent a l'intérieur fur a mesure que le joueur monte en niveau et gagne des cœurs), Pour jouer et gagner des coeurs, Le joueur doit littéralement chanter des chansons, Pour chanter, le joueur appuie sur le bouton magenta a texte blanc dans L'ui "chanter", le jeu tire alors aléatoirement une chanson de sa base de données, que le joueur doit chanter dans son microphone le plus juste possible et le plus en rythme possible (Le jeu informe le joueur de la chanson tirée aléatoirement avant que le joueur appuie sur commencer et commence à chanter avec le microphone de son appareil), Mieux le joueur chante, plus il gagne des cœurs (si le joueur est 0 a 15 % juste et en rythme, il gagne 0 coeurs , si le joueur est 15 a 30% juste et en rythme il gagne 2 coeurs , si le joueur est 30 a 50% juste et en rythme il gagne 4 coeurs, si le joueur est de 50% a 70% juste et en rythme il gagne 6 coeurs ,et si il est plus de 70% juste et en rythme il gagne 10 coeurs!), Le joueur peut s'arrêter de chanter quand il le souhaite en appuyant sur un bouton "arrêter" La liste des chansons que le jeu demande de chanter est une liste de chansons connues, voici une liste non exhaustive : 1) Au clair de la lune 2) frère Jacque 3) une souris verte 4) chandelier 5) Blue de Eiffel 65 6) la maya danse de maya l'abeille 7) la musique est bonne de Jean jacques Goldman 8) Diamond de Rihanna 9) sur ma route de black M (avec les kids united), 10) tout le bonheur du monde (de sinsemilia repris par les kids united) 11) on écrit sur les murs (des kids united) 12) laissez-moi danser de Dalida
/**** * Plugins ****/ var facekit = LK.import("@upit/facekit.v1"); var storage = LK.import("@upit/storage.v1", { currentLevel: 1, totalHearts: 0, heartsNeeded: 5 }); var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var SongButton = Container.expand(function (buttonType) { var self = Container.call(this); var buttonAsset = buttonType === 'chanter' ? 'chanterButton' : 'arreterButton'; var buttonGraphics = self.attachAsset(buttonAsset, { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2(buttonType === 'chanter' ? 'CHANTER' : 'ARRÊTER', { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.buttonType = buttonType; self.isPressed = false; self.down = function (x, y, obj) { self.isPressed = true; buttonGraphics.alpha = 0.8; }; self.up = function (x, y, obj) { if (self.isPressed) { if (self.buttonType === 'chanter') { startSinging(); } else { stopSinging(); } } self.isPressed = false; buttonGraphics.alpha = 1.0; }; return self; }); var TinyHeart = Container.expand(function () { var self = Container.call(this); var heartGraphics = self.attachAsset('tinyHeart', { anchorX: 0.5, anchorY: 0.5 }); self.floatSpeed = Math.random() * 2 + 1; self.bobOffset = Math.random() * Math.PI * 2; self.update = function () { self.y -= self.floatSpeed; self.x += Math.sin(LK.ticks * 0.05 + self.bobOffset) * 0.5; if (self.y < -50) { self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xffeef8 }); /**** * Game Code ****/ // Add custom background var customBackground = game.addChild(LK.getAsset('customBackground', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Song list var songList = ["Au clair de la lune", "Frère Jacques", "Chandelier", "Blue (Da Ba Dee)", "Diamonds", "On écrit sur les murs", "Tout le bonheur du monde", "L'Oiseau et l'Enfant", "La Marseillaise", "Happy Birthday"]; var currentSong = ""; var isSinging = false; var singingStartTime = 0; var singingDuration = 15000; // 15 seconds per song var volumeHistory = []; var pitchHistory = []; var tinyHearts = []; // UI Elements var heartContainerBorder = game.addChild(LK.getAsset('heartContainerBorder', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 800 })); var heartContainer = game.addChild(LK.getAsset('heartContainer', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 800, alpha: 0.3 })); var chanterButton = game.addChild(new SongButton('chanter')); chanterButton.x = 1024; chanterButton.y = 1500; var arreterButton = game.addChild(new SongButton('arreter')); arreterButton.x = 1024; arreterButton.y = 1600; arreterButton.alpha = 0.5; // Text displays var levelText = new Text2('Niveau: ' + storage.currentLevel, { size: 60, fill: 0x000000 }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); levelText.y = 100; var heartsText = new Text2('Cœurs: ' + storage.totalHearts + '/' + storage.heartsNeeded, { size: 50, fill: 0x000000 }); heartsText.anchor.set(0.5, 0); LK.gui.top.addChild(heartsText); heartsText.y = 180; var songText = new Text2(currentSong, { size: 45, fill: 0x333333 }); songText.anchor.set(0.5, 0.5); game.addChild(songText); songText.x = 1024; songText.y = 1200; var progressText = new Text2('', { size: 40, fill: 0x666666 }); progressText.anchor.set(0.5, 0.5); game.addChild(progressText); progressText.x = 1024; progressText.y = 1300; function getRandomSong() { return songList[Math.floor(Math.random() * songList.length)]; } function startSinging() { if (isSinging) return; currentSong = getRandomSong(); songText.setText(currentSong); isSinging = true; singingStartTime = LK.ticks; volumeHistory = []; pitchHistory = []; chanterButton.alpha = 0.5; arreterButton.alpha = 1.0; progressText.setText('Chantez maintenant! 🎤'); } function stopSinging() { if (!isSinging) return; isSinging = false; var accuracy = calculateAccuracy(); var heartsEarned = getHeartsFromAccuracy(accuracy); // Always add earned hearts (even if 0) to maintain accurate tracking storage.totalHearts += heartsEarned; // Only create visual effects and play sound if hearts were actually earned if (heartsEarned > 0) { // Create visual hearts only for earned hearts for (var i = 0; i < heartsEarned; i++) { createTinyHeart(); } LK.getSound('heartCollect').play(); } // Check for level up only if player has enough total hearts while (storage.totalHearts >= storage.heartsNeeded) { // Calculate remaining hearts after leveling up var remainingHearts = storage.totalHearts - storage.heartsNeeded; levelUp(); // Set remaining hearts for the new level storage.totalHearts = remainingHearts; } updateUI(); chanterButton.alpha = 1.0; arreterButton.alpha = 0.5; progressText.setText('Score: ' + Math.round(accuracy) + '% - ' + heartsEarned + ' cœurs!'); // Clear song after 3 seconds LK.setTimeout(function () { if (!isSinging) { songText.setText(''); progressText.setText(''); } }, 3000); } function calculateAccuracy() { if (volumeHistory.length === 0) return 0; var avgVolume = 0; var validPitches = 0; var avgPitch = 0; for (var i = 0; i < volumeHistory.length; i++) { avgVolume += volumeHistory[i]; if (pitchHistory[i] > 15) { avgPitch += pitchHistory[i]; validPitches++; } } avgVolume /= volumeHistory.length; // Base accuracy on volume consistency and pitch variation var volumeScore = Math.min(avgVolume * 100, 50); var pitchScore = validPitches > 0 ? Math.min(validPitches / volumeHistory.length * 50, 50) : 0; return Math.min(volumeScore + pitchScore, 100); } function getHeartsFromAccuracy(accuracy) { if (accuracy < 15) return 0; if (accuracy < 30) return 2; if (accuracy < 50) return 4; if (accuracy < 70) return 6; return 10; } function createTinyHeart() { var heart = new TinyHeart(); heart.x = heartContainer.x + (Math.random() - 0.5) * 400; heart.y = heartContainer.y + (Math.random() - 0.5) * 400; tinyHearts.push(heart); game.addChild(heart); // Animate heart appearing heart.alpha = 0; heart.scaleX = 0; heart.scaleY = 0; tween(heart, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500 }); } function levelUp() { storage.currentLevel++; storage.heartsNeeded *= 2; // Don't reset hearts - they are handled in stopSinging function LK.getSound('levelUp').play(); // Flash effect LK.effects.flashScreen(0xffb6c1, 1000); // Check win condition if (storage.currentLevel > 220) { LK.showYouWin(); return; } } function updateUI() { levelText.setText('Niveau: ' + storage.currentLevel); heartsText.setText('Cœurs: ' + storage.totalHearts + '/' + storage.heartsNeeded); // Update heart container fill based on progress var fillProgress = Math.min(storage.totalHearts / storage.heartsNeeded, 1.0); heartContainer.alpha = 0.3 + fillProgress * 0.4; } // Initialize UI updateUI(); game.update = function () { // Handle singing session if (isSinging) { var currentTime = LK.ticks - singingStartTime; var timeLeft = Math.max(0, singingDuration - currentTime * 16.67); // Convert ticks to ms if (timeLeft <= 0) { stopSinging(); } else { progressText.setText('Temps restant: ' + Math.ceil(timeLeft / 1000) + 's'); } // Record audio data every few ticks if (LK.ticks % 3 === 0) { volumeHistory.push(facekit.volume); pitchHistory.push(facekit.pitch); } } // Update tiny hearts for (var i = tinyHearts.length - 1; i >= 0; i--) { var heart = tinyHearts[i]; if (heart.destroyed) { tinyHearts.splice(i, 1); } } // Add floating hearts periodically if we have collected hearts if (storage.totalHearts > 0 && LK.ticks % 120 === 0) { if (Math.random() < 0.3) { createTinyHeart(); } } };
===================================================================
--- original.js
+++ change.js
@@ -159,26 +159,26 @@
if (!isSinging) return;
isSinging = false;
var accuracy = calculateAccuracy();
var heartsEarned = getHeartsFromAccuracy(accuracy);
- // Only add earned hearts if player actually earned them (earned hearts > 0)
+ // Always add earned hearts (even if 0) to maintain accurate tracking
+ storage.totalHearts += heartsEarned;
+ // Only create visual effects and play sound if hearts were actually earned
if (heartsEarned > 0) {
- // Add the exact number of hearts earned
- storage.totalHearts += heartsEarned;
// Create visual hearts only for earned hearts
for (var i = 0; i < heartsEarned; i++) {
createTinyHeart();
}
LK.getSound('heartCollect').play();
- // Check for level up only if player has enough total hearts
- while (storage.totalHearts >= storage.heartsNeeded) {
- // Calculate remaining hearts after leveling up
- var remainingHearts = storage.totalHearts - storage.heartsNeeded;
- levelUp();
- // Add any remaining hearts to the new level
- storage.totalHearts = remainingHearts;
- }
}
+ // Check for level up only if player has enough total hearts
+ while (storage.totalHearts >= storage.heartsNeeded) {
+ // Calculate remaining hearts after leveling up
+ var remainingHearts = storage.totalHearts - storage.heartsNeeded;
+ levelUp();
+ // Set remaining hearts for the new level
+ storage.totalHearts = remainingHearts;
+ }
updateUI();
chanterButton.alpha = 1.0;
arreterButton.alpha = 0.5;
progressText.setText('Score: ' + Math.round(accuracy) + '% - ' + heartsEarned + ' cœurs!');