/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Ball = Container.expand(function (level) { var self = Container.call(this); var ballColors = ['ballYellow', 'ballBlue', 'ballRed', 'ballGreen', 'ballOrange', 'ballPurple']; var ballGraphics = self.attachAsset(ballColors[level - 1], { anchorX: 0.5, anchorY: 0.5 }); self.level = level; self.speedX = 0; self.speedY = 0; self.isMoving = false; self.kickTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); var speed = 8 + self.level * 2; self.speedX = dx / distance * speed; self.speedY = dy / distance * speed; self.isMoving = true; LK.getSound('kick').play(); }; self.update = function () { if (self.isMoving) { self.x += self.speedX; self.y += self.speedY; // Slow down over time self.speedX *= 0.98; self.speedY *= 0.98; if (Math.abs(self.speedX) < 0.1 && Math.abs(self.speedY) < 0.1) { self.speedX = 0; self.speedY = 0; self.isMoving = false; } } }; return self; }); var PowerpuffGirl = Container.expand(function (x, y) { var self = Container.call(this); var girlGraphics = self.attachAsset('powerpuffGirl', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.originalX = x; self.originalY = y; self.down = function (x, y, obj) { if (gameState === 'playing' && ball) { var goalCenterX = goal.x; var goalCenterY = goal.y; ball.kickTowards(goalCenterX, goalCenterY); // Visual feedback tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150 }); tween(self, { scaleX: 1, scaleY: 1 }, { duration: 150 }); } }; return self; }); var Villain = Container.expand(function (x, y, level) { var self = Container.call(this); var villainGraphics = self.attachAsset('villain', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.speed = 1 + level * 0.5; self.update = function () { if (gameState === 'playing' && ball) { var dx = ball.x - self.x; var dy = ball.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x4CAF50 }); /**** * Game Code ****/ var gameState = 'menu'; // 'menu', 'playing', 'gameOver' var currentLevel = 1; var ball = null; var goal = null; var powerpuffGirls = []; var villains = []; var levelButtons = []; // Create background var background = game.attachAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); // Create goal goal = game.attachAsset('goal', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 200 }); // Create goal posts var leftPost = game.attachAsset('goalPost', { anchorX: 0.5, anchorY: 0.5, x: goal.x - 190, y: goal.y }); var rightPost = game.attachAsset('goalPost', { anchorX: 0.5, anchorY: 0.5, x: goal.x + 190, y: goal.y }); // Create level selection UI var titleText = new Text2('Powerpuff Football Heroes', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 400; game.addChild(titleText); var instructionText = new Text2('Tap a colored ball to select difficulty', { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 2048 / 2; instructionText.y = 500; game.addChild(instructionText); // Create level selection balls var ballColors = ['ballYellow', 'ballBlue', 'ballRed', 'ballGreen', 'ballOrange', 'ballPurple']; var ballLabels = ['Level 1', 'Level 2', 'Level 3', 'Level 4', 'Level 5', 'Level 6']; for (var i = 0; i < 6; i++) { var levelBall = game.attachAsset(ballColors[i], { anchorX: 0.5, anchorY: 0.5, x: 200 + i % 3 * 300, y: 700 + Math.floor(i / 3) * 200 }); levelBall.level = i + 1; levelBall.down = function (x, y, obj) { startGame(obj.level); }; var levelText = new Text2(ballLabels[i], { size: 40, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); levelText.x = levelBall.x; levelText.y = levelBall.y + 80; game.addChild(levelText); levelButtons.push(levelBall); levelButtons.push(levelText); } // Score display var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); function startGame(level) { gameState = 'playing'; currentLevel = level; // Hide menu elements titleText.visible = false; instructionText.visible = false; for (var i = 0; i < levelButtons.length; i++) { levelButtons[i].visible = false; } // Create ball ball = game.addChild(new Ball(level)); ball.x = 2048 / 2; ball.y = 1500; // Create Powerpuff Girls powerpuffGirls = []; for (var i = 0; i < 3; i++) { var girl = game.addChild(new PowerpuffGirl(400 + i * 400, 2000)); powerpuffGirls.push(girl); } // Create villains villains = []; var villainCount = Math.min(level + 1, 5); for (var i = 0; i < villainCount; i++) { var villainX = 300 + i * 350; var villainY = 1200 + i % 2 * 200; var villain = game.addChild(new Villain(villainX, villainY, level)); villains.push(villain); } // Update score display scoreText.setText('Level: ' + level); } function resetGame() { gameState = 'menu'; // Show menu elements titleText.visible = true; instructionText.visible = true; for (var i = 0; i < levelButtons.length; i++) { levelButtons[i].visible = true; } // Clean up game objects if (ball) { ball.destroy(); ball = null; } for (var i = 0; i < powerpuffGirls.length; i++) { powerpuffGirls[i].destroy(); } powerpuffGirls = []; for (var i = 0; i < villains.length; i++) { villains[i].destroy(); } villains = []; scoreText.setText('Score: ' + LK.getScore()); } game.update = function () { if (gameState === 'playing' && ball) { // Check if ball reached goal if (ball.y < goal.y + 100 && ball.x > goal.x - 200 && ball.x < goal.x + 200) { LK.setScore(LK.getScore() + currentLevel * 10); LK.getSound('goal').play(); LK.effects.flashScreen(0x00FF00, 500); // Check win condition if (LK.getScore() >= 100) { LK.showYouWin(); } else { // Next level or reset if (currentLevel < 6) { startGame(currentLevel + 1); } else { resetGame(); } } } // Check if villains caught the ball for (var i = 0; i < villains.length; i++) { if (villains[i].intersects(ball)) { LK.getSound('villainCatch').play(); LK.effects.flashScreen(0xFF0000, 500); LK.showGameOver(); break; } } // Check if ball went out of bounds if (ball.x < 0 || ball.x > 2048 || ball.y > 2732) { LK.effects.flashScreen(0xFF0000, 500); LK.showGameOver(); } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ball = Container.expand(function (level) {
var self = Container.call(this);
var ballColors = ['ballYellow', 'ballBlue', 'ballRed', 'ballGreen', 'ballOrange', 'ballPurple'];
var ballGraphics = self.attachAsset(ballColors[level - 1], {
anchorX: 0.5,
anchorY: 0.5
});
self.level = level;
self.speedX = 0;
self.speedY = 0;
self.isMoving = false;
self.kickTowards = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var speed = 8 + self.level * 2;
self.speedX = dx / distance * speed;
self.speedY = dy / distance * speed;
self.isMoving = true;
LK.getSound('kick').play();
};
self.update = function () {
if (self.isMoving) {
self.x += self.speedX;
self.y += self.speedY;
// Slow down over time
self.speedX *= 0.98;
self.speedY *= 0.98;
if (Math.abs(self.speedX) < 0.1 && Math.abs(self.speedY) < 0.1) {
self.speedX = 0;
self.speedY = 0;
self.isMoving = false;
}
}
};
return self;
});
var PowerpuffGirl = Container.expand(function (x, y) {
var self = Container.call(this);
var girlGraphics = self.attachAsset('powerpuffGirl', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.originalX = x;
self.originalY = y;
self.down = function (x, y, obj) {
if (gameState === 'playing' && ball) {
var goalCenterX = goal.x;
var goalCenterY = goal.y;
ball.kickTowards(goalCenterX, goalCenterY);
// Visual feedback
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150
});
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
}
};
return self;
});
var Villain = Container.expand(function (x, y, level) {
var self = Container.call(this);
var villainGraphics = self.attachAsset('villain', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.speed = 1 + level * 0.5;
self.update = function () {
if (gameState === 'playing' && ball) {
var dx = ball.x - self.x;
var dy = ball.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x4CAF50
});
/****
* Game Code
****/
var gameState = 'menu'; // 'menu', 'playing', 'gameOver'
var currentLevel = 1;
var ball = null;
var goal = null;
var powerpuffGirls = [];
var villains = [];
var levelButtons = [];
// Create background
var background = game.attachAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create goal
goal = game.attachAsset('goal', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200
});
// Create goal posts
var leftPost = game.attachAsset('goalPost', {
anchorX: 0.5,
anchorY: 0.5,
x: goal.x - 190,
y: goal.y
});
var rightPost = game.attachAsset('goalPost', {
anchorX: 0.5,
anchorY: 0.5,
x: goal.x + 190,
y: goal.y
});
// Create level selection UI
var titleText = new Text2('Powerpuff Football Heroes', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
game.addChild(titleText);
var instructionText = new Text2('Tap a colored ball to select difficulty', {
size: 50,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 500;
game.addChild(instructionText);
// Create level selection balls
var ballColors = ['ballYellow', 'ballBlue', 'ballRed', 'ballGreen', 'ballOrange', 'ballPurple'];
var ballLabels = ['Level 1', 'Level 2', 'Level 3', 'Level 4', 'Level 5', 'Level 6'];
for (var i = 0; i < 6; i++) {
var levelBall = game.attachAsset(ballColors[i], {
anchorX: 0.5,
anchorY: 0.5,
x: 200 + i % 3 * 300,
y: 700 + Math.floor(i / 3) * 200
});
levelBall.level = i + 1;
levelBall.down = function (x, y, obj) {
startGame(obj.level);
};
var levelText = new Text2(ballLabels[i], {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
levelText.x = levelBall.x;
levelText.y = levelBall.y + 80;
game.addChild(levelText);
levelButtons.push(levelBall);
levelButtons.push(levelText);
}
// Score display
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
function startGame(level) {
gameState = 'playing';
currentLevel = level;
// Hide menu elements
titleText.visible = false;
instructionText.visible = false;
for (var i = 0; i < levelButtons.length; i++) {
levelButtons[i].visible = false;
}
// Create ball
ball = game.addChild(new Ball(level));
ball.x = 2048 / 2;
ball.y = 1500;
// Create Powerpuff Girls
powerpuffGirls = [];
for (var i = 0; i < 3; i++) {
var girl = game.addChild(new PowerpuffGirl(400 + i * 400, 2000));
powerpuffGirls.push(girl);
}
// Create villains
villains = [];
var villainCount = Math.min(level + 1, 5);
for (var i = 0; i < villainCount; i++) {
var villainX = 300 + i * 350;
var villainY = 1200 + i % 2 * 200;
var villain = game.addChild(new Villain(villainX, villainY, level));
villains.push(villain);
}
// Update score display
scoreText.setText('Level: ' + level);
}
function resetGame() {
gameState = 'menu';
// Show menu elements
titleText.visible = true;
instructionText.visible = true;
for (var i = 0; i < levelButtons.length; i++) {
levelButtons[i].visible = true;
}
// Clean up game objects
if (ball) {
ball.destroy();
ball = null;
}
for (var i = 0; i < powerpuffGirls.length; i++) {
powerpuffGirls[i].destroy();
}
powerpuffGirls = [];
for (var i = 0; i < villains.length; i++) {
villains[i].destroy();
}
villains = [];
scoreText.setText('Score: ' + LK.getScore());
}
game.update = function () {
if (gameState === 'playing' && ball) {
// Check if ball reached goal
if (ball.y < goal.y + 100 && ball.x > goal.x - 200 && ball.x < goal.x + 200) {
LK.setScore(LK.getScore() + currentLevel * 10);
LK.getSound('goal').play();
LK.effects.flashScreen(0x00FF00, 500);
// Check win condition
if (LK.getScore() >= 100) {
LK.showYouWin();
} else {
// Next level or reset
if (currentLevel < 6) {
startGame(currentLevel + 1);
} else {
resetGame();
}
}
}
// Check if villains caught the ball
for (var i = 0; i < villains.length; i++) {
if (villains[i].intersects(ball)) {
LK.getSound('villainCatch').play();
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
break;
}
}
// Check if ball went out of bounds
if (ball.x < 0 || ball.x > 2048 || ball.y > 2732) {
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
}
}
};