Code edit (1 edits merged)
Please save this source code
User prompt
Party Girl Blossom - Interactive Birthday Celebration
Initial prompt
Powerpuff girls: talking partier blossom (2015) (blossom’s 7th birthday) tap on her tummy to talk 7 sayings, but tap her tummy 2 times she’ll sing the party song, or hold the party popper with confetti inside, or blow the party blower.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var ConfettiPiece = Container.expand(function () { var self = Container.call(this); var colors = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; var piece = self.attachAsset('confetti', { anchorX: 0.5, anchorY: 0.5 }); piece.tint = randomColor; self.velocityX = (Math.random() - 0.5) * 10; self.velocityY = Math.random() * -15 - 5; self.gravity = 0.5; self.rotationSpeed = (Math.random() - 0.5) * 0.2; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; self.rotation += self.rotationSpeed; if (self.y > 2732 + 50) { self.destroy(); for (var i = confettiPieces.length - 1; i >= 0; i--) { if (confettiPieces[i] === self) { confettiPieces.splice(i, 1); break; } } } }; return self; }); var Decoration = Container.expand(function () { var self = Container.call(this); var colors = [0xff69b4, 0xff4500, 0xffd700, 0x32cd32, 0x9370db]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; var decoration = self.attachAsset('decoration', { anchorX: 0.5, anchorY: 0.5 }); decoration.tint = randomColor; // Gentle floating animation function _float() { tween(self, { y: self.y - 10 }, { duration: 2000, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { y: self.y + 10 }, { duration: 2000, easing: tween.easeInOut, onFinish: _float }); } }); } _float(); return self; }); var PartyButton = Container.expand(function (buttonType) { var self = Container.call(this); var button = self.attachAsset(buttonType === 'popper' ? 'partyPopper' : 'partyHorn', { anchorX: 0.5, anchorY: 0.5 }); self.buttonType = buttonType; self.down = function (x, y, obj) { // Button press animation tween(self, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 100 }); } }); if (self.buttonType === 'popper') { activatePopper(); } else { activateHorn(); } }; return self; }); var PartyGirl = Container.expand(function () { var self = Container.call(this); // Main body var body = self.attachAsset('partyGirl', { anchorX: 0.5, anchorY: 1.0 }); // Party hat var hat = self.attachAsset('partyHat', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -600 }); // Tummy area (clickable) var tummy = self.attachAsset('tummy', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -200 }); tummy.alpha = 0.01; // Nearly invisible but still clickable self.isDancing = false; self.startDancing = function () { if (self.isDancing) return; self.isDancing = true; function danceMove() { if (!self.isDancing) return; tween(self, { rotation: 0.1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { rotation: -0.1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { rotation: 0 }, { duration: 300, easing: tween.easeInOut, onFinish: danceMove }); } }); } }); } danceMove(); }; self.stopDancing = function () { self.isDancing = false; tween.stop(self, { rotation: true }); tween(self, { rotation: 0 }, { duration: 300, easing: tween.easeOut }); }; // Tummy click handler tummy.down = function (x, y, obj) { var currentTime = Date.now(); if (!self.lastTapTime) self.lastTapTime = 0; var timeDiff = currentTime - self.lastTapTime; if (timeDiff < 500) { // Double tap detected playBirthdaySong(); } else { playRandomSaying(); } self.lastTapTime = currentTime; }; return self; }); var SpeechBubble = Container.expand(function () { var self = Container.call(this); var bubble = self.attachAsset('speechBubble', { anchorX: 0.5, anchorY: 0.5 }); var text = new Text2('', { size: 36, fill: 0x000000 }); text.anchor.set(0.5, 0.5); self.addChild(text); self.alpha = 0; self.showMessage = function (message) { text.setText(message); self.alpha = 1; tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeIn }); } }); LK.setTimeout(function () { tween(self, { alpha: 0 }, { duration: 500 }); }, 2000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ // Game variables var partyGirl; var speechBubble; var popperButton; var hornButton; var confettiPieces = []; var decorations = []; // Party sayings var partySayings = ["Let's party!", "Happy birthday!", "Time to celebrate!", "Woohoo!", "Party time!", "Let's dance!", "Yay! Fun time!"]; // Initialize party girl partyGirl = game.addChild(new PartyGirl()); partyGirl.x = 2048 / 2; partyGirl.y = 2732 - 200; // Initialize speech bubble speechBubble = game.addChild(new SpeechBubble()); speechBubble.x = 2048 / 2; speechBubble.y = 2732 / 2 - 200; // Initialize buttons popperButton = game.addChild(new PartyButton('popper')); popperButton.x = 200; popperButton.y = 2732 - 150; hornButton = game.addChild(new PartyButton('horn')); hornButton.x = 2048 - 200; hornButton.y = 2732 - 150; // Create decorations around the screen for (var i = 0; i < 12; i++) { var decoration = game.addChild(new Decoration()); if (i < 6) { // Top decorations decoration.x = (i + 1) * (2048 / 7); decoration.y = 100; } else { // Side decorations var side = i - 6; if (side < 3) { decoration.x = 100; decoration.y = 400 + side * 600; } else { decoration.x = 2048 - 100; decoration.y = 400 + (side - 3) * 600; } } decorations.push(decoration); } // Game functions function playRandomSaying() { var randomIndex = Math.floor(Math.random() * partySayings.length); var saying = partySayings[randomIndex]; speechBubble.showMessage(saying); var soundIndex = randomIndex + 1; LK.getSound('partySound' + soundIndex).play(); // Small bounce animation for party girl tween(partyGirl, { scaleY: 1.1 }, { duration: 200, onFinish: function onFinish() { tween(partyGirl, { scaleY: 1 }, { duration: 200 }); } }); } function playBirthdaySong() { speechBubble.showMessage("🎵 Happy Birthday! 🎵"); LK.getSound('birthdaySong').play(); partyGirl.startDancing(); // Stop dancing after song duration LK.setTimeout(function () { partyGirl.stopDancing(); }, 4000); } function activatePopper() { LK.getSound('popperSound').play(); // Create confetti explosion for (var i = 0; i < 20; i++) { var confetti = game.addChild(new ConfettiPiece()); confetti.x = popperButton.x + (Math.random() - 0.5) * 100; confetti.y = popperButton.y; confettiPieces.push(confetti); } } function activateHorn() { LK.getSound('hornSound').play(); // Create puff effects for (var i = 0; i < 5; i++) { var puff = LK.getAsset('puffEffect', { anchorX: 0.5, anchorY: 0.5 }); puff.x = hornButton.x + 80 + i * 30; puff.y = hornButton.y + (Math.random() - 0.5) * 40; game.addChild(puff); tween(puff, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { puff.destroy(); } }); } } // Game update loop game.update = function () { // Update confetti pieces for (var i = confettiPieces.length - 1; i >= 0; i--) { if (confettiPieces[i] && confettiPieces[i].update) { confettiPieces[i].update(); } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,350 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var ConfettiPiece = Container.expand(function () {
+ var self = Container.call(this);
+ var colors = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff];
+ var randomColor = colors[Math.floor(Math.random() * colors.length)];
+ var piece = self.attachAsset('confetti', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ piece.tint = randomColor;
+ self.velocityX = (Math.random() - 0.5) * 10;
+ self.velocityY = Math.random() * -15 - 5;
+ self.gravity = 0.5;
+ self.rotationSpeed = (Math.random() - 0.5) * 0.2;
+ self.update = function () {
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ self.velocityY += self.gravity;
+ self.rotation += self.rotationSpeed;
+ if (self.y > 2732 + 50) {
+ self.destroy();
+ for (var i = confettiPieces.length - 1; i >= 0; i--) {
+ if (confettiPieces[i] === self) {
+ confettiPieces.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
+var Decoration = Container.expand(function () {
+ var self = Container.call(this);
+ var colors = [0xff69b4, 0xff4500, 0xffd700, 0x32cd32, 0x9370db];
+ var randomColor = colors[Math.floor(Math.random() * colors.length)];
+ var decoration = self.attachAsset('decoration', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ decoration.tint = randomColor;
+ // Gentle floating animation
+ function _float() {
+ tween(self, {
+ y: self.y - 10
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ y: self.y + 10
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut,
+ onFinish: _float
+ });
+ }
+ });
+ }
+ _float();
+ return self;
+});
+var PartyButton = Container.expand(function (buttonType) {
+ var self = Container.call(this);
+ var button = self.attachAsset(buttonType === 'popper' ? 'partyPopper' : 'partyHorn', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.buttonType = buttonType;
+ self.down = function (x, y, obj) {
+ // Button press animation
+ tween(self, {
+ scaleX: 0.9,
+ scaleY: 0.9
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 100
+ });
+ }
+ });
+ if (self.buttonType === 'popper') {
+ activatePopper();
+ } else {
+ activateHorn();
+ }
+ };
+ return self;
+});
+var PartyGirl = Container.expand(function () {
+ var self = Container.call(this);
+ // Main body
+ var body = self.attachAsset('partyGirl', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ // Party hat
+ var hat = self.attachAsset('partyHat', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ x: 0,
+ y: -600
+ });
+ // Tummy area (clickable)
+ var tummy = self.attachAsset('tummy', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: -200
+ });
+ tummy.alpha = 0.01; // Nearly invisible but still clickable
+ self.isDancing = false;
+ self.startDancing = function () {
+ if (self.isDancing) return;
+ self.isDancing = true;
+ function danceMove() {
+ if (!self.isDancing) return;
+ tween(self, {
+ rotation: 0.1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ rotation: -0.1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ rotation: 0
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: danceMove
+ });
+ }
+ });
+ }
+ });
+ }
+ danceMove();
+ };
+ self.stopDancing = function () {
+ self.isDancing = false;
+ tween.stop(self, {
+ rotation: true
+ });
+ tween(self, {
+ rotation: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ };
+ // Tummy click handler
+ tummy.down = function (x, y, obj) {
+ var currentTime = Date.now();
+ if (!self.lastTapTime) self.lastTapTime = 0;
+ var timeDiff = currentTime - self.lastTapTime;
+ if (timeDiff < 500) {
+ // Double tap detected
+ playBirthdaySong();
+ } else {
+ playRandomSaying();
+ }
+ self.lastTapTime = currentTime;
+ };
+ return self;
+});
+var SpeechBubble = Container.expand(function () {
+ var self = Container.call(this);
+ var bubble = self.attachAsset('speechBubble', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var text = new Text2('', {
+ size: 36,
+ fill: 0x000000
+ });
+ text.anchor.set(0.5, 0.5);
+ self.addChild(text);
+ self.alpha = 0;
+ self.showMessage = function (message) {
+ text.setText(message);
+ self.alpha = 1;
+ tween(self, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.easeIn
+ });
+ }
+ });
+ LK.setTimeout(function () {
+ tween(self, {
+ alpha: 0
+ }, {
+ duration: 500
+ });
+ }, 2000);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87ceeb
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var partyGirl;
+var speechBubble;
+var popperButton;
+var hornButton;
+var confettiPieces = [];
+var decorations = [];
+// Party sayings
+var partySayings = ["Let's party!", "Happy birthday!", "Time to celebrate!", "Woohoo!", "Party time!", "Let's dance!", "Yay! Fun time!"];
+// Initialize party girl
+partyGirl = game.addChild(new PartyGirl());
+partyGirl.x = 2048 / 2;
+partyGirl.y = 2732 - 200;
+// Initialize speech bubble
+speechBubble = game.addChild(new SpeechBubble());
+speechBubble.x = 2048 / 2;
+speechBubble.y = 2732 / 2 - 200;
+// Initialize buttons
+popperButton = game.addChild(new PartyButton('popper'));
+popperButton.x = 200;
+popperButton.y = 2732 - 150;
+hornButton = game.addChild(new PartyButton('horn'));
+hornButton.x = 2048 - 200;
+hornButton.y = 2732 - 150;
+// Create decorations around the screen
+for (var i = 0; i < 12; i++) {
+ var decoration = game.addChild(new Decoration());
+ if (i < 6) {
+ // Top decorations
+ decoration.x = (i + 1) * (2048 / 7);
+ decoration.y = 100;
+ } else {
+ // Side decorations
+ var side = i - 6;
+ if (side < 3) {
+ decoration.x = 100;
+ decoration.y = 400 + side * 600;
+ } else {
+ decoration.x = 2048 - 100;
+ decoration.y = 400 + (side - 3) * 600;
+ }
+ }
+ decorations.push(decoration);
+}
+// Game functions
+function playRandomSaying() {
+ var randomIndex = Math.floor(Math.random() * partySayings.length);
+ var saying = partySayings[randomIndex];
+ speechBubble.showMessage(saying);
+ var soundIndex = randomIndex + 1;
+ LK.getSound('partySound' + soundIndex).play();
+ // Small bounce animation for party girl
+ tween(partyGirl, {
+ scaleY: 1.1
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(partyGirl, {
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+}
+function playBirthdaySong() {
+ speechBubble.showMessage("🎵 Happy Birthday! 🎵");
+ LK.getSound('birthdaySong').play();
+ partyGirl.startDancing();
+ // Stop dancing after song duration
+ LK.setTimeout(function () {
+ partyGirl.stopDancing();
+ }, 4000);
+}
+function activatePopper() {
+ LK.getSound('popperSound').play();
+ // Create confetti explosion
+ for (var i = 0; i < 20; i++) {
+ var confetti = game.addChild(new ConfettiPiece());
+ confetti.x = popperButton.x + (Math.random() - 0.5) * 100;
+ confetti.y = popperButton.y;
+ confettiPieces.push(confetti);
+ }
+}
+function activateHorn() {
+ LK.getSound('hornSound').play();
+ // Create puff effects
+ for (var i = 0; i < 5; i++) {
+ var puff = LK.getAsset('puffEffect', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ puff.x = hornButton.x + 80 + i * 30;
+ puff.y = hornButton.y + (Math.random() - 0.5) * 40;
+ game.addChild(puff);
+ tween(puff, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 1000,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ puff.destroy();
+ }
+ });
+ }
+}
+// Game update loop
+game.update = function () {
+ // Update confetti pieces
+ for (var i = confettiPieces.length - 1; i >= 0; i--) {
+ if (confettiPieces[i] && confettiPieces[i].update) {
+ confettiPieces[i].update();
+ }
+ }
+};
\ No newline at end of file