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