Code edit (1 edits merged)
Please save this source code
User prompt
Toca World Cup 2016
Initial prompt
Toca World Cup 2016 (2016). Tap on pando 🐼, sula 🐘, coco 🐰, blossom 🩷, bubbles 💙, or buttercup 💚 to be captain, or player 2, or player 3. Tap on your character to kick the ball, use your finger to drag the character to run to reach the goal.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var CharacterSelectionButton = Container.expand(function (characterName, x, y) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('selectionButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(characterName, {
size: 40,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.x = x;
self.y = y;
self.characterName = characterName;
self.isSelected = false;
self.down = function (x, y, obj) {
if (!gameStarted) {
selectCharacter(self.characterName);
}
};
self.setSelected = function (selected) {
self.isSelected = selected;
buttonGraphics.tint = selected ? 0xFFFF00 : 0x4CAF50;
};
return self;
});
var SoccerBall = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('soccerBall', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Stop very slow movement
if (Math.abs(self.velocityX) < 0.1) self.velocityX = 0;
if (Math.abs(self.velocityY) < 0.1) self.velocityY = 0;
// Field boundaries
if (self.x < 150) {
self.x = 150;
self.velocityX = 0;
}
if (self.x > 1900) {
self.x = 1900;
self.velocityX = 0;
}
if (self.y < 800) {
self.y = 800;
self.velocityY = 0;
}
if (self.y > 2000) {
self.y = 2000;
self.velocityY = 0;
}
};
self.applyForce = function (forceX, forceY) {
self.velocityX += forceX;
self.velocityY += forceY;
};
return self;
});
var SoccerPlayer = Container.expand(function (characterName, playerColor) {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
if (playerColor) {
playerGraphics.tint = playerColor;
}
self.characterName = characterName;
self.isSelected = false;
self.isDragging = false;
self.speed = 3;
self.kickPower = 15;
self.select = function () {
self.isSelected = true;
playerGraphics.tint = 0xFFFF00; // Yellow when selected
};
self.deselect = function () {
self.isSelected = false;
playerGraphics.tint = playerColor || 0x2196F3;
};
self.kick = function (ballX, ballY) {
var dx = ballX - self.x;
var dy = ballY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Close enough to kick
var force = self.kickPower / distance;
return {
x: dx * force,
y: dy * force
};
}
return null;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x388E3C
});
/****
* Game Code
****/
var gameStarted = false;
var selectionPhase = true;
var selectedCharacters = [];
var characterNames = ['Pando', 'Sula', 'Coco', 'Blossom', 'Bubbles', 'Buttercup'];
var selectionButtons = [];
var players = [];
var opponents = [];
var ball;
var selectedPlayer = null;
var draggedPlayer = null;
var goals = [];
var playerGoal;
var opponentGoal;
// Score tracking
var playerScore = 0;
var opponentScore = 0;
// UI Elements
var titleText = new Text2('Toca World Cup 2016', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 200;
LK.gui.addChild(titleText);
var instructionText = new Text2('Select 3 characters for your team', {
size: 50,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
LK.gui.addChild(instructionText);
var scoreText = new Text2('0 - 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create character selection buttons
for (var i = 0; i < characterNames.length; i++) {
var buttonX = 200 + i % 3 * 400;
var buttonY = 600 + Math.floor(i / 3) * 150;
var button = new CharacterSelectionButton(characterNames[i], buttonX, buttonY);
selectionButtons.push(button);
game.addChild(button);
}
var startButton = new CharacterSelectionButton('START GAME', 1024, 1000);
startButton.setSelected(false);
game.addChild(startButton);
function selectCharacter(characterName) {
if (selectedCharacters.length < 3 && selectedCharacters.indexOf(characterName) === -1) {
selectedCharacters.push(characterName);
// Update button appearance
for (var i = 0; i < selectionButtons.length; i++) {
if (selectionButtons[i].characterName === characterName) {
selectionButtons[i].setSelected(true);
break;
}
}
// Update instruction text
if (selectedCharacters.length === 3) {
instructionText.setText('Tap START GAME to begin!');
startButton.setSelected(true);
} else {
instructionText.setText('Select ' + (3 - selectedCharacters.length) + ' more characters');
}
}
}
function startGame() {
if (selectedCharacters.length !== 3) return;
gameStarted = true;
selectionPhase = false;
// Hide selection UI
for (var i = 0; i < selectionButtons.length; i++) {
selectionButtons[i].visible = false;
}
startButton.visible = false;
titleText.visible = false;
instructionText.visible = false;
// Create soccer field
var field = game.attachAsset('soccerField', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
// Create field boundaries
var topBoundary = game.attachAsset('fieldBoundary', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 766
});
var bottomBoundary = game.attachAsset('fieldBoundary', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1966
});
// Create goals
playerGoal = game.attachAsset('goalPost', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2000
});
opponentGoal = game.attachAsset('goalPost', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800
});
// Create ball
ball = new SoccerBall();
ball.x = 1024;
ball.y = 1366;
game.addChild(ball);
// Create player team
var playerColors = [0x2196F3, 0x1976D2, 0x0D47A1];
for (var i = 0; i < 3; i++) {
var player = new SoccerPlayer(selectedCharacters[i], playerColors[i]);
player.x = 700 + i * 200;
player.y = 1600;
players.push(player);
game.addChild(player);
}
// Create opponent team
for (var i = 0; i < 3; i++) {
var opponent = new SoccerPlayer('Opponent' + (i + 1), 0xF44336);
opponent.x = 700 + i * 200;
opponent.y = 1100;
opponents.push(opponent);
game.addChild(opponent);
}
// Update instruction text for gameplay
instructionText.setText('Tap player to select, drag to move, tap again to kick!');
instructionText.visible = true;
}
// Handle start button
startButton.down = function (x, y, obj) {
if (selectedCharacters.length === 3) {
startGame();
}
};
function handlePlayerSelection(player) {
// Deselect all players
for (var i = 0; i < players.length; i++) {
players[i].deselect();
}
// Select clicked player
selectedPlayer = player;
player.select();
}
function handlePlayerKick(player) {
if (player === selectedPlayer) {
var kickResult = player.kick(ball.x, ball.y);
if (kickResult) {
ball.applyForce(kickResult.x, kickResult.y);
LK.getSound('kick').play();
}
}
}
// Game event handlers
game.down = function (x, y, obj) {
if (!gameStarted || selectionPhase) return;
// Check if clicking on a player
for (var i = 0; i < players.length; i++) {
var player = players[i];
var dx = x - player.x;
var dy = y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 50) {
if (selectedPlayer === player) {
// Already selected - kick the ball
handlePlayerKick(player);
} else {
// Select this player
handlePlayerSelection(player);
draggedPlayer = player;
}
return;
}
}
};
game.move = function (x, y, obj) {
if (!gameStarted || selectionPhase) return;
if (draggedPlayer) {
// Keep player within field bounds
draggedPlayer.x = Math.max(150, Math.min(1900, x));
draggedPlayer.y = Math.max(800, Math.min(2000, y));
}
};
game.up = function (x, y, obj) {
draggedPlayer = null;
};
// Simple AI for opponents
var aiTimer = 0;
function updateOpponentAI() {
aiTimer++;
if (aiTimer % 60 === 0) {
// Update AI every second
for (var i = 0; i < opponents.length; i++) {
var opponent = opponents[i];
var dx = ball.x - opponent.x;
var dy = ball.y - opponent.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Move towards ball if close enough
if (distance < 300) {
var moveSpeed = 2;
opponent.x += dx / distance * moveSpeed;
opponent.y += dy / distance * moveSpeed;
// Keep within bounds
opponent.x = Math.max(150, Math.min(1900, opponent.x));
opponent.y = Math.max(800, Math.min(1600, opponent.y));
// Kick ball towards player goal if close
if (distance < 100 && Math.random() < 0.3) {
var kickForceX = (playerGoal.x - ball.x) * 0.3;
var kickForceY = (playerGoal.y - ball.y) * 0.3;
ball.applyForce(kickForceX, kickForceY);
}
}
}
}
}
function checkGoals() {
if (!ball) return;
var ballInPlayerGoal = ball.intersects(playerGoal);
var ballInOpponentGoal = ball.intersects(opponentGoal);
if (ballInPlayerGoal && !ball.lastInPlayerGoal) {
// Opponent scored
opponentScore++;
LK.getSound('goal').play();
resetBallPosition();
updateScore();
}
if (ballInOpponentGoal && !ball.lastInOpponentGoal) {
// Player scored
playerScore++;
LK.setScore(playerScore);
LK.getSound('goal').play();
resetBallPosition();
updateScore();
if (playerScore >= 3) {
LK.showYouWin();
}
}
ball.lastInPlayerGoal = ballInPlayerGoal;
ball.lastInOpponentGoal = ballInOpponentGoal;
}
function resetBallPosition() {
ball.x = 1024;
ball.y = 1366;
ball.velocityX = 0;
ball.velocityY = 0;
}
function updateScore() {
scoreText.setText(playerScore + ' - ' + opponentScore);
}
game.update = function () {
if (!gameStarted || selectionPhase) return;
updateOpponentAI();
checkGoals();
if (opponentScore >= 3) {
LK.showGameOver();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,396 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var CharacterSelectionButton = Container.expand(function (characterName, x, y) {
+ var self = Container.call(this);
+ var buttonGraphics = self.attachAsset('selectionButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var buttonText = new Text2(characterName, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ buttonText.anchor.set(0.5, 0.5);
+ self.addChild(buttonText);
+ self.x = x;
+ self.y = y;
+ self.characterName = characterName;
+ self.isSelected = false;
+ self.down = function (x, y, obj) {
+ if (!gameStarted) {
+ selectCharacter(self.characterName);
+ }
+ };
+ self.setSelected = function (selected) {
+ self.isSelected = selected;
+ buttonGraphics.tint = selected ? 0xFFFF00 : 0x4CAF50;
+ };
+ return self;
+});
+var SoccerBall = Container.expand(function () {
+ var self = Container.call(this);
+ var ballGraphics = self.attachAsset('soccerBall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.friction = 0.95;
+ self.lastX = 0;
+ self.lastY = 0;
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ self.velocityX *= self.friction;
+ self.velocityY *= self.friction;
+ // Stop very slow movement
+ if (Math.abs(self.velocityX) < 0.1) self.velocityX = 0;
+ if (Math.abs(self.velocityY) < 0.1) self.velocityY = 0;
+ // Field boundaries
+ if (self.x < 150) {
+ self.x = 150;
+ self.velocityX = 0;
+ }
+ if (self.x > 1900) {
+ self.x = 1900;
+ self.velocityX = 0;
+ }
+ if (self.y < 800) {
+ self.y = 800;
+ self.velocityY = 0;
+ }
+ if (self.y > 2000) {
+ self.y = 2000;
+ self.velocityY = 0;
+ }
+ };
+ self.applyForce = function (forceX, forceY) {
+ self.velocityX += forceX;
+ self.velocityY += forceY;
+ };
+ return self;
+});
+var SoccerPlayer = Container.expand(function (characterName, playerColor) {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ if (playerColor) {
+ playerGraphics.tint = playerColor;
+ }
+ self.characterName = characterName;
+ self.isSelected = false;
+ self.isDragging = false;
+ self.speed = 3;
+ self.kickPower = 15;
+ self.select = function () {
+ self.isSelected = true;
+ playerGraphics.tint = 0xFFFF00; // Yellow when selected
+ };
+ self.deselect = function () {
+ self.isSelected = false;
+ playerGraphics.tint = playerColor || 0x2196F3;
+ };
+ self.kick = function (ballX, ballY) {
+ var dx = ballX - self.x;
+ var dy = ballY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 100) {
+ // Close enough to kick
+ var force = self.kickPower / distance;
+ return {
+ x: dx * force,
+ y: dy * force
+ };
+ }
+ return null;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x388E3C
+});
+
+/****
+* Game Code
+****/
+var gameStarted = false;
+var selectionPhase = true;
+var selectedCharacters = [];
+var characterNames = ['Pando', 'Sula', 'Coco', 'Blossom', 'Bubbles', 'Buttercup'];
+var selectionButtons = [];
+var players = [];
+var opponents = [];
+var ball;
+var selectedPlayer = null;
+var draggedPlayer = null;
+var goals = [];
+var playerGoal;
+var opponentGoal;
+// Score tracking
+var playerScore = 0;
+var opponentScore = 0;
+// UI Elements
+var titleText = new Text2('Toca World Cup 2016', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+titleText.anchor.set(0.5, 0.5);
+titleText.x = 1024;
+titleText.y = 200;
+LK.gui.addChild(titleText);
+var instructionText = new Text2('Select 3 characters for your team', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 0.5);
+instructionText.x = 1024;
+instructionText.y = 300;
+LK.gui.addChild(instructionText);
+var scoreText = new Text2('0 - 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+// Create character selection buttons
+for (var i = 0; i < characterNames.length; i++) {
+ var buttonX = 200 + i % 3 * 400;
+ var buttonY = 600 + Math.floor(i / 3) * 150;
+ var button = new CharacterSelectionButton(characterNames[i], buttonX, buttonY);
+ selectionButtons.push(button);
+ game.addChild(button);
+}
+var startButton = new CharacterSelectionButton('START GAME', 1024, 1000);
+startButton.setSelected(false);
+game.addChild(startButton);
+function selectCharacter(characterName) {
+ if (selectedCharacters.length < 3 && selectedCharacters.indexOf(characterName) === -1) {
+ selectedCharacters.push(characterName);
+ // Update button appearance
+ for (var i = 0; i < selectionButtons.length; i++) {
+ if (selectionButtons[i].characterName === characterName) {
+ selectionButtons[i].setSelected(true);
+ break;
+ }
+ }
+ // Update instruction text
+ if (selectedCharacters.length === 3) {
+ instructionText.setText('Tap START GAME to begin!');
+ startButton.setSelected(true);
+ } else {
+ instructionText.setText('Select ' + (3 - selectedCharacters.length) + ' more characters');
+ }
+ }
+}
+function startGame() {
+ if (selectedCharacters.length !== 3) return;
+ gameStarted = true;
+ selectionPhase = false;
+ // Hide selection UI
+ for (var i = 0; i < selectionButtons.length; i++) {
+ selectionButtons[i].visible = false;
+ }
+ startButton.visible = false;
+ titleText.visible = false;
+ instructionText.visible = false;
+ // Create soccer field
+ var field = game.attachAsset('soccerField', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+ });
+ // Create field boundaries
+ var topBoundary = game.attachAsset('fieldBoundary', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 766
+ });
+ var bottomBoundary = game.attachAsset('fieldBoundary', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1966
+ });
+ // Create goals
+ playerGoal = game.attachAsset('goalPost', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 2000
+ });
+ opponentGoal = game.attachAsset('goalPost', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 800
+ });
+ // Create ball
+ ball = new SoccerBall();
+ ball.x = 1024;
+ ball.y = 1366;
+ game.addChild(ball);
+ // Create player team
+ var playerColors = [0x2196F3, 0x1976D2, 0x0D47A1];
+ for (var i = 0; i < 3; i++) {
+ var player = new SoccerPlayer(selectedCharacters[i], playerColors[i]);
+ player.x = 700 + i * 200;
+ player.y = 1600;
+ players.push(player);
+ game.addChild(player);
+ }
+ // Create opponent team
+ for (var i = 0; i < 3; i++) {
+ var opponent = new SoccerPlayer('Opponent' + (i + 1), 0xF44336);
+ opponent.x = 700 + i * 200;
+ opponent.y = 1100;
+ opponents.push(opponent);
+ game.addChild(opponent);
+ }
+ // Update instruction text for gameplay
+ instructionText.setText('Tap player to select, drag to move, tap again to kick!');
+ instructionText.visible = true;
+}
+// Handle start button
+startButton.down = function (x, y, obj) {
+ if (selectedCharacters.length === 3) {
+ startGame();
+ }
+};
+function handlePlayerSelection(player) {
+ // Deselect all players
+ for (var i = 0; i < players.length; i++) {
+ players[i].deselect();
+ }
+ // Select clicked player
+ selectedPlayer = player;
+ player.select();
+}
+function handlePlayerKick(player) {
+ if (player === selectedPlayer) {
+ var kickResult = player.kick(ball.x, ball.y);
+ if (kickResult) {
+ ball.applyForce(kickResult.x, kickResult.y);
+ LK.getSound('kick').play();
+ }
+ }
+}
+// Game event handlers
+game.down = function (x, y, obj) {
+ if (!gameStarted || selectionPhase) return;
+ // Check if clicking on a player
+ for (var i = 0; i < players.length; i++) {
+ var player = players[i];
+ var dx = x - player.x;
+ var dy = y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 50) {
+ if (selectedPlayer === player) {
+ // Already selected - kick the ball
+ handlePlayerKick(player);
+ } else {
+ // Select this player
+ handlePlayerSelection(player);
+ draggedPlayer = player;
+ }
+ return;
+ }
+ }
+};
+game.move = function (x, y, obj) {
+ if (!gameStarted || selectionPhase) return;
+ if (draggedPlayer) {
+ // Keep player within field bounds
+ draggedPlayer.x = Math.max(150, Math.min(1900, x));
+ draggedPlayer.y = Math.max(800, Math.min(2000, y));
+ }
+};
+game.up = function (x, y, obj) {
+ draggedPlayer = null;
+};
+// Simple AI for opponents
+var aiTimer = 0;
+function updateOpponentAI() {
+ aiTimer++;
+ if (aiTimer % 60 === 0) {
+ // Update AI every second
+ for (var i = 0; i < opponents.length; i++) {
+ var opponent = opponents[i];
+ var dx = ball.x - opponent.x;
+ var dy = ball.y - opponent.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Move towards ball if close enough
+ if (distance < 300) {
+ var moveSpeed = 2;
+ opponent.x += dx / distance * moveSpeed;
+ opponent.y += dy / distance * moveSpeed;
+ // Keep within bounds
+ opponent.x = Math.max(150, Math.min(1900, opponent.x));
+ opponent.y = Math.max(800, Math.min(1600, opponent.y));
+ // Kick ball towards player goal if close
+ if (distance < 100 && Math.random() < 0.3) {
+ var kickForceX = (playerGoal.x - ball.x) * 0.3;
+ var kickForceY = (playerGoal.y - ball.y) * 0.3;
+ ball.applyForce(kickForceX, kickForceY);
+ }
+ }
+ }
+ }
+}
+function checkGoals() {
+ if (!ball) return;
+ var ballInPlayerGoal = ball.intersects(playerGoal);
+ var ballInOpponentGoal = ball.intersects(opponentGoal);
+ if (ballInPlayerGoal && !ball.lastInPlayerGoal) {
+ // Opponent scored
+ opponentScore++;
+ LK.getSound('goal').play();
+ resetBallPosition();
+ updateScore();
+ }
+ if (ballInOpponentGoal && !ball.lastInOpponentGoal) {
+ // Player scored
+ playerScore++;
+ LK.setScore(playerScore);
+ LK.getSound('goal').play();
+ resetBallPosition();
+ updateScore();
+ if (playerScore >= 3) {
+ LK.showYouWin();
+ }
+ }
+ ball.lastInPlayerGoal = ballInPlayerGoal;
+ ball.lastInOpponentGoal = ballInOpponentGoal;
+}
+function resetBallPosition() {
+ ball.x = 1024;
+ ball.y = 1366;
+ ball.velocityX = 0;
+ ball.velocityY = 0;
+}
+function updateScore() {
+ scoreText.setText(playerScore + ' - ' + opponentScore);
+}
+game.update = function () {
+ if (!gameStarted || selectionPhase) return;
+ updateOpponentAI();
+ checkGoals();
+ if (opponentScore >= 3) {
+ LK.showGameOver();
+ }
+};
\ No newline at end of file