Code edit (1 edits merged)
Please save this source code
User prompt
Powerpuff Ski Adventure
Initial prompt
Toca snowy mountain (December 2012-December 2021). The snowflakes are falling. And the powerpuff girls are skiing down the mountains. Tap on them to walk side ways like crabs, tap on them to watch them go down the mountain, to reach the small snow hill to go loop the loop, past the shops, past blossom’s house, after they reach to hit the playgroup 🏫
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Landmark = Container.expand(function (type) { var self = Container.call(this); var landmarkGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.passed = false; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var PowerpuffGirl = Container.expand(function (characterType) { var self = Container.call(this); var characterGraphics = self.attachAsset(characterType, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.sidewaysSpeed = 0; self.acceleration = 0.1; self.isAccelerating = false; self.characterType = characterType; self.update = function () { // Move down the mountain self.y += self.speed; // Handle sideways movement if (self.sidewaysSpeed > 0) { self.x += self.sidewaysSpeed; self.sidewaysSpeed *= 0.95; // Gradual slowdown } else if (self.sidewaysSpeed < 0) { self.x += self.sidewaysSpeed; self.sidewaysSpeed *= 0.95; } // Handle acceleration if (self.isAccelerating) { self.speed += self.acceleration; if (self.speed > 8) self.speed = 8; // Max speed } else { if (self.speed > 2) { self.speed -= 0.05; // Gradual slowdown } } // Keep character within screen bounds if (self.x < 50) self.x = 50; if (self.x > 1998) self.x = 1998; }; self.moveLeft = function () { self.sidewaysSpeed = -8; LK.getSound('swoosh').play(); }; self.moveRight = function () { self.sidewaysSpeed = 8; LK.getSound('swoosh').play(); }; self.accelerate = function () { self.isAccelerating = true; }; self.stopAccelerate = function () { self.isAccelerating = false; }; self.down = function (x, y, obj) { if (x < self.width / 2) { self.moveLeft(); } else { self.moveRight(); } }; return self; }); var Snowflake = Container.expand(function () { var self = Container.call(this); var snowflakeGraphics = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 2 + 1; self.drift = (Math.random() - 0.5) * 2; self.update = function () { self.y += self.speed; self.x += self.drift; if (self.y > 2800) { self.y = -50; self.x = Math.random() * 2048; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var powerpuffGirls = []; var snowflakes = []; var obstacles = []; var landmarks = []; var gameStarted = false; var allGirlsFinished = false; var cameraY = 0; var mountainLength = 4000; // UI elements var scoreTxt = new Text2('Distance: 0m', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var instructionTxt = new Text2('Tap girls to move sideways, tap and hold to accelerate!', { size: 40, fill: 0xFFFFFF }); instructionTxt.anchor.set(0.5, 0); instructionTxt.x = LK.gui.center.x; instructionTxt.y = 100; LK.gui.center.addChild(instructionTxt); // Create Powerpuff Girls var blossom = game.addChild(new PowerpuffGirl('blossom')); blossom.x = 500; blossom.y = 200; powerpuffGirls.push(blossom); var bubbles = game.addChild(new PowerpuffGirl('bubbles')); bubbles.x = 1024; bubbles.y = 200; powerpuffGirls.push(bubbles); var buttercup = game.addChild(new PowerpuffGirl('buttercup')); buttercup.x = 1500; buttercup.y = 200; powerpuffGirls.push(buttercup); // Create snowflakes for (var i = 0; i < 30; i++) { var snowflake = game.addChild(new Snowflake()); snowflake.x = Math.random() * 2048; snowflake.y = Math.random() * 2732; snowflakes.push(snowflake); } // Create landmarks along the mountain var landmarkPositions = [{ type: 'hill', x: 300, y: 800 }, { type: 'shop', x: 1200, y: 1200 }, { type: 'hill', x: 800, y: 1600 }, { type: 'house', x: 1600, y: 2000 }, { type: 'hill', x: 400, y: 2400 }, { type: 'shop', x: 1000, y: 2800 }, { type: 'playgroup', x: 1024, y: 3600 }]; for (var i = 0; i < landmarkPositions.length; i++) { var landmark = game.addChild(new Landmark(landmarkPositions[i].type)); landmark.x = landmarkPositions[i].x; landmark.y = landmarkPositions[i].y; landmarks.push(landmark); } // Create obstacles var obstaclePositions = [{ x: 600, y: 1000 }, { x: 1400, y: 1400 }, { x: 200, y: 1800 }, { x: 1800, y: 2200 }, { x: 700, y: 2600 }, { x: 1300, y: 3000 }]; for (var i = 0; i < obstaclePositions.length; i++) { var obstacle = game.addChild(new Obstacle()); obstacle.x = obstaclePositions[i].x; obstacle.y = obstaclePositions[i].y; obstacles.push(obstacle); } // Game input handling var acceleratingGirls = []; game.down = function (x, y, obj) { // Check if tapping on a girl for acceleration for (var i = 0; i < powerpuffGirls.length; i++) { var girl = powerpuffGirls[i]; var localPos = girl.toLocal({ x: x, y: y }); if (Math.abs(localPos.x) < 40 && Math.abs(localPos.y) < 40) { girl.accelerate(); if (acceleratingGirls.indexOf(girl) === -1) { acceleratingGirls.push(girl); } return; } } }; game.up = function (x, y, obj) { // Stop acceleration for all girls for (var i = 0; i < acceleratingGirls.length; i++) { acceleratingGirls[i].stopAccelerate(); } acceleratingGirls = []; }; // Main game loop game.update = function () { if (!gameStarted) { gameStarted = true; // Hide instruction after 3 seconds LK.setTimeout(function () { if (instructionTxt.parent) { instructionTxt.parent.removeChild(instructionTxt); } }, 3000); } // Calculate camera position based on the leading girl var leadingY = Math.max(blossom.y, bubbles.y, buttercup.y); cameraY = leadingY - 400; // Update camera position game.y = -cameraY; // Update distance score var distance = Math.floor(leadingY / 10); scoreTxt.setText('Distance: ' + distance + 'm'); // Check collisions with obstacles for (var i = 0; i < powerpuffGirls.length; i++) { var girl = powerpuffGirls[i]; for (var j = 0; j < obstacles.length; j++) { var obstacle = obstacles[j]; if (girl.intersects(obstacle)) { // Slow down the girl when hitting obstacle girl.speed = Math.max(1, girl.speed - 1); LK.effects.flashObject(girl, 0xFF0000, 500); } } } // Check if girls reached landmarks for (var i = 0; i < landmarks.length; i++) { var landmark = landmarks[i]; if (!landmark.passed) { for (var j = 0; j < powerpuffGirls.length; j++) { var girl = powerpuffGirls[j]; if (girl.intersects(landmark)) { landmark.passed = true; LK.setScore(LK.getScore() + 10); LK.getSound('collect').play(); if (landmark.type === 'playgroup') { // Check if all girls reached the playgroup var allReached = true; for (var k = 0; k < powerpuffGirls.length; k++) { if (!powerpuffGirls[k].intersects(landmark)) { allReached = false; break; } } if (allReached && !allGirlsFinished) { allGirlsFinished = true; LK.setTimeout(function () { LK.showYouWin(); }, 1000); } } break; } } } } // Check if any girl went too far off course for (var i = 0; i < powerpuffGirls.length; i++) { var girl = powerpuffGirls[i]; if (girl.y > mountainLength + 500) { LK.showGameOver(); return; } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Landmark = Container.expand(function (type) {
var self = Container.call(this);
var landmarkGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.passed = false;
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var PowerpuffGirl = Container.expand(function (characterType) {
var self = Container.call(this);
var characterGraphics = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.sidewaysSpeed = 0;
self.acceleration = 0.1;
self.isAccelerating = false;
self.characterType = characterType;
self.update = function () {
// Move down the mountain
self.y += self.speed;
// Handle sideways movement
if (self.sidewaysSpeed > 0) {
self.x += self.sidewaysSpeed;
self.sidewaysSpeed *= 0.95; // Gradual slowdown
} else if (self.sidewaysSpeed < 0) {
self.x += self.sidewaysSpeed;
self.sidewaysSpeed *= 0.95;
}
// Handle acceleration
if (self.isAccelerating) {
self.speed += self.acceleration;
if (self.speed > 8) self.speed = 8; // Max speed
} else {
if (self.speed > 2) {
self.speed -= 0.05; // Gradual slowdown
}
}
// Keep character within screen bounds
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
};
self.moveLeft = function () {
self.sidewaysSpeed = -8;
LK.getSound('swoosh').play();
};
self.moveRight = function () {
self.sidewaysSpeed = 8;
LK.getSound('swoosh').play();
};
self.accelerate = function () {
self.isAccelerating = true;
};
self.stopAccelerate = function () {
self.isAccelerating = false;
};
self.down = function (x, y, obj) {
if (x < self.width / 2) {
self.moveLeft();
} else {
self.moveRight();
}
};
return self;
});
var Snowflake = Container.expand(function () {
var self = Container.call(this);
var snowflakeGraphics = self.attachAsset('snowflake', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 2 + 1;
self.drift = (Math.random() - 0.5) * 2;
self.update = function () {
self.y += self.speed;
self.x += self.drift;
if (self.y > 2800) {
self.y = -50;
self.x = Math.random() * 2048;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var powerpuffGirls = [];
var snowflakes = [];
var obstacles = [];
var landmarks = [];
var gameStarted = false;
var allGirlsFinished = false;
var cameraY = 0;
var mountainLength = 4000;
// UI elements
var scoreTxt = new Text2('Distance: 0m', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var instructionTxt = new Text2('Tap girls to move sideways, tap and hold to accelerate!', {
size: 40,
fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 0);
instructionTxt.x = LK.gui.center.x;
instructionTxt.y = 100;
LK.gui.center.addChild(instructionTxt);
// Create Powerpuff Girls
var blossom = game.addChild(new PowerpuffGirl('blossom'));
blossom.x = 500;
blossom.y = 200;
powerpuffGirls.push(blossom);
var bubbles = game.addChild(new PowerpuffGirl('bubbles'));
bubbles.x = 1024;
bubbles.y = 200;
powerpuffGirls.push(bubbles);
var buttercup = game.addChild(new PowerpuffGirl('buttercup'));
buttercup.x = 1500;
buttercup.y = 200;
powerpuffGirls.push(buttercup);
// Create snowflakes
for (var i = 0; i < 30; i++) {
var snowflake = game.addChild(new Snowflake());
snowflake.x = Math.random() * 2048;
snowflake.y = Math.random() * 2732;
snowflakes.push(snowflake);
}
// Create landmarks along the mountain
var landmarkPositions = [{
type: 'hill',
x: 300,
y: 800
}, {
type: 'shop',
x: 1200,
y: 1200
}, {
type: 'hill',
x: 800,
y: 1600
}, {
type: 'house',
x: 1600,
y: 2000
}, {
type: 'hill',
x: 400,
y: 2400
}, {
type: 'shop',
x: 1000,
y: 2800
}, {
type: 'playgroup',
x: 1024,
y: 3600
}];
for (var i = 0; i < landmarkPositions.length; i++) {
var landmark = game.addChild(new Landmark(landmarkPositions[i].type));
landmark.x = landmarkPositions[i].x;
landmark.y = landmarkPositions[i].y;
landmarks.push(landmark);
}
// Create obstacles
var obstaclePositions = [{
x: 600,
y: 1000
}, {
x: 1400,
y: 1400
}, {
x: 200,
y: 1800
}, {
x: 1800,
y: 2200
}, {
x: 700,
y: 2600
}, {
x: 1300,
y: 3000
}];
for (var i = 0; i < obstaclePositions.length; i++) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = obstaclePositions[i].x;
obstacle.y = obstaclePositions[i].y;
obstacles.push(obstacle);
}
// Game input handling
var acceleratingGirls = [];
game.down = function (x, y, obj) {
// Check if tapping on a girl for acceleration
for (var i = 0; i < powerpuffGirls.length; i++) {
var girl = powerpuffGirls[i];
var localPos = girl.toLocal({
x: x,
y: y
});
if (Math.abs(localPos.x) < 40 && Math.abs(localPos.y) < 40) {
girl.accelerate();
if (acceleratingGirls.indexOf(girl) === -1) {
acceleratingGirls.push(girl);
}
return;
}
}
};
game.up = function (x, y, obj) {
// Stop acceleration for all girls
for (var i = 0; i < acceleratingGirls.length; i++) {
acceleratingGirls[i].stopAccelerate();
}
acceleratingGirls = [];
};
// Main game loop
game.update = function () {
if (!gameStarted) {
gameStarted = true;
// Hide instruction after 3 seconds
LK.setTimeout(function () {
if (instructionTxt.parent) {
instructionTxt.parent.removeChild(instructionTxt);
}
}, 3000);
}
// Calculate camera position based on the leading girl
var leadingY = Math.max(blossom.y, bubbles.y, buttercup.y);
cameraY = leadingY - 400;
// Update camera position
game.y = -cameraY;
// Update distance score
var distance = Math.floor(leadingY / 10);
scoreTxt.setText('Distance: ' + distance + 'm');
// Check collisions with obstacles
for (var i = 0; i < powerpuffGirls.length; i++) {
var girl = powerpuffGirls[i];
for (var j = 0; j < obstacles.length; j++) {
var obstacle = obstacles[j];
if (girl.intersects(obstacle)) {
// Slow down the girl when hitting obstacle
girl.speed = Math.max(1, girl.speed - 1);
LK.effects.flashObject(girl, 0xFF0000, 500);
}
}
}
// Check if girls reached landmarks
for (var i = 0; i < landmarks.length; i++) {
var landmark = landmarks[i];
if (!landmark.passed) {
for (var j = 0; j < powerpuffGirls.length; j++) {
var girl = powerpuffGirls[j];
if (girl.intersects(landmark)) {
landmark.passed = true;
LK.setScore(LK.getScore() + 10);
LK.getSound('collect').play();
if (landmark.type === 'playgroup') {
// Check if all girls reached the playgroup
var allReached = true;
for (var k = 0; k < powerpuffGirls.length; k++) {
if (!powerpuffGirls[k].intersects(landmark)) {
allReached = false;
break;
}
}
if (allReached && !allGirlsFinished) {
allGirlsFinished = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
}
break;
}
}
}
}
// Check if any girl went too far off course
for (var i = 0; i < powerpuffGirls.length; i++) {
var girl = powerpuffGirls[i];
if (girl.y > mountainLength + 500) {
LK.showGameOver();
return;
}
}
};