Code edit (1 edits merged)
Please save this source code
User prompt
Karaoke Star
Initial prompt
Toca singing (2015). Hold the mic 🎤 up neatly and then you try. Sing the sun has go his hat on and sing along with ginger 🐱, press the French button or the Spanish button to make ginger 🐱 sing in 2 different ways.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var facekit = LK.import("@upit/facekit.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Ginger = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('ginger', {
anchorX: 0.5,
anchorY: 1.0
});
var head = self.attachAsset('gingerHead', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -350
});
var mic = self.attachAsset('micIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 100,
y: -150,
rotation: 0.3
});
var micTop = self.attachAsset('micTop', {
anchorX: 0.5,
anchorY: 0.5,
x: 100,
y: -250
});
self.animationTimer = 0;
self.update = function () {
self.animationTimer += 1;
head.y = -350 + Math.sin(self.animationTimer * 0.1) * 10;
mic.rotation = 0.3 + Math.sin(self.animationTimer * 0.15) * 0.2;
};
self.celebrate = function () {
tween(head, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut
});
tween(head, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeIn
});
};
return self;
});
var LanguageButton = Container.expand(function (language, displayText) {
var self = Container.call(this);
var button = self.attachAsset('languageButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(displayText, {
size: 40,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.language = language;
self.isSelected = false;
self.setSelected = function (selected) {
self.isSelected = selected;
if (selected) {
button.tint = 0x2980b9;
buttonText.fill = "#f1c40f";
} else {
button.tint = 0x3498db;
buttonText.fill = "#ffffff";
}
};
self.down = function (x, y, obj) {
if (gameState === 'languageSelect') {
selectedLanguage = self.language;
updateLanguageButtons();
LK.getSound('ding').play();
}
};
return self;
});
var VolumeVisualizer = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('volumeBar', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
var indicator = self.attachAsset('volumeIndicator', {
anchorX: 0.5,
anchorY: 0.5
});
self.updateVolume = function (volume) {
var barWidth = 380;
var position = volume * barWidth - barWidth / 2;
indicator.x = Math.max(-190, Math.min(190, position));
if (volume > 0.3) {
indicator.tint = 0x27ae60;
} else if (volume > 0.1) {
indicator.tint = 0xf39c12;
} else {
indicator.tint = 0xe74c3c;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x9b59b6
});
/****
* Game Code
****/
var gameState = 'start'; // 'start', 'languageSelect', 'singing', 'completed'
var selectedLanguage = 'english';
var ginger;
var languageButtons = [];
var startButton;
var volumeVisualizer;
var lyricsText;
var instructionText;
var scoreText;
var currentScore = 0;
var singingTimer = 0;
var songDuration = 10000; // 10 seconds for demo
var minVolumeThreshold = 0.1;
var goodVolumeThreshold = 0.3;
// Song lyrics in different languages
var lyrics = {
english: ["The sun has got his hat on", "Hip-hip-hip hooray!", "The sun has got his hat on", "And he's coming out today!"],
french: ["Le soleil a mis son chapeau", "Hip-hip-hip hourra!", "Le soleil a mis son chapeau", "Et il sort aujourd'hui!"],
spanish: ["El sol se ha puesto su sombrero", "¡Hip-hip-hip hurra!", "El sol se ha puesto su sombrero", "¡Y sale hoy!"]
};
var currentLyricIndex = 0;
var lyricTimer = 0;
var lyricDuration = 2500; // 2.5 seconds per line
// Initialize UI elements
function initializeGame() {
// Create Ginger character
ginger = game.addChild(new Ginger());
ginger.x = 1024;
ginger.y = 1800;
ginger.visible = false;
// Create language buttons
var englishBtn = game.addChild(new LanguageButton('english', 'English'));
englishBtn.x = 1024;
englishBtn.y = 1200;
englishBtn.visible = false;
languageButtons.push(englishBtn);
var frenchBtn = game.addChild(new LanguageButton('french', 'Français'));
frenchBtn.x = 1024;
frenchBtn.y = 1350;
frenchBtn.visible = false;
languageButtons.push(frenchBtn);
var spanishBtn = game.addChild(new LanguageButton('spanish', 'Español'));
spanishBtn.x = 1024;
spanishBtn.y = 1500;
spanishBtn.visible = false;
languageButtons.push(spanishBtn);
// Create start button
var startButtonShape = LK.getAsset('startButton', {
anchorX: 0.5,
anchorY: 0.5
});
startButton = game.addChild(startButtonShape);
startButton.x = 1024;
startButton.y = 1400;
var startText = new Text2('TAP TO START SINGING!', {
size: 50,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startButton.addChild(startText);
// Create volume visualizer
volumeVisualizer = game.addChild(new VolumeVisualizer());
volumeVisualizer.x = 1024;
volumeVisualizer.y = 2200;
volumeVisualizer.visible = false;
// Create text elements
lyricsText = new Text2('', {
size: 80,
fill: 0xFFFFFF
});
lyricsText.anchor.set(0.5, 0.5);
game.addChild(lyricsText);
lyricsText.x = 1024;
lyricsText.y = 1000;
lyricsText.visible = false;
instructionText = new Text2('Hold your device like a microphone and sing!', {
size: 60,
fill: 0xF1C40F
});
instructionText.anchor.set(0.5, 0.5);
game.addChild(instructionText);
instructionText.x = 1024;
instructionText.y = 500;
instructionText.visible = false;
// Create score display
scoreText = new Text2('Score: 0', {
size: 100,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 100;
}
function updateLanguageButtons() {
for (var i = 0; i < languageButtons.length; i++) {
languageButtons[i].setSelected(languageButtons[i].language === selectedLanguage);
}
}
function startLanguageSelection() {
gameState = 'languageSelect';
startButton.visible = false;
ginger.visible = true;
for (var i = 0; i < languageButtons.length; i++) {
languageButtons[i].visible = true;
}
updateLanguageButtons();
instructionText.setText('Choose your language:');
instructionText.visible = true;
}
function startSinging() {
gameState = 'singing';
for (var i = 0; i < languageButtons.length; i++) {
languageButtons[i].visible = false;
}
volumeVisualizer.visible = true;
lyricsText.visible = true;
instructionText.setText('Hold your device like a microphone and sing!');
currentLyricIndex = 0;
lyricTimer = 0;
singingTimer = 0;
currentScore = 0;
updateLyrics();
LK.playMusic('backgroundMusic');
}
function updateLyrics() {
var currentLyrics = lyrics[selectedLanguage];
if (currentLyricIndex < currentLyrics.length) {
lyricsText.setText(currentLyrics[currentLyricIndex]);
// Animate lyrics appearance
lyricsText.alpha = 0;
tween(lyricsText, {
alpha: 1
}, {
duration: 500,
easing: tween.easeOut
});
}
}
function completeSong() {
gameState = 'completed';
lyricsText.setText('Great performance!');
instructionText.setText('Tap to sing again!');
volumeVisualizer.visible = false;
ginger.celebrate();
LK.getSound('applause').play();
LK.stopMusic();
// Save high score
var highScore = storage.highScore || 0;
if (currentScore > highScore) {
storage.highScore = currentScore;
}
LK.setTimeout(function () {
gameState = 'start';
startButton.visible = true;
lyricsText.visible = false;
instructionText.visible = false;
ginger.visible = false;
}, 3000);
}
// Initialize the game
initializeGame();
// Start button click handler
startButton.down = function (x, y, obj) {
if (gameState === 'start') {
startLanguageSelection();
LK.getSound('ding').play();
} else if (gameState === 'completed') {
startLanguageSelection();
LK.getSound('ding').play();
}
};
// Continue button for language selection
game.down = function (x, y, obj) {
if (gameState === 'languageSelect' && selectedLanguage) {
startSinging();
}
};
// Main game loop
game.update = function () {
if (gameState === 'singing') {
singingTimer += 16; // Assuming 60 FPS
lyricTimer += 16;
// Update volume visualization
var volume = facekit.volume || 0;
volumeVisualizer.updateVolume(volume);
// Award points for singing
if (volume > minVolumeThreshold) {
if (volume > goodVolumeThreshold) {
currentScore += 3; // More points for louder singing
} else {
currentScore += 1;
}
LK.setScore(currentScore);
scoreText.setText('Score: ' + currentScore);
}
// Update lyrics
if (lyricTimer >= lyricDuration) {
lyricTimer = 0;
currentLyricIndex++;
if (currentLyricIndex < lyrics[selectedLanguage].length) {
updateLyrics();
} else {
// Song completed
completeSong();
}
}
// Check if song duration is complete
if (singingTimer >= songDuration) {
completeSong();
}
}
};
// Show initial instruction
instructionText.setText('Welcome to Karaoke Star!');
instructionText.visible = true; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,343 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var facekit = LK.import("@upit/facekit.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Ginger = Container.expand(function () {
+ var self = Container.call(this);
+ var body = self.attachAsset('ginger', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ var head = self.attachAsset('gingerHead', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: -350
+ });
+ var mic = self.attachAsset('micIcon', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 100,
+ y: -150,
+ rotation: 0.3
+ });
+ var micTop = self.attachAsset('micTop', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 100,
+ y: -250
+ });
+ self.animationTimer = 0;
+ self.update = function () {
+ self.animationTimer += 1;
+ head.y = -350 + Math.sin(self.animationTimer * 0.1) * 10;
+ mic.rotation = 0.3 + Math.sin(self.animationTimer * 0.15) * 0.2;
+ };
+ self.celebrate = function () {
+ tween(head, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ tween(head, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 300,
+ easing: tween.easeIn
+ });
+ };
+ return self;
+});
+var LanguageButton = Container.expand(function (language, displayText) {
+ var self = Container.call(this);
+ var button = self.attachAsset('languageButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var buttonText = new Text2(displayText, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ buttonText.anchor.set(0.5, 0.5);
+ self.addChild(buttonText);
+ self.language = language;
+ self.isSelected = false;
+ self.setSelected = function (selected) {
+ self.isSelected = selected;
+ if (selected) {
+ button.tint = 0x2980b9;
+ buttonText.fill = "#f1c40f";
+ } else {
+ button.tint = 0x3498db;
+ buttonText.fill = "#ffffff";
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (gameState === 'languageSelect') {
+ selectedLanguage = self.language;
+ updateLanguageButtons();
+ LK.getSound('ding').play();
+ }
+ };
+ return self;
+});
+var VolumeVisualizer = Container.expand(function () {
+ var self = Container.call(this);
+ var background = self.attachAsset('volumeBar', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ var indicator = self.attachAsset('volumeIndicator', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.updateVolume = function (volume) {
+ var barWidth = 380;
+ var position = volume * barWidth - barWidth / 2;
+ indicator.x = Math.max(-190, Math.min(190, position));
+ if (volume > 0.3) {
+ indicator.tint = 0x27ae60;
+ } else if (volume > 0.1) {
+ indicator.tint = 0xf39c12;
+ } else {
+ indicator.tint = 0xe74c3c;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x9b59b6
+});
+
+/****
+* Game Code
+****/
+var gameState = 'start'; // 'start', 'languageSelect', 'singing', 'completed'
+var selectedLanguage = 'english';
+var ginger;
+var languageButtons = [];
+var startButton;
+var volumeVisualizer;
+var lyricsText;
+var instructionText;
+var scoreText;
+var currentScore = 0;
+var singingTimer = 0;
+var songDuration = 10000; // 10 seconds for demo
+var minVolumeThreshold = 0.1;
+var goodVolumeThreshold = 0.3;
+// Song lyrics in different languages
+var lyrics = {
+ english: ["The sun has got his hat on", "Hip-hip-hip hooray!", "The sun has got his hat on", "And he's coming out today!"],
+ french: ["Le soleil a mis son chapeau", "Hip-hip-hip hourra!", "Le soleil a mis son chapeau", "Et il sort aujourd'hui!"],
+ spanish: ["El sol se ha puesto su sombrero", "¡Hip-hip-hip hurra!", "El sol se ha puesto su sombrero", "¡Y sale hoy!"]
+};
+var currentLyricIndex = 0;
+var lyricTimer = 0;
+var lyricDuration = 2500; // 2.5 seconds per line
+// Initialize UI elements
+function initializeGame() {
+ // Create Ginger character
+ ginger = game.addChild(new Ginger());
+ ginger.x = 1024;
+ ginger.y = 1800;
+ ginger.visible = false;
+ // Create language buttons
+ var englishBtn = game.addChild(new LanguageButton('english', 'English'));
+ englishBtn.x = 1024;
+ englishBtn.y = 1200;
+ englishBtn.visible = false;
+ languageButtons.push(englishBtn);
+ var frenchBtn = game.addChild(new LanguageButton('french', 'Français'));
+ frenchBtn.x = 1024;
+ frenchBtn.y = 1350;
+ frenchBtn.visible = false;
+ languageButtons.push(frenchBtn);
+ var spanishBtn = game.addChild(new LanguageButton('spanish', 'Español'));
+ spanishBtn.x = 1024;
+ spanishBtn.y = 1500;
+ spanishBtn.visible = false;
+ languageButtons.push(spanishBtn);
+ // Create start button
+ var startButtonShape = LK.getAsset('startButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ startButton = game.addChild(startButtonShape);
+ startButton.x = 1024;
+ startButton.y = 1400;
+ var startText = new Text2('TAP TO START SINGING!', {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ startText.anchor.set(0.5, 0.5);
+ startButton.addChild(startText);
+ // Create volume visualizer
+ volumeVisualizer = game.addChild(new VolumeVisualizer());
+ volumeVisualizer.x = 1024;
+ volumeVisualizer.y = 2200;
+ volumeVisualizer.visible = false;
+ // Create text elements
+ lyricsText = new Text2('', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ lyricsText.anchor.set(0.5, 0.5);
+ game.addChild(lyricsText);
+ lyricsText.x = 1024;
+ lyricsText.y = 1000;
+ lyricsText.visible = false;
+ instructionText = new Text2('Hold your device like a microphone and sing!', {
+ size: 60,
+ fill: 0xF1C40F
+ });
+ instructionText.anchor.set(0.5, 0.5);
+ game.addChild(instructionText);
+ instructionText.x = 1024;
+ instructionText.y = 500;
+ instructionText.visible = false;
+ // Create score display
+ scoreText = new Text2('Score: 0', {
+ size: 100,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreText);
+ scoreText.y = 100;
+}
+function updateLanguageButtons() {
+ for (var i = 0; i < languageButtons.length; i++) {
+ languageButtons[i].setSelected(languageButtons[i].language === selectedLanguage);
+ }
+}
+function startLanguageSelection() {
+ gameState = 'languageSelect';
+ startButton.visible = false;
+ ginger.visible = true;
+ for (var i = 0; i < languageButtons.length; i++) {
+ languageButtons[i].visible = true;
+ }
+ updateLanguageButtons();
+ instructionText.setText('Choose your language:');
+ instructionText.visible = true;
+}
+function startSinging() {
+ gameState = 'singing';
+ for (var i = 0; i < languageButtons.length; i++) {
+ languageButtons[i].visible = false;
+ }
+ volumeVisualizer.visible = true;
+ lyricsText.visible = true;
+ instructionText.setText('Hold your device like a microphone and sing!');
+ currentLyricIndex = 0;
+ lyricTimer = 0;
+ singingTimer = 0;
+ currentScore = 0;
+ updateLyrics();
+ LK.playMusic('backgroundMusic');
+}
+function updateLyrics() {
+ var currentLyrics = lyrics[selectedLanguage];
+ if (currentLyricIndex < currentLyrics.length) {
+ lyricsText.setText(currentLyrics[currentLyricIndex]);
+ // Animate lyrics appearance
+ lyricsText.alpha = 0;
+ tween(lyricsText, {
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ }
+}
+function completeSong() {
+ gameState = 'completed';
+ lyricsText.setText('Great performance!');
+ instructionText.setText('Tap to sing again!');
+ volumeVisualizer.visible = false;
+ ginger.celebrate();
+ LK.getSound('applause').play();
+ LK.stopMusic();
+ // Save high score
+ var highScore = storage.highScore || 0;
+ if (currentScore > highScore) {
+ storage.highScore = currentScore;
+ }
+ LK.setTimeout(function () {
+ gameState = 'start';
+ startButton.visible = true;
+ lyricsText.visible = false;
+ instructionText.visible = false;
+ ginger.visible = false;
+ }, 3000);
+}
+// Initialize the game
+initializeGame();
+// Start button click handler
+startButton.down = function (x, y, obj) {
+ if (gameState === 'start') {
+ startLanguageSelection();
+ LK.getSound('ding').play();
+ } else if (gameState === 'completed') {
+ startLanguageSelection();
+ LK.getSound('ding').play();
+ }
+};
+// Continue button for language selection
+game.down = function (x, y, obj) {
+ if (gameState === 'languageSelect' && selectedLanguage) {
+ startSinging();
+ }
+};
+// Main game loop
+game.update = function () {
+ if (gameState === 'singing') {
+ singingTimer += 16; // Assuming 60 FPS
+ lyricTimer += 16;
+ // Update volume visualization
+ var volume = facekit.volume || 0;
+ volumeVisualizer.updateVolume(volume);
+ // Award points for singing
+ if (volume > minVolumeThreshold) {
+ if (volume > goodVolumeThreshold) {
+ currentScore += 3; // More points for louder singing
+ } else {
+ currentScore += 1;
+ }
+ LK.setScore(currentScore);
+ scoreText.setText('Score: ' + currentScore);
+ }
+ // Update lyrics
+ if (lyricTimer >= lyricDuration) {
+ lyricTimer = 0;
+ currentLyricIndex++;
+ if (currentLyricIndex < lyrics[selectedLanguage].length) {
+ updateLyrics();
+ } else {
+ // Song completed
+ completeSong();
+ }
+ }
+ // Check if song duration is complete
+ if (singingTimer >= songDuration) {
+ completeSong();
+ }
+ }
+};
+// Show initial instruction
+instructionText.setText('Welcome to Karaoke Star!');
+instructionText.visible = true;
\ No newline at end of file