Code edit (1 edits merged)
Please save this source code
User prompt
Powerpuff Football Heroes
Initial prompt
Toca football (2017). Tap on level 1 yellow ball, level 2 blue ball, level 3 red ball, level 4 green ball, level 5 orange ball, or level 6 purple ball to get started, tap on your powerpuff girls to kick the ball ⚽️ onto the goal 🥅, before the villain get the ball it’s a lose.
/****
* 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();
}
}
};