/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var AttackEffect = Container.expand(function () { var self = Container.call(this); var effectGraphics = self.attachAsset('attack_effect', { anchorX: 0.5, anchorY: 0.5 }); self.lifetime = 20; // Scale and fade animation tween(effectGraphics, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300 }); self.update = function () { self.lifetime--; }; return self; }); var ControlButton = Container.expand(function (label, x, y) { var self = Container.call(this); var buttonBg = self.attachAsset('button_bg', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2 }); var buttonText = new Text2(label, { size: 50, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.x = x; self.y = y; self.isPressed = false; self.setPressed = function (pressed) { self.isPressed = pressed; buttonBg.tint = pressed ? 0x00FF00 : 0xFFFFFF; buttonBg.scaleX = pressed ? 1.0 : 1.2; buttonBg.scaleY = pressed ? 1.0 : 1.2; }; return self; }); var HealthBar = Container.expand(function (isPlayer1) { var self = Container.call(this); var bgGraphics = self.attachAsset('health_bg', { anchorX: isPlayer1 ? 0 : 1, anchorY: 0 }); var fillGraphics = self.attachAsset('health_fill', { anchorX: isPlayer1 ? 0 : 1, anchorY: 0 }); self.updateHealth = function (health, maxHealth) { var healthPercent = health / maxHealth; fillGraphics.scaleX = healthPercent; // Change color based on health if (healthPercent > 0.6) { fillGraphics.tint = 0x00ff00; // Green } else if (healthPercent > 0.3) { fillGraphics.tint = 0xffff00; // Yellow } else { fillGraphics.tint = 0xff0000; // Red } }; return self; }); var Player = Container.expand(function (playerType) { var self = Container.call(this); self.playerType = playerType; self.maxHealth = 100; self.health = 100; self.power = 0; self.isBlocking = false; self.attackCooldown = 0; self.specialCooldown = 0; self.moveSpeed = 8; self.isJumping = false; self.jumpSpeed = 0; self.groundY = 2200; self.gravity = 1.2; var playerGraphics = self.attachAsset(playerType, { anchorX: 0.5, anchorY: 1.0 }); self.takeDamage = function (damage) { if (self.isBlocking) { damage = damage * 0.3; // Reduce damage when blocking } self.health -= damage; if (self.health < 0) self.health = 0; // Flash red when taking damage LK.effects.flashObject(self, 0xff0000, 300); // Screen shake on heavy damage if (damage > 15) { LK.effects.flashScreen(0xff0000, 200); } }; self.attack = function () { if (self.attackCooldown > 0) return false; self.attackCooldown = 30; // 0.5 second cooldown // Attack animation tween(playerGraphics, { scaleX: 1.2, scaleY: 0.9 }, { duration: 150, onFinish: function onFinish() { tween(playerGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.getSound('punch').play(); return true; }; self.specialAttack = function () { if (self.specialCooldown > 0 || self.power < 50) return false; self.specialCooldown = 120; // 2 second cooldown self.power -= 50; // Special attack animation tween(playerGraphics, { rotation: Math.PI * 2 }, { duration: 500, onFinish: function onFinish() { playerGraphics.rotation = 0; } }); LK.getSound('kick').play(); return true; }; self.block = function (blocking) { self.isBlocking = blocking; playerGraphics.tint = blocking ? 0x8888ff : 0xffffff; }; self.addPower = function (amount) { self.power += amount; if (self.power > 100) self.power = 100; }; self.moveLeft = function () { self.x -= self.moveSpeed; if (self.x < 75) self.x = 75; // Keep within bounds }; self.moveRight = function () { self.x += self.moveSpeed; if (self.x > 1973) self.x = 1973; // Keep within bounds }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.jumpSpeed = -20; // Negative for upward movement } }; self.update = function () { if (self.attackCooldown > 0) self.attackCooldown--; if (self.specialCooldown > 0) self.specialCooldown--; // Handle jumping physics if (self.isJumping) { self.y += self.jumpSpeed; self.jumpSpeed += self.gravity; // Check if landed if (self.y >= self.groundY) { self.y = self.groundY; self.isJumping = false; self.jumpSpeed = 0; } } }; return self; }); var SoccerBall = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('soccer_ball', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.lifetime = 300; // 5 seconds // Floating animation tween(self, { y: self.y - 20 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { y: self.y + 20 }, { duration: 1000, easing: tween.easeInOut }); } }); self.update = function () { self.lifetime--; if (self.lifetime <= 0) { self.collected = true; } // Fade out in last second if (self.lifetime < 60) { ballGraphics.alpha = self.lifetime / 60; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x228b22 }); /**** * Game Code ****/ var gameState = 'playing'; // 'playing', 'gameover' var player1, player2; var soccerBalls = []; var attackEffects = []; var player1HealthBar, player2HealthBar; var powerBar1, powerBar2; var ballSpawnTimer = 0; // Create players player1 = game.addChild(new Player('messi')); player1.x = 400; player1.y = 2200; player2 = game.addChild(new Player('ronaldo')); player2.x = 1650; player2.y = 2200; // Create health bars player1HealthBar = new HealthBar(true); player1HealthBar.x = 50; player1HealthBar.y = 50; LK.gui.topLeft.addChild(player1HealthBar); player2HealthBar = new HealthBar(false); player2HealthBar.x = LK.gui.width - 50; player2HealthBar.y = 50; LK.gui.topLeft.addChild(player2HealthBar); // Create power bars (smaller, below health bars) var powerBg1 = LK.getAsset('health_bg', { scaleX: 0.5, scaleY: 0.7 }); var powerFill1 = LK.getAsset('health_fill', { scaleX: 0, scaleY: 0.7 }); powerFill1.tint = 0x0088ff; powerBar1 = new Container(); powerBar1.addChild(powerBg1); powerBar1.addChild(powerFill1); powerBar1.x = 50; powerBar1.y = 90; LK.gui.topLeft.addChild(powerBar1); var powerBg2 = LK.getAsset('health_bg', { scaleX: -0.5, scaleY: 0.7, anchorX: 1 }); var powerFill2 = LK.getAsset('health_fill', { scaleX: 0, scaleY: 0.7, anchorX: 1 }); powerFill2.tint = 0x0088ff; powerBar2 = new Container(); powerBar2.addChild(powerBg2); powerBar2.addChild(powerFill2); powerBar2.x = LK.gui.width - 50; powerBar2.y = 90; LK.gui.topLeft.addChild(powerBar2); // Game title var titleText = new Text2('MESSI vs RONALDO', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); // Instructions var instructText = new Text2('Use buttons to MOVE, JUMP (A), and ATTACK (B)', { size: 35, fill: 0xFFFFFF }); instructText.anchor.set(0.5, 1); instructText.y = LK.gui.height - 300; LK.gui.bottom.addChild(instructText); // Touch controls var isHolding = false; var holdTimer = 0; var touchStartTime = 0; // Control buttons - Player 1 (left side) var player1Controls = { moveLeft: new ControlButton('←', 120, LK.gui.height - 120), moveRight: new ControlButton('→', 220, LK.gui.height - 120), jump: new ControlButton('A', 120, LK.gui.height - 220), attack: new ControlButton('B', 220, LK.gui.height - 220) }; // Control buttons - Player 2 (right side) var player2Controls = { moveLeft: new ControlButton('←', LK.gui.width - 220, LK.gui.height - 120), moveRight: new ControlButton('→', LK.gui.width - 120, LK.gui.height - 120), jump: new ControlButton('A', LK.gui.width - 220, LK.gui.height - 220), attack: new ControlButton('B', LK.gui.width - 120, LK.gui.height - 220) }; // Add control buttons to GUI LK.gui.bottomLeft.addChild(player1Controls.moveLeft); LK.gui.bottomLeft.addChild(player1Controls.moveRight); LK.gui.bottomLeft.addChild(player1Controls.jump); LK.gui.bottomLeft.addChild(player1Controls.attack); LK.gui.bottomRight.addChild(player2Controls.moveLeft); LK.gui.bottomRight.addChild(player2Controls.moveRight); LK.gui.bottomRight.addChild(player2Controls.jump); LK.gui.bottomRight.addChild(player2Controls.attack); // Control states var controlStates = { p1MoveLeft: false, p1MoveRight: false, p1Jump: false, p1Attack: false, p2MoveLeft: false, p2MoveRight: false, p2Jump: false, p2Attack: false }; function spawnSoccerBall() { var ball = new SoccerBall(); ball.x = 1024; // Center of field ball.y = 1500 + Math.random() * 400; soccerBalls.push(ball); game.addChild(ball); } function createAttackEffect(x, y) { var effect = new AttackEffect(); effect.x = x; effect.y = y; attackEffects.push(effect); game.addChild(effect); } function checkCollisions() { // Player attacks var distance = Math.abs(player1.x - player2.x); if (distance < 200) { // Close enough for combat // Player 1 can hit Player 2 if (player1.attackCooldown === 29) { // Just attacked player2.takeDamage(15); createAttackEffect(player2.x, player2.y - 100); } // Player 2 can hit Player 1 if (player2.attackCooldown === 29) { // Just attacked player1.takeDamage(15); createAttackEffect(player1.x, player1.y - 100); } } // Special attacks have longer range if (distance < 300) { if (player1.specialCooldown === 119) { // Just used special player2.takeDamage(30); createAttackEffect(player2.x, player2.y - 100); } if (player2.specialCooldown === 119) { // Just used special player1.takeDamage(30); createAttackEffect(player1.x, player1.y - 100); } } // Soccer ball collection for (var i = soccerBalls.length - 1; i >= 0; i--) { var ball = soccerBalls[i]; if (ball.intersects(player1)) { player1.addPower(25); ball.collected = true; LK.getSound('powerup').play(); } else if (ball.intersects(player2)) { player2.addPower(25); ball.collected = true; LK.getSound('powerup').play(); } } } game.down = function (x, y, obj) { if (gameState !== 'playing') return; // Convert GUI coordinates to local coordinates for button detection var guiPos = LK.gui.toLocal({ x: x, y: y }); var buttonSize = 60; // Half of button size (120 * 1.2 / 2) // Check Player 1 controls if (Math.abs(guiPos.x - player1Controls.moveLeft.x) < buttonSize && Math.abs(guiPos.y - player1Controls.moveLeft.y) < buttonSize) { controlStates.p1MoveLeft = true; player1Controls.moveLeft.setPressed(true); } if (Math.abs(guiPos.x - player1Controls.moveRight.x) < buttonSize && Math.abs(guiPos.y - player1Controls.moveRight.y) < buttonSize) { controlStates.p1MoveRight = true; player1Controls.moveRight.setPressed(true); } if (Math.abs(guiPos.x - player1Controls.jump.x) < buttonSize && Math.abs(guiPos.y - player1Controls.jump.y) < buttonSize) { controlStates.p1Jump = true; player1Controls.jump.setPressed(true); player1.jump(); } if (Math.abs(guiPos.x - player1Controls.attack.x) < buttonSize && Math.abs(guiPos.y - player1Controls.attack.y) < buttonSize) { controlStates.p1Attack = true; player1Controls.attack.setPressed(true); player1.attack(); } // Check Player 2 controls if (Math.abs(guiPos.x - player2Controls.moveLeft.x) < buttonSize && Math.abs(guiPos.y - player2Controls.moveLeft.y) < buttonSize) { controlStates.p2MoveLeft = true; player2Controls.moveLeft.setPressed(true); } if (Math.abs(guiPos.x - player2Controls.moveRight.x) < buttonSize && Math.abs(guiPos.y - player2Controls.moveRight.y) < buttonSize) { controlStates.p2MoveRight = true; player2Controls.moveRight.setPressed(true); } if (Math.abs(guiPos.x - player2Controls.jump.x) < buttonSize && Math.abs(guiPos.y - player2Controls.jump.y) < buttonSize) { controlStates.p2Jump = true; player2Controls.jump.setPressed(true); player2.jump(); } if (Math.abs(guiPos.x - player2Controls.attack.x) < buttonSize && Math.abs(guiPos.y - player2Controls.attack.y) < buttonSize) { controlStates.p2Attack = true; player2Controls.attack.setPressed(true); player2.attack(); } }; game.up = function (x, y, obj) { if (gameState !== 'playing') return; // Reset all control states and button appearances controlStates.p1MoveLeft = false; controlStates.p1MoveRight = false; controlStates.p1Jump = false; controlStates.p1Attack = false; controlStates.p2MoveLeft = false; controlStates.p2MoveRight = false; controlStates.p2Jump = false; controlStates.p2Attack = false; player1Controls.moveLeft.setPressed(false); player1Controls.moveRight.setPressed(false); player1Controls.jump.setPressed(false); player1Controls.attack.setPressed(false); player2Controls.moveLeft.setPressed(false); player2Controls.moveRight.setPressed(false); player2Controls.jump.setPressed(false); player2Controls.attack.setPressed(false); isHolding = false; holdTimer = 0; }; game.update = function () { if (gameState !== 'playing') return; // Handle continuous movement if (controlStates.p1MoveLeft) { player1.moveLeft(); } if (controlStates.p1MoveRight) { player1.moveRight(); } if (controlStates.p2MoveLeft) { player2.moveLeft(); } if (controlStates.p2MoveRight) { player2.moveRight(); } // Update players player1.update(); player2.update(); // Update UI player1HealthBar.updateHealth(player1.health, player1.maxHealth); player2HealthBar.updateHealth(player2.health, player2.maxHealth); powerFill1.scaleX = player1.power / 100 * 0.5; powerFill2.scaleX = -(player2.power / 100) * 0.5; // Spawn soccer balls ballSpawnTimer++; if (ballSpawnTimer > 300) { // Every 5 seconds spawnSoccerBall(); ballSpawnTimer = 0; } // Update soccer balls for (var i = soccerBalls.length - 1; i >= 0; i--) { var ball = soccerBalls[i]; ball.update(); if (ball.collected || ball.lifetime <= 0) { ball.destroy(); soccerBalls.splice(i, 1); } } // Update attack effects for (var j = attackEffects.length - 1; j >= 0; j--) { var effect = attackEffects[j]; effect.update(); if (effect.lifetime <= 0) { effect.destroy(); attackEffects.splice(j, 1); } } // Check collisions checkCollisions(); // Check win conditions if (player1.health <= 0) { gameState = 'gameover'; LK.setScore(2); // Player 2 wins LK.showGameOver(); } else if (player2.health <= 0) { gameState = 'gameover'; LK.setScore(1); // Player 1 wins LK.showYouWin(); } // Update hold timer for blocking if (isHolding) { holdTimer++; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AttackEffect = Container.expand(function () {
var self = Container.call(this);
var effectGraphics = self.attachAsset('attack_effect', {
anchorX: 0.5,
anchorY: 0.5
});
self.lifetime = 20;
// Scale and fade animation
tween(effectGraphics, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300
});
self.update = function () {
self.lifetime--;
};
return self;
});
var ControlButton = Container.expand(function (label, x, y) {
var self = Container.call(this);
var buttonBg = self.attachAsset('button_bg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
var buttonText = new Text2(label, {
size: 50,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.x = x;
self.y = y;
self.isPressed = false;
self.setPressed = function (pressed) {
self.isPressed = pressed;
buttonBg.tint = pressed ? 0x00FF00 : 0xFFFFFF;
buttonBg.scaleX = pressed ? 1.0 : 1.2;
buttonBg.scaleY = pressed ? 1.0 : 1.2;
};
return self;
});
var HealthBar = Container.expand(function (isPlayer1) {
var self = Container.call(this);
var bgGraphics = self.attachAsset('health_bg', {
anchorX: isPlayer1 ? 0 : 1,
anchorY: 0
});
var fillGraphics = self.attachAsset('health_fill', {
anchorX: isPlayer1 ? 0 : 1,
anchorY: 0
});
self.updateHealth = function (health, maxHealth) {
var healthPercent = health / maxHealth;
fillGraphics.scaleX = healthPercent;
// Change color based on health
if (healthPercent > 0.6) {
fillGraphics.tint = 0x00ff00; // Green
} else if (healthPercent > 0.3) {
fillGraphics.tint = 0xffff00; // Yellow
} else {
fillGraphics.tint = 0xff0000; // Red
}
};
return self;
});
var Player = Container.expand(function (playerType) {
var self = Container.call(this);
self.playerType = playerType;
self.maxHealth = 100;
self.health = 100;
self.power = 0;
self.isBlocking = false;
self.attackCooldown = 0;
self.specialCooldown = 0;
self.moveSpeed = 8;
self.isJumping = false;
self.jumpSpeed = 0;
self.groundY = 2200;
self.gravity = 1.2;
var playerGraphics = self.attachAsset(playerType, {
anchorX: 0.5,
anchorY: 1.0
});
self.takeDamage = function (damage) {
if (self.isBlocking) {
damage = damage * 0.3; // Reduce damage when blocking
}
self.health -= damage;
if (self.health < 0) self.health = 0;
// Flash red when taking damage
LK.effects.flashObject(self, 0xff0000, 300);
// Screen shake on heavy damage
if (damage > 15) {
LK.effects.flashScreen(0xff0000, 200);
}
};
self.attack = function () {
if (self.attackCooldown > 0) return false;
self.attackCooldown = 30; // 0.5 second cooldown
// Attack animation
tween(playerGraphics, {
scaleX: 1.2,
scaleY: 0.9
}, {
duration: 150,
onFinish: function onFinish() {
tween(playerGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.getSound('punch').play();
return true;
};
self.specialAttack = function () {
if (self.specialCooldown > 0 || self.power < 50) return false;
self.specialCooldown = 120; // 2 second cooldown
self.power -= 50;
// Special attack animation
tween(playerGraphics, {
rotation: Math.PI * 2
}, {
duration: 500,
onFinish: function onFinish() {
playerGraphics.rotation = 0;
}
});
LK.getSound('kick').play();
return true;
};
self.block = function (blocking) {
self.isBlocking = blocking;
playerGraphics.tint = blocking ? 0x8888ff : 0xffffff;
};
self.addPower = function (amount) {
self.power += amount;
if (self.power > 100) self.power = 100;
};
self.moveLeft = function () {
self.x -= self.moveSpeed;
if (self.x < 75) self.x = 75; // Keep within bounds
};
self.moveRight = function () {
self.x += self.moveSpeed;
if (self.x > 1973) self.x = 1973; // Keep within bounds
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.jumpSpeed = -20; // Negative for upward movement
}
};
self.update = function () {
if (self.attackCooldown > 0) self.attackCooldown--;
if (self.specialCooldown > 0) self.specialCooldown--;
// Handle jumping physics
if (self.isJumping) {
self.y += self.jumpSpeed;
self.jumpSpeed += self.gravity;
// Check if landed
if (self.y >= self.groundY) {
self.y = self.groundY;
self.isJumping = false;
self.jumpSpeed = 0;
}
}
};
return self;
});
var SoccerBall = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('soccer_ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.lifetime = 300; // 5 seconds
// Floating animation
tween(self, {
y: self.y - 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self, {
y: self.y + 20
}, {
duration: 1000,
easing: tween.easeInOut
});
}
});
self.update = function () {
self.lifetime--;
if (self.lifetime <= 0) {
self.collected = true;
}
// Fade out in last second
if (self.lifetime < 60) {
ballGraphics.alpha = self.lifetime / 60;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228b22
});
/****
* Game Code
****/
var gameState = 'playing'; // 'playing', 'gameover'
var player1, player2;
var soccerBalls = [];
var attackEffects = [];
var player1HealthBar, player2HealthBar;
var powerBar1, powerBar2;
var ballSpawnTimer = 0;
// Create players
player1 = game.addChild(new Player('messi'));
player1.x = 400;
player1.y = 2200;
player2 = game.addChild(new Player('ronaldo'));
player2.x = 1650;
player2.y = 2200;
// Create health bars
player1HealthBar = new HealthBar(true);
player1HealthBar.x = 50;
player1HealthBar.y = 50;
LK.gui.topLeft.addChild(player1HealthBar);
player2HealthBar = new HealthBar(false);
player2HealthBar.x = LK.gui.width - 50;
player2HealthBar.y = 50;
LK.gui.topLeft.addChild(player2HealthBar);
// Create power bars (smaller, below health bars)
var powerBg1 = LK.getAsset('health_bg', {
scaleX: 0.5,
scaleY: 0.7
});
var powerFill1 = LK.getAsset('health_fill', {
scaleX: 0,
scaleY: 0.7
});
powerFill1.tint = 0x0088ff;
powerBar1 = new Container();
powerBar1.addChild(powerBg1);
powerBar1.addChild(powerFill1);
powerBar1.x = 50;
powerBar1.y = 90;
LK.gui.topLeft.addChild(powerBar1);
var powerBg2 = LK.getAsset('health_bg', {
scaleX: -0.5,
scaleY: 0.7,
anchorX: 1
});
var powerFill2 = LK.getAsset('health_fill', {
scaleX: 0,
scaleY: 0.7,
anchorX: 1
});
powerFill2.tint = 0x0088ff;
powerBar2 = new Container();
powerBar2.addChild(powerBg2);
powerBar2.addChild(powerFill2);
powerBar2.x = LK.gui.width - 50;
powerBar2.y = 90;
LK.gui.topLeft.addChild(powerBar2);
// Game title
var titleText = new Text2('MESSI vs RONALDO', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
// Instructions
var instructText = new Text2('Use buttons to MOVE, JUMP (A), and ATTACK (B)', {
size: 35,
fill: 0xFFFFFF
});
instructText.anchor.set(0.5, 1);
instructText.y = LK.gui.height - 300;
LK.gui.bottom.addChild(instructText);
// Touch controls
var isHolding = false;
var holdTimer = 0;
var touchStartTime = 0;
// Control buttons - Player 1 (left side)
var player1Controls = {
moveLeft: new ControlButton('←', 120, LK.gui.height - 120),
moveRight: new ControlButton('→', 220, LK.gui.height - 120),
jump: new ControlButton('A', 120, LK.gui.height - 220),
attack: new ControlButton('B', 220, LK.gui.height - 220)
};
// Control buttons - Player 2 (right side)
var player2Controls = {
moveLeft: new ControlButton('←', LK.gui.width - 220, LK.gui.height - 120),
moveRight: new ControlButton('→', LK.gui.width - 120, LK.gui.height - 120),
jump: new ControlButton('A', LK.gui.width - 220, LK.gui.height - 220),
attack: new ControlButton('B', LK.gui.width - 120, LK.gui.height - 220)
};
// Add control buttons to GUI
LK.gui.bottomLeft.addChild(player1Controls.moveLeft);
LK.gui.bottomLeft.addChild(player1Controls.moveRight);
LK.gui.bottomLeft.addChild(player1Controls.jump);
LK.gui.bottomLeft.addChild(player1Controls.attack);
LK.gui.bottomRight.addChild(player2Controls.moveLeft);
LK.gui.bottomRight.addChild(player2Controls.moveRight);
LK.gui.bottomRight.addChild(player2Controls.jump);
LK.gui.bottomRight.addChild(player2Controls.attack);
// Control states
var controlStates = {
p1MoveLeft: false,
p1MoveRight: false,
p1Jump: false,
p1Attack: false,
p2MoveLeft: false,
p2MoveRight: false,
p2Jump: false,
p2Attack: false
};
function spawnSoccerBall() {
var ball = new SoccerBall();
ball.x = 1024; // Center of field
ball.y = 1500 + Math.random() * 400;
soccerBalls.push(ball);
game.addChild(ball);
}
function createAttackEffect(x, y) {
var effect = new AttackEffect();
effect.x = x;
effect.y = y;
attackEffects.push(effect);
game.addChild(effect);
}
function checkCollisions() {
// Player attacks
var distance = Math.abs(player1.x - player2.x);
if (distance < 200) {
// Close enough for combat
// Player 1 can hit Player 2
if (player1.attackCooldown === 29) {
// Just attacked
player2.takeDamage(15);
createAttackEffect(player2.x, player2.y - 100);
}
// Player 2 can hit Player 1
if (player2.attackCooldown === 29) {
// Just attacked
player1.takeDamage(15);
createAttackEffect(player1.x, player1.y - 100);
}
}
// Special attacks have longer range
if (distance < 300) {
if (player1.specialCooldown === 119) {
// Just used special
player2.takeDamage(30);
createAttackEffect(player2.x, player2.y - 100);
}
if (player2.specialCooldown === 119) {
// Just used special
player1.takeDamage(30);
createAttackEffect(player1.x, player1.y - 100);
}
}
// Soccer ball collection
for (var i = soccerBalls.length - 1; i >= 0; i--) {
var ball = soccerBalls[i];
if (ball.intersects(player1)) {
player1.addPower(25);
ball.collected = true;
LK.getSound('powerup').play();
} else if (ball.intersects(player2)) {
player2.addPower(25);
ball.collected = true;
LK.getSound('powerup').play();
}
}
}
game.down = function (x, y, obj) {
if (gameState !== 'playing') return;
// Convert GUI coordinates to local coordinates for button detection
var guiPos = LK.gui.toLocal({
x: x,
y: y
});
var buttonSize = 60; // Half of button size (120 * 1.2 / 2)
// Check Player 1 controls
if (Math.abs(guiPos.x - player1Controls.moveLeft.x) < buttonSize && Math.abs(guiPos.y - player1Controls.moveLeft.y) < buttonSize) {
controlStates.p1MoveLeft = true;
player1Controls.moveLeft.setPressed(true);
}
if (Math.abs(guiPos.x - player1Controls.moveRight.x) < buttonSize && Math.abs(guiPos.y - player1Controls.moveRight.y) < buttonSize) {
controlStates.p1MoveRight = true;
player1Controls.moveRight.setPressed(true);
}
if (Math.abs(guiPos.x - player1Controls.jump.x) < buttonSize && Math.abs(guiPos.y - player1Controls.jump.y) < buttonSize) {
controlStates.p1Jump = true;
player1Controls.jump.setPressed(true);
player1.jump();
}
if (Math.abs(guiPos.x - player1Controls.attack.x) < buttonSize && Math.abs(guiPos.y - player1Controls.attack.y) < buttonSize) {
controlStates.p1Attack = true;
player1Controls.attack.setPressed(true);
player1.attack();
}
// Check Player 2 controls
if (Math.abs(guiPos.x - player2Controls.moveLeft.x) < buttonSize && Math.abs(guiPos.y - player2Controls.moveLeft.y) < buttonSize) {
controlStates.p2MoveLeft = true;
player2Controls.moveLeft.setPressed(true);
}
if (Math.abs(guiPos.x - player2Controls.moveRight.x) < buttonSize && Math.abs(guiPos.y - player2Controls.moveRight.y) < buttonSize) {
controlStates.p2MoveRight = true;
player2Controls.moveRight.setPressed(true);
}
if (Math.abs(guiPos.x - player2Controls.jump.x) < buttonSize && Math.abs(guiPos.y - player2Controls.jump.y) < buttonSize) {
controlStates.p2Jump = true;
player2Controls.jump.setPressed(true);
player2.jump();
}
if (Math.abs(guiPos.x - player2Controls.attack.x) < buttonSize && Math.abs(guiPos.y - player2Controls.attack.y) < buttonSize) {
controlStates.p2Attack = true;
player2Controls.attack.setPressed(true);
player2.attack();
}
};
game.up = function (x, y, obj) {
if (gameState !== 'playing') return;
// Reset all control states and button appearances
controlStates.p1MoveLeft = false;
controlStates.p1MoveRight = false;
controlStates.p1Jump = false;
controlStates.p1Attack = false;
controlStates.p2MoveLeft = false;
controlStates.p2MoveRight = false;
controlStates.p2Jump = false;
controlStates.p2Attack = false;
player1Controls.moveLeft.setPressed(false);
player1Controls.moveRight.setPressed(false);
player1Controls.jump.setPressed(false);
player1Controls.attack.setPressed(false);
player2Controls.moveLeft.setPressed(false);
player2Controls.moveRight.setPressed(false);
player2Controls.jump.setPressed(false);
player2Controls.attack.setPressed(false);
isHolding = false;
holdTimer = 0;
};
game.update = function () {
if (gameState !== 'playing') return;
// Handle continuous movement
if (controlStates.p1MoveLeft) {
player1.moveLeft();
}
if (controlStates.p1MoveRight) {
player1.moveRight();
}
if (controlStates.p2MoveLeft) {
player2.moveLeft();
}
if (controlStates.p2MoveRight) {
player2.moveRight();
}
// Update players
player1.update();
player2.update();
// Update UI
player1HealthBar.updateHealth(player1.health, player1.maxHealth);
player2HealthBar.updateHealth(player2.health, player2.maxHealth);
powerFill1.scaleX = player1.power / 100 * 0.5;
powerFill2.scaleX = -(player2.power / 100) * 0.5;
// Spawn soccer balls
ballSpawnTimer++;
if (ballSpawnTimer > 300) {
// Every 5 seconds
spawnSoccerBall();
ballSpawnTimer = 0;
}
// Update soccer balls
for (var i = soccerBalls.length - 1; i >= 0; i--) {
var ball = soccerBalls[i];
ball.update();
if (ball.collected || ball.lifetime <= 0) {
ball.destroy();
soccerBalls.splice(i, 1);
}
}
// Update attack effects
for (var j = attackEffects.length - 1; j >= 0; j--) {
var effect = attackEffects[j];
effect.update();
if (effect.lifetime <= 0) {
effect.destroy();
attackEffects.splice(j, 1);
}
}
// Check collisions
checkCollisions();
// Check win conditions
if (player1.health <= 0) {
gameState = 'gameover';
LK.setScore(2); // Player 2 wins
LK.showGameOver();
} else if (player2.health <= 0) {
gameState = 'gameover';
LK.setScore(1); // Player 1 wins
LK.showYouWin();
}
// Update hold timer for blocking
if (isHolding) {
holdTimer++;
}
};
Un tipo con barba y pelo mediano que tenga una camiseta con rayas blancas y celestes. In-Game asset. High contrast. No shadows. 2d
Has a una persona igual a Cristiano Ronaldo. In-Game asset. 2d. High contrast. No shadows
Un balón normal. In-Game asset. 2d. High contrast. No shadows
Que sea redondo y que adentro tenga la letra a y que sea el fondo azul