Code edit (1 edits merged)
Please save this source code
User prompt
Rainbow Sing-Along with Sula
Initial prompt
Bing bunny 🖤: singing with sula 🐘. Hold the mic 🎤 up neatly and then you try. Sing pretty purple indigo blue and green and bright yellow that’s the way the colors go climbing up the rainybow and sing along with sula 🐘, tap on the Italian button, or the Latin America button to make sula 🐘 sing in 2 different ways.
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var facekit = LK.import("@upit/facekit.v1");
/**** 
* Classes
****/ 
var LanguageButton = Container.expand(function () {
	var self = Container.call(this);
	var button = self.attachAsset('languageButton', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.down = function (x, y, obj) {
		tween(self, {
			scaleX: 0.9,
			scaleY: 0.9
		}, {
			duration: 100,
			easing: tween.easeOut
		});
		switchLanguage();
	};
	self.up = function (x, y, obj) {
		tween(self, {
			scaleX: 1.0,
			scaleY: 1.0
		}, {
			duration: 100,
			easing: tween.easeOut
		});
	};
	return self;
});
var Microphone = Container.expand(function () {
	var self = Container.call(this);
	var micBody = self.attachAsset('microphone', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	var micTop = self.attachAsset('microphoneTop', {
		anchorX: 0.5,
		anchorY: 1.0,
		y: -180
	});
	self.isHeld = false;
	self.down = function (x, y, obj) {
		self.isHeld = true;
		micHeld = true;
		tween(self, {
			scaleX: 1.1,
			scaleY: 1.1
		}, {
			duration: 200,
			easing: tween.easeOut
		});
		LK.getSound('chime').play();
	};
	self.up = function (x, y, obj) {
		self.isHeld = false;
		micHeld = false;
		tween(self, {
			scaleX: 1.0,
			scaleY: 1.0
		}, {
			duration: 200,
			easing: tween.easeOut
		});
	};
	return self;
});
var RainbowStripe = Container.expand(function () {
	var self = Container.call(this);
	var stripe = self.attachAsset('rainbowStripe', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.setColor = function (color) {
		stripe.tint = color;
	};
	self.show = function () {
		self.alpha = 0;
		self.scaleX = 0;
		tween(self, {
			alpha: 1,
			scaleX: 1
		}, {
			duration: 500,
			easing: tween.easeOut
		});
	};
	self.hide = function () {
		tween(self, {
			alpha: 0,
			scaleX: 0
		}, {
			duration: 300,
			easing: tween.easeIn
		});
	};
	return self;
});
var SingButton = Container.expand(function () {
	var self = Container.call(this);
	var button = self.attachAsset('singButton', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.down = function (x, y, obj) {
		tween(self, {
			scaleX: 0.9,
			scaleY: 0.9
		}, {
			duration: 100,
			easing: tween.easeOut
		});
		startSinging();
	};
	self.up = function (x, y, obj) {
		tween(self, {
			scaleX: 1.0,
			scaleY: 1.0
		}, {
			duration: 100,
			easing: tween.easeOut
		});
	};
	return self;
});
var SulaCharacter = Container.expand(function () {
	var self = Container.call(this);
	var body = self.attachAsset('sula', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.bounce = function () {
		tween(self, {
			scaleY: 1.2
		}, {
			duration: 200,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				tween(self, {
					scaleY: 1.0
				}, {
					duration: 200,
					easing: tween.easeIn
				});
			}
		});
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
// Game variables
var micHeld = false;
var isSinging = false;
var currentLanguage = 0; // 0: English, 1: Italian, 2: Spanish
var songTimer = 0;
var rainbowColors = [0x800080, 0x4B0082, 0x0000FF, 0x008000, 0xFFFF00]; // Purple, Indigo, Blue, Green, Yellow
var currentColorIndex = 0;
var rainbowStripes = [];
var volumeThreshold = 0.2;
// Song lyrics in different languages
var songLyrics = [["Pretty", "Purple", "Indigo", "Blue", "and", "Green", "and", "Bright", "Yellow"],
// English
["Bello", "Viola", "Indaco", "Blu", "e", "Verde", "e", "Giallo", "Brillante"],
// Italian
["Bonito", "Morado", "Índigo", "Azul", "y", "Verde", "y", "Amarillo", "Brillante"] // Spanish
];
var languageNames = ["English", "Italiano", "Español"];
// Create UI elements
var scoreText = new Text2('Score: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var languageText = new Text2('Language: English', {
	size: 60,
	fill: 0xFFFFFF
});
languageText.anchor.set(0, 0);
languageText.x = 150;
languageText.y = 50;
LK.gui.topLeft.addChild(languageText);
var instructionText = new Text2('Hold microphone and sing with Sula!', {
	size: 70,
	fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(instructionText);
// Create game objects
var sula = game.addChild(new SulaCharacter());
sula.x = 1024;
sula.y = 800;
var microphone = game.addChild(new Microphone());
microphone.x = 1024;
microphone.y = 2200;
var singButton = game.addChild(new SingButton());
singButton.x = 1024;
singButton.y = 1800;
var languageButton = game.addChild(new LanguageButton());
languageButton.x = 1024;
languageButton.y = 1950;
// Create rainbow stripes
for (var i = 0; i < 5; i++) {
	var stripe = game.addChild(new RainbowStripe());
	stripe.x = 1024;
	stripe.y = 1200 + i * 80;
	stripe.setColor(rainbowColors[i]);
	stripe.alpha = 0;
	rainbowStripes.push(stripe);
}
// Button labels
var singButtonText = new Text2('Sing!', {
	size: 50,
	fill: 0xFFFFFF
});
singButtonText.anchor.set(0.5, 0.5);
singButtonText.x = singButton.x;
singButtonText.y = singButton.y;
game.addChild(singButtonText);
var languageButtonText = new Text2('Language', {
	size: 40,
	fill: 0xFFFFFF
});
languageButtonText.anchor.set(0.5, 0.5);
languageButtonText.x = languageButton.x;
languageButtonText.y = languageButton.y;
game.addChild(languageButtonText);
// Game functions
function startSinging() {
	if (!isSinging) {
		isSinging = true;
		songTimer = 0;
		currentColorIndex = 0;
		instructionText.setText('Sing along: ' + songLyrics[currentLanguage].join(' '));
		sula.bounce();
	}
}
function switchLanguage() {
	currentLanguage = (currentLanguage + 1) % 3;
	languageText.setText('Language: ' + languageNames[currentLanguage]);
	LK.getSound('chime').play();
}
function showRainbowColor(colorIndex) {
	if (colorIndex >= 0 && colorIndex < rainbowStripes.length) {
		rainbowStripes[colorIndex].show();
		// Hide after 1 second
		LK.setTimeout(function () {
			rainbowStripes[colorIndex].hide();
		}, 1000);
	}
}
function updateScore() {
	LK.setScore(LK.getScore() + 10);
	scoreText.setText('Score: ' + LK.getScore());
}
// Main game update loop
game.update = function () {
	if (isSinging && micHeld) {
		songTimer++;
		// Show rainbow colors in sequence
		if (songTimer % 120 === 0 && currentColorIndex < rainbowColors.length) {
			showRainbowColor(currentColorIndex);
			currentColorIndex++;
			sula.bounce();
		}
		// Check for voice input
		if (facekit.volume > volumeThreshold) {
			updateScore();
			// Create sparkle effect on Sula
			tween(sula, {
				scaleX: 1.1
			}, {
				duration: 100,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					tween(sula, {
						scaleX: 1.0
					}, {
						duration: 100,
						easing: tween.easeIn
					});
				}
			});
		}
		// End singing sequence after showing all colors
		if (songTimer > 600) {
			isSinging = false;
			songTimer = 0;
			currentColorIndex = 0;
			instructionText.setText('Great singing! Press Sing to go again!');
			// Hide all rainbow stripes
			for (var i = 0; i < rainbowStripes.length; i++) {
				rainbowStripes[i].hide();
			}
		}
	}
	// Visual feedback for microphone volume
	if (micHeld && facekit.volume > 0.1) {
		var volumeScale = 1.0 + facekit.volume * 0.3;
		microphone.scaleX = volumeScale;
		microphone.scaleY = volumeScale;
	} else if (micHeld) {
		microphone.scaleX = 1.1;
		microphone.scaleY = 1.1;
	} else {
		microphone.scaleX = 1.0;
		microphone.scaleY = 1.0;
	}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,325 @@
-/****
+/**** 
+* Plugins
+****/ 
+var tween = LK.import("@upit/tween.v1");
+var facekit = LK.import("@upit/facekit.v1");
+
+/**** 
+* Classes
+****/ 
+var LanguageButton = Container.expand(function () {
+	var self = Container.call(this);
+	var button = self.attachAsset('languageButton', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.down = function (x, y, obj) {
+		tween(self, {
+			scaleX: 0.9,
+			scaleY: 0.9
+		}, {
+			duration: 100,
+			easing: tween.easeOut
+		});
+		switchLanguage();
+	};
+	self.up = function (x, y, obj) {
+		tween(self, {
+			scaleX: 1.0,
+			scaleY: 1.0
+		}, {
+			duration: 100,
+			easing: tween.easeOut
+		});
+	};
+	return self;
+});
+var Microphone = Container.expand(function () {
+	var self = Container.call(this);
+	var micBody = self.attachAsset('microphone', {
+		anchorX: 0.5,
+		anchorY: 1.0
+	});
+	var micTop = self.attachAsset('microphoneTop', {
+		anchorX: 0.5,
+		anchorY: 1.0,
+		y: -180
+	});
+	self.isHeld = false;
+	self.down = function (x, y, obj) {
+		self.isHeld = true;
+		micHeld = true;
+		tween(self, {
+			scaleX: 1.1,
+			scaleY: 1.1
+		}, {
+			duration: 200,
+			easing: tween.easeOut
+		});
+		LK.getSound('chime').play();
+	};
+	self.up = function (x, y, obj) {
+		self.isHeld = false;
+		micHeld = false;
+		tween(self, {
+			scaleX: 1.0,
+			scaleY: 1.0
+		}, {
+			duration: 200,
+			easing: tween.easeOut
+		});
+	};
+	return self;
+});
+var RainbowStripe = Container.expand(function () {
+	var self = Container.call(this);
+	var stripe = self.attachAsset('rainbowStripe', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.setColor = function (color) {
+		stripe.tint = color;
+	};
+	self.show = function () {
+		self.alpha = 0;
+		self.scaleX = 0;
+		tween(self, {
+			alpha: 1,
+			scaleX: 1
+		}, {
+			duration: 500,
+			easing: tween.easeOut
+		});
+	};
+	self.hide = function () {
+		tween(self, {
+			alpha: 0,
+			scaleX: 0
+		}, {
+			duration: 300,
+			easing: tween.easeIn
+		});
+	};
+	return self;
+});
+var SingButton = Container.expand(function () {
+	var self = Container.call(this);
+	var button = self.attachAsset('singButton', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.down = function (x, y, obj) {
+		tween(self, {
+			scaleX: 0.9,
+			scaleY: 0.9
+		}, {
+			duration: 100,
+			easing: tween.easeOut
+		});
+		startSinging();
+	};
+	self.up = function (x, y, obj) {
+		tween(self, {
+			scaleX: 1.0,
+			scaleY: 1.0
+		}, {
+			duration: 100,
+			easing: tween.easeOut
+		});
+	};
+	return self;
+});
+var SulaCharacter = Container.expand(function () {
+	var self = Container.call(this);
+	var body = self.attachAsset('sula', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.bounce = function () {
+		tween(self, {
+			scaleY: 1.2
+		}, {
+			duration: 200,
+			easing: tween.easeOut,
+			onFinish: function onFinish() {
+				tween(self, {
+					scaleY: 1.0
+				}, {
+					duration: 200,
+					easing: tween.easeIn
+				});
+			}
+		});
+	};
+	return self;
+});
+
+/**** 
 * Initialize Game
-****/
+****/ 
 var game = new LK.Game({
-	backgroundColor: 0x000000
-});
\ No newline at end of file
+	backgroundColor: 0x87CEEB
+});
+
+/**** 
+* Game Code
+****/ 
+// Game variables
+var micHeld = false;
+var isSinging = false;
+var currentLanguage = 0; // 0: English, 1: Italian, 2: Spanish
+var songTimer = 0;
+var rainbowColors = [0x800080, 0x4B0082, 0x0000FF, 0x008000, 0xFFFF00]; // Purple, Indigo, Blue, Green, Yellow
+var currentColorIndex = 0;
+var rainbowStripes = [];
+var volumeThreshold = 0.2;
+// Song lyrics in different languages
+var songLyrics = [["Pretty", "Purple", "Indigo", "Blue", "and", "Green", "and", "Bright", "Yellow"],
+// English
+["Bello", "Viola", "Indaco", "Blu", "e", "Verde", "e", "Giallo", "Brillante"],
+// Italian
+["Bonito", "Morado", "Índigo", "Azul", "y", "Verde", "y", "Amarillo", "Brillante"] // Spanish
+];
+var languageNames = ["English", "Italiano", "Español"];
+// Create UI elements
+var scoreText = new Text2('Score: 0', {
+	size: 80,
+	fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var languageText = new Text2('Language: English', {
+	size: 60,
+	fill: 0xFFFFFF
+});
+languageText.anchor.set(0, 0);
+languageText.x = 150;
+languageText.y = 50;
+LK.gui.topLeft.addChild(languageText);
+var instructionText = new Text2('Hold microphone and sing with Sula!', {
+	size: 70,
+	fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(instructionText);
+// Create game objects
+var sula = game.addChild(new SulaCharacter());
+sula.x = 1024;
+sula.y = 800;
+var microphone = game.addChild(new Microphone());
+microphone.x = 1024;
+microphone.y = 2200;
+var singButton = game.addChild(new SingButton());
+singButton.x = 1024;
+singButton.y = 1800;
+var languageButton = game.addChild(new LanguageButton());
+languageButton.x = 1024;
+languageButton.y = 1950;
+// Create rainbow stripes
+for (var i = 0; i < 5; i++) {
+	var stripe = game.addChild(new RainbowStripe());
+	stripe.x = 1024;
+	stripe.y = 1200 + i * 80;
+	stripe.setColor(rainbowColors[i]);
+	stripe.alpha = 0;
+	rainbowStripes.push(stripe);
+}
+// Button labels
+var singButtonText = new Text2('Sing!', {
+	size: 50,
+	fill: 0xFFFFFF
+});
+singButtonText.anchor.set(0.5, 0.5);
+singButtonText.x = singButton.x;
+singButtonText.y = singButton.y;
+game.addChild(singButtonText);
+var languageButtonText = new Text2('Language', {
+	size: 40,
+	fill: 0xFFFFFF
+});
+languageButtonText.anchor.set(0.5, 0.5);
+languageButtonText.x = languageButton.x;
+languageButtonText.y = languageButton.y;
+game.addChild(languageButtonText);
+// Game functions
+function startSinging() {
+	if (!isSinging) {
+		isSinging = true;
+		songTimer = 0;
+		currentColorIndex = 0;
+		instructionText.setText('Sing along: ' + songLyrics[currentLanguage].join(' '));
+		sula.bounce();
+	}
+}
+function switchLanguage() {
+	currentLanguage = (currentLanguage + 1) % 3;
+	languageText.setText('Language: ' + languageNames[currentLanguage]);
+	LK.getSound('chime').play();
+}
+function showRainbowColor(colorIndex) {
+	if (colorIndex >= 0 && colorIndex < rainbowStripes.length) {
+		rainbowStripes[colorIndex].show();
+		// Hide after 1 second
+		LK.setTimeout(function () {
+			rainbowStripes[colorIndex].hide();
+		}, 1000);
+	}
+}
+function updateScore() {
+	LK.setScore(LK.getScore() + 10);
+	scoreText.setText('Score: ' + LK.getScore());
+}
+// Main game update loop
+game.update = function () {
+	if (isSinging && micHeld) {
+		songTimer++;
+		// Show rainbow colors in sequence
+		if (songTimer % 120 === 0 && currentColorIndex < rainbowColors.length) {
+			showRainbowColor(currentColorIndex);
+			currentColorIndex++;
+			sula.bounce();
+		}
+		// Check for voice input
+		if (facekit.volume > volumeThreshold) {
+			updateScore();
+			// Create sparkle effect on Sula
+			tween(sula, {
+				scaleX: 1.1
+			}, {
+				duration: 100,
+				easing: tween.easeOut,
+				onFinish: function onFinish() {
+					tween(sula, {
+						scaleX: 1.0
+					}, {
+						duration: 100,
+						easing: tween.easeIn
+					});
+				}
+			});
+		}
+		// End singing sequence after showing all colors
+		if (songTimer > 600) {
+			isSinging = false;
+			songTimer = 0;
+			currentColorIndex = 0;
+			instructionText.setText('Great singing! Press Sing to go again!');
+			// Hide all rainbow stripes
+			for (var i = 0; i < rainbowStripes.length; i++) {
+				rainbowStripes[i].hide();
+			}
+		}
+	}
+	// Visual feedback for microphone volume
+	if (micHeld && facekit.volume > 0.1) {
+		var volumeScale = 1.0 + facekit.volume * 0.3;
+		microphone.scaleX = volumeScale;
+		microphone.scaleY = volumeScale;
+	} else if (micHeld) {
+		microphone.scaleX = 1.1;
+		microphone.scaleY = 1.1;
+	} else {
+		microphone.scaleX = 1.0;
+		microphone.scaleY = 1.0;
+	}
+};
\ No newline at end of file