/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var ClothingItem = Container.expand(function (assetId, offsetX, offsetY) {
var self = Container.call(this);
self.assetId = assetId;
self.offsetX = offsetX || 0;
self.offsetY = offsetY || 0;
self.isBeingDragged = false;
self.originalX = 0;
self.originalY = 0;
self.targetGirl = null;
var graphic = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
self.isBeingDragged = true;
self.originalX = self.x;
self.originalY = self.y;
// Bring to front
if (self.parent) {
self.parent.removeChild(self);
self.parent.addChild(self);
}
};
self.setOriginalPosition = function (x, y) {
self.originalX = x;
self.originalY = y;
self.x = x;
self.y = y;
};
return self;
});
var PowerpuffGirl = Container.expand(function (name, color, x, y) {
var self = Container.call(this);
self.name = name;
self.girlColor = color;
// Create base character
var baseShape = self.attachAsset(name + '_base', {
anchorX: 0.5,
anchorY: 0.5
});
// Position the girl
self.x = x;
self.y = y;
// Storage for worn items
self.wornItems = [];
// Tummy tap area (invisible)
self.tummyArea = {
x: -50,
y: 50,
width: 100,
height: 100
};
self.down = function (x, y, obj) {
// Check if tap is in tummy area
var localPos = self.toLocal({
x: x,
y: y
});
if (localPos.x >= self.tummyArea.x && localPos.x <= self.tummyArea.x + self.tummyArea.width && localPos.y >= self.tummyArea.y && localPos.y <= self.tummyArea.y + self.tummyArea.height) {
self.speak();
}
};
self.speak = function () {
// Play voice sound
LK.getSound(self.name + '_voice').play();
// Show text bubble
var phrases = ["I look amazing!", "This outfit is perfect!", "I love this style!", "Super cute!", "Fashion forward!"];
var randomPhrase = phrases[Math.floor(Math.random() * phrases.length)];
self.showTextBubble(randomPhrase);
};
self.showTextBubble = function (text) {
var bubble = new Text2(text, {
size: 40,
fill: 0x000000
});
bubble.anchor.set(0.5, 0.5);
bubble.x = 0;
bubble.y = -250;
bubble.alpha = 0;
self.addChild(bubble);
// Animate in
tween(bubble, {
alpha: 1,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut
});
// Animate out and remove
LK.setTimeout(function () {
tween(bubble, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8,
y: -300
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
bubble.destroy();
}
});
}, 1500);
};
self.addClothing = function (clothingItem) {
self.wornItems.push(clothingItem);
self.addChild(clothingItem);
};
return self;
});
var ThemeButton = Container.expand(function (assetId, themeName, x, y) {
var self = Container.call(this);
self.themeName = themeName;
self.isSelected = false;
var buttonShape = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
var label = new Text2(themeName.toUpperCase(), {
size: 30,
fill: 0x000000
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
self.x = x;
self.y = y;
self.down = function (x, y, obj) {
currentTheme = self.themeName;
updateSelectedTheme();
showThemeClothing(self.themeName);
};
self.setSelected = function (selected) {
self.isSelected = selected;
if (selected) {
buttonShape.alpha = 1.0;
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200
});
} else {
buttonShape.alpha = 0.7;
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Sound effects
// Worker outfit pieces
// Santa outfit pieces
// Party outfit pieces
// Maid outfit pieces
// Baker outfit pieces
// Theme buttons
// Character assets
// Game state
var currentTheme = 'baker';
var draggedItem = null;
var girls = [];
var themeButtons = [];
var clothingItems = [];
// Create the three Powerpuff Girls
var blossom = game.addChild(new PowerpuffGirl('blossom', 0xffc0cb, 500, 1400));
var bubbles = game.addChild(new PowerpuffGirl('bubbles', 0x87ceeb, 1024, 1400));
var buttercup = game.addChild(new PowerpuffGirl('buttercup', 0x90ee90, 1548, 1400));
girls.push(blossom, bubbles, buttercup);
// Create theme buttons
var buttonY = 200;
var buttonSpacing = 220;
var startX = 324;
var bakerBtn = game.addChild(new ThemeButton('baker_btn', 'baker', startX, buttonY));
var maidBtn = game.addChild(new ThemeButton('maid_btn', 'maid', startX + buttonSpacing, buttonY));
var partyBtn = game.addChild(new ThemeButton('party_btn', 'party', startX + buttonSpacing * 2, buttonY));
var santaBtn = game.addChild(new ThemeButton('santa_btn', 'santa', startX + buttonSpacing * 3, buttonY));
var workerBtn = game.addChild(new ThemeButton('worker_btn', 'worker', startX + buttonSpacing * 4, buttonY));
themeButtons.push(bakerBtn, maidBtn, partyBtn, santaBtn, workerBtn);
// Theme clothing definitions
var themeClothing = {
'baker': [{
asset: 'baker_hat',
x: 200,
y: 500,
offsetX: 0,
offsetY: -150
}, {
asset: 'baker_apron',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'baker_shirt',
x: 600,
y: 500,
offsetX: 0,
offsetY: 0
}],
'maid': [{
asset: 'maid_headband',
x: 200,
y: 500,
offsetX: 0,
offsetY: -120
}, {
asset: 'maid_dress',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'maid_collar',
x: 600,
y: 500,
offsetX: 0,
offsetY: -50
}],
'party': [{
asset: 'party_crown',
x: 200,
y: 500,
offsetX: 0,
offsetY: -140
}, {
asset: 'party_dress',
x: 400,
y: 500,
offsetX: 0,
offsetY: 60
}, {
asset: 'party_necklace',
x: 600,
y: 500,
offsetX: 0,
offsetY: -40
}],
'santa': [{
asset: 'santa_hat',
x: 200,
y: 500,
offsetX: 0,
offsetY: -130
}, {
asset: 'santa_coat',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'santa_belt',
x: 600,
y: 500,
offsetX: 0,
offsetY: 30
}],
'worker': [{
asset: 'worker_helmet',
x: 200,
y: 500,
offsetX: 0,
offsetY: -140
}, {
asset: 'worker_vest',
x: 400,
y: 500,
offsetX: 0,
offsetY: 20
}, {
asset: 'worker_tools',
x: 600,
y: 500,
offsetX: 60,
offsetY: 80
}]
};
function updateSelectedTheme() {
for (var i = 0; i < themeButtons.length; i++) {
themeButtons[i].setSelected(themeButtons[i].themeName === currentTheme);
}
}
function clearClothingItems() {
for (var i = clothingItems.length - 1; i >= 0; i--) {
clothingItems[i].destroy();
}
clothingItems = [];
}
function showThemeClothing(theme) {
clearClothingItems();
var items = themeClothing[theme];
if (!items) return;
for (var i = 0; i < items.length; i++) {
var itemData = items[i];
var clothingItem = game.addChild(new ClothingItem(itemData.asset, itemData.offsetX, itemData.offsetY));
clothingItem.setOriginalPosition(itemData.x, itemData.y);
clothingItems.push(clothingItem);
}
}
function handleMove(x, y, obj) {
if (draggedItem) {
draggedItem.x = x;
draggedItem.y = y;
}
}
function findNearestGirl(item) {
var closestGirl = null;
var closestDistance = Infinity;
for (var i = 0; i < girls.length; i++) {
var girl = girls[i];
var dx = item.x - girl.x;
var dy = item.y - girl.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance && distance < 200) {
closestDistance = distance;
closestGirl = girl;
}
}
return closestGirl;
}
// Game event handlers
game.move = handleMove;
game.down = function (x, y, obj) {
// Check if clicking on a clothing item
for (var i = 0; i < clothingItems.length; i++) {
var item = clothingItems[i];
if (item.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
if (item.isBeingDragged) {
draggedItem = item;
handleMove(x, y, obj);
break;
}
}
}
};
game.up = function (x, y, obj) {
if (draggedItem) {
var nearestGirl = findNearestGirl(draggedItem);
if (nearestGirl) {
// Snap to girl and play sound
LK.getSound('dress_up').play();
// Position relative to girl
var newClothing = game.addChild(new ClothingItem(draggedItem.assetId, draggedItem.offsetX, draggedItem.offsetY));
newClothing.x = nearestGirl.x + draggedItem.offsetX;
newClothing.y = nearestGirl.y + draggedItem.offsetY;
// Add to girl's worn items
nearestGirl.addClothing(newClothing);
// Reset original item position
draggedItem.x = draggedItem.originalX;
draggedItem.y = draggedItem.originalY;
} else {
// Return to original position
tween(draggedItem, {
x: draggedItem.originalX,
y: draggedItem.originalY
}, {
duration: 300,
easing: tween.easeOut
});
}
draggedItem = null;
}
};
// Initialize with baker theme
updateSelectedTheme();
showThemeClothing(currentTheme);
// Add title
var titleText = new Text2('POWERPUFF GIRLS DRESS UP', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 100;
game.addChild(titleText);
// Add instructions
var instructionText = new Text2('Tap themes, drag clothes, tap tummies!', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 320;
game.addChild(instructionText); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var ClothingItem = Container.expand(function (assetId, offsetX, offsetY) {
var self = Container.call(this);
self.assetId = assetId;
self.offsetX = offsetX || 0;
self.offsetY = offsetY || 0;
self.isBeingDragged = false;
self.originalX = 0;
self.originalY = 0;
self.targetGirl = null;
var graphic = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
self.isBeingDragged = true;
self.originalX = self.x;
self.originalY = self.y;
// Bring to front
if (self.parent) {
self.parent.removeChild(self);
self.parent.addChild(self);
}
};
self.setOriginalPosition = function (x, y) {
self.originalX = x;
self.originalY = y;
self.x = x;
self.y = y;
};
return self;
});
var PowerpuffGirl = Container.expand(function (name, color, x, y) {
var self = Container.call(this);
self.name = name;
self.girlColor = color;
// Create base character
var baseShape = self.attachAsset(name + '_base', {
anchorX: 0.5,
anchorY: 0.5
});
// Position the girl
self.x = x;
self.y = y;
// Storage for worn items
self.wornItems = [];
// Tummy tap area (invisible)
self.tummyArea = {
x: -50,
y: 50,
width: 100,
height: 100
};
self.down = function (x, y, obj) {
// Check if tap is in tummy area
var localPos = self.toLocal({
x: x,
y: y
});
if (localPos.x >= self.tummyArea.x && localPos.x <= self.tummyArea.x + self.tummyArea.width && localPos.y >= self.tummyArea.y && localPos.y <= self.tummyArea.y + self.tummyArea.height) {
self.speak();
}
};
self.speak = function () {
// Play voice sound
LK.getSound(self.name + '_voice').play();
// Show text bubble
var phrases = ["I look amazing!", "This outfit is perfect!", "I love this style!", "Super cute!", "Fashion forward!"];
var randomPhrase = phrases[Math.floor(Math.random() * phrases.length)];
self.showTextBubble(randomPhrase);
};
self.showTextBubble = function (text) {
var bubble = new Text2(text, {
size: 40,
fill: 0x000000
});
bubble.anchor.set(0.5, 0.5);
bubble.x = 0;
bubble.y = -250;
bubble.alpha = 0;
self.addChild(bubble);
// Animate in
tween(bubble, {
alpha: 1,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut
});
// Animate out and remove
LK.setTimeout(function () {
tween(bubble, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8,
y: -300
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
bubble.destroy();
}
});
}, 1500);
};
self.addClothing = function (clothingItem) {
self.wornItems.push(clothingItem);
self.addChild(clothingItem);
};
return self;
});
var ThemeButton = Container.expand(function (assetId, themeName, x, y) {
var self = Container.call(this);
self.themeName = themeName;
self.isSelected = false;
var buttonShape = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
var label = new Text2(themeName.toUpperCase(), {
size: 30,
fill: 0x000000
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
self.x = x;
self.y = y;
self.down = function (x, y, obj) {
currentTheme = self.themeName;
updateSelectedTheme();
showThemeClothing(self.themeName);
};
self.setSelected = function (selected) {
self.isSelected = selected;
if (selected) {
buttonShape.alpha = 1.0;
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200
});
} else {
buttonShape.alpha = 0.7;
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Sound effects
// Worker outfit pieces
// Santa outfit pieces
// Party outfit pieces
// Maid outfit pieces
// Baker outfit pieces
// Theme buttons
// Character assets
// Game state
var currentTheme = 'baker';
var draggedItem = null;
var girls = [];
var themeButtons = [];
var clothingItems = [];
// Create the three Powerpuff Girls
var blossom = game.addChild(new PowerpuffGirl('blossom', 0xffc0cb, 500, 1400));
var bubbles = game.addChild(new PowerpuffGirl('bubbles', 0x87ceeb, 1024, 1400));
var buttercup = game.addChild(new PowerpuffGirl('buttercup', 0x90ee90, 1548, 1400));
girls.push(blossom, bubbles, buttercup);
// Create theme buttons
var buttonY = 200;
var buttonSpacing = 220;
var startX = 324;
var bakerBtn = game.addChild(new ThemeButton('baker_btn', 'baker', startX, buttonY));
var maidBtn = game.addChild(new ThemeButton('maid_btn', 'maid', startX + buttonSpacing, buttonY));
var partyBtn = game.addChild(new ThemeButton('party_btn', 'party', startX + buttonSpacing * 2, buttonY));
var santaBtn = game.addChild(new ThemeButton('santa_btn', 'santa', startX + buttonSpacing * 3, buttonY));
var workerBtn = game.addChild(new ThemeButton('worker_btn', 'worker', startX + buttonSpacing * 4, buttonY));
themeButtons.push(bakerBtn, maidBtn, partyBtn, santaBtn, workerBtn);
// Theme clothing definitions
var themeClothing = {
'baker': [{
asset: 'baker_hat',
x: 200,
y: 500,
offsetX: 0,
offsetY: -150
}, {
asset: 'baker_apron',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'baker_shirt',
x: 600,
y: 500,
offsetX: 0,
offsetY: 0
}],
'maid': [{
asset: 'maid_headband',
x: 200,
y: 500,
offsetX: 0,
offsetY: -120
}, {
asset: 'maid_dress',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'maid_collar',
x: 600,
y: 500,
offsetX: 0,
offsetY: -50
}],
'party': [{
asset: 'party_crown',
x: 200,
y: 500,
offsetX: 0,
offsetY: -140
}, {
asset: 'party_dress',
x: 400,
y: 500,
offsetX: 0,
offsetY: 60
}, {
asset: 'party_necklace',
x: 600,
y: 500,
offsetX: 0,
offsetY: -40
}],
'santa': [{
asset: 'santa_hat',
x: 200,
y: 500,
offsetX: 0,
offsetY: -130
}, {
asset: 'santa_coat',
x: 400,
y: 500,
offsetX: 0,
offsetY: 50
}, {
asset: 'santa_belt',
x: 600,
y: 500,
offsetX: 0,
offsetY: 30
}],
'worker': [{
asset: 'worker_helmet',
x: 200,
y: 500,
offsetX: 0,
offsetY: -140
}, {
asset: 'worker_vest',
x: 400,
y: 500,
offsetX: 0,
offsetY: 20
}, {
asset: 'worker_tools',
x: 600,
y: 500,
offsetX: 60,
offsetY: 80
}]
};
function updateSelectedTheme() {
for (var i = 0; i < themeButtons.length; i++) {
themeButtons[i].setSelected(themeButtons[i].themeName === currentTheme);
}
}
function clearClothingItems() {
for (var i = clothingItems.length - 1; i >= 0; i--) {
clothingItems[i].destroy();
}
clothingItems = [];
}
function showThemeClothing(theme) {
clearClothingItems();
var items = themeClothing[theme];
if (!items) return;
for (var i = 0; i < items.length; i++) {
var itemData = items[i];
var clothingItem = game.addChild(new ClothingItem(itemData.asset, itemData.offsetX, itemData.offsetY));
clothingItem.setOriginalPosition(itemData.x, itemData.y);
clothingItems.push(clothingItem);
}
}
function handleMove(x, y, obj) {
if (draggedItem) {
draggedItem.x = x;
draggedItem.y = y;
}
}
function findNearestGirl(item) {
var closestGirl = null;
var closestDistance = Infinity;
for (var i = 0; i < girls.length; i++) {
var girl = girls[i];
var dx = item.x - girl.x;
var dy = item.y - girl.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance && distance < 200) {
closestDistance = distance;
closestGirl = girl;
}
}
return closestGirl;
}
// Game event handlers
game.move = handleMove;
game.down = function (x, y, obj) {
// Check if clicking on a clothing item
for (var i = 0; i < clothingItems.length; i++) {
var item = clothingItems[i];
if (item.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
if (item.isBeingDragged) {
draggedItem = item;
handleMove(x, y, obj);
break;
}
}
}
};
game.up = function (x, y, obj) {
if (draggedItem) {
var nearestGirl = findNearestGirl(draggedItem);
if (nearestGirl) {
// Snap to girl and play sound
LK.getSound('dress_up').play();
// Position relative to girl
var newClothing = game.addChild(new ClothingItem(draggedItem.assetId, draggedItem.offsetX, draggedItem.offsetY));
newClothing.x = nearestGirl.x + draggedItem.offsetX;
newClothing.y = nearestGirl.y + draggedItem.offsetY;
// Add to girl's worn items
nearestGirl.addClothing(newClothing);
// Reset original item position
draggedItem.x = draggedItem.originalX;
draggedItem.y = draggedItem.originalY;
} else {
// Return to original position
tween(draggedItem, {
x: draggedItem.originalX,
y: draggedItem.originalY
}, {
duration: 300,
easing: tween.easeOut
});
}
draggedItem = null;
}
};
// Initialize with baker theme
updateSelectedTheme();
showThemeClothing(currentTheme);
// Add title
var titleText = new Text2('POWERPUFF GIRLS DRESS UP', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 100;
game.addChild(titleText);
// Add instructions
var instructionText = new Text2('Tap themes, drag clothes, tap tummies!', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 320;
game.addChild(instructionText);