/****
* Classes
****/
// var tween = LK.import("@upit/tween.v1");
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 24;
self.reset = function () {
self.x = 2048 / 2;
self.y = 2732 / 2;
// Random direction
var angle = (Math.random() - 0.5) * Math.PI / 3; // -30 to 30 degrees
var direction = Math.random() > 0.5 ? 1 : -1;
self.velocityX = Math.cos(angle) * self.speed * direction;
self.velocityY = Math.sin(angle) * self.speed;
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Bounce off top and bottom walls
if (self.y <= 10 || self.y >= 2732 - 10) {
self.velocityY = -self.velocityY;
self.y = self.y <= 10 ? 10 : 2732 - 10;
LK.getSound('wallHit').play();
}
// Check if ball went off screen (scoring)
if (self.x < -50) {
// AI scores
aiScore++;
updateScore();
LK.getSound('score').play();
checkWinCondition();
if (!gameEnded) {
self.reset();
}
} else if (self.x > 2048 + 50) {
// Player scores
playerScore++;
updateScore();
LK.getSound('score').play();
checkWinCondition();
if (!gameEnded) {
self.reset();
}
}
};
return self;
});
var Paddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.attachAsset('paddle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 16;
self.targetY = 0;
self.isPlayer = false;
self.update = function () {
if (!self.isPlayer) {
// AI paddle movement
var diff = self.targetY - self.y;
if (Math.abs(diff) > 5) {
self.y += diff > 0 ? self.speed : -self.speed;
}
// Keep AI paddle within bounds
var halfHeight = paddleGraphics.height / 2;
if (self.y < halfHeight) {
self.y = halfHeight;
} else if (self.y > 2732 - halfHeight) {
self.y = 2732 - halfHeight;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var playerPaddle;
var aiPaddle;
var ball;
var centerLine;
var playerScore = 0;
var aiScore = 0;
var scoreText;
var gameEnded = false;
var winningScore = 5;
var isDragging = false;
// Create center line
centerLine = game.addChild(LK.getAsset('centerLine', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
}));
// Create player paddle (left side)
playerPaddle = game.addChild(new Paddle());
playerPaddle.x = 100;
playerPaddle.y = 2732 / 2;
playerPaddle.isPlayer = true;
// Create AI paddle (right side)
aiPaddle = game.addChild(new Paddle());
aiPaddle.x = 2048 - 100;
aiPaddle.y = 2732 / 2;
aiPaddle.isPlayer = false;
// Create ball
ball = game.addChild(new Ball());
ball.reset();
// Create score display
scoreText = new Text2('0 - 0', {
size: 100,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
function updateScore() {
scoreText.setText(playerScore + ' - ' + aiScore);
}
function checkWinCondition() {
if (playerScore >= winningScore) {
gameEnded = true;
LK.showYouWin();
} else if (aiScore >= winningScore) {
gameEnded = true;
LK.showGameOver();
}
}
function checkBallPaddleCollision() {
var ballBounds = ball.getBounds();
var playerBounds = playerPaddle.getBounds();
var aiBounds = aiPaddle.getBounds();
// Check collision with player paddle
if (ball.intersects(playerPaddle) && ball.velocityX < 0) {
var relativeIntersectY = (ball.y - playerPaddle.y) / (150 / 2);
var bounceAngle = relativeIntersectY * Math.PI / 4; // Max 45 degrees
ball.velocityX = Math.abs(ball.velocityX);
ball.velocityY = Math.sin(bounceAngle) * ball.speed;
// Increase speed slightly
ball.speed += 0.2;
var magnitude = Math.sqrt(ball.velocityX * ball.velocityX + ball.velocityY * ball.velocityY);
ball.velocityX = ball.velocityX / magnitude * ball.speed;
ball.velocityY = ball.velocityY / magnitude * ball.speed;
LK.getSound('paddleHit').play();
}
// Check collision with AI paddle
if (ball.intersects(aiPaddle) && ball.velocityX > 0) {
var relativeIntersectY = (ball.y - aiPaddle.y) / (150 / 2);
var bounceAngle = relativeIntersectY * Math.PI / 4;
ball.velocityX = -Math.abs(ball.velocityX);
ball.velocityY = Math.sin(bounceAngle) * ball.speed;
// Increase speed slightly
ball.speed += 0.2;
var magnitude = Math.sqrt(ball.velocityX * ball.velocityX + ball.velocityY * ball.velocityY);
ball.velocityX = ball.velocityX / magnitude * ball.speed;
ball.velocityY = ball.velocityY / magnitude * ball.speed;
LK.getSound('paddleHit').play();
}
}
// Touch controls for player paddle
game.down = function (x, y, obj) {
// Only respond to touches on the left half of the screen
if (x < 2048 / 2) {
isDragging = true;
playerPaddle.y = y;
// Keep paddle within bounds
var halfHeight = 75; // Half of paddle height
if (playerPaddle.y < halfHeight) {
playerPaddle.y = halfHeight;
} else if (playerPaddle.y > 2732 - halfHeight) {
playerPaddle.y = 2732 - halfHeight;
}
}
};
game.move = function (x, y, obj) {
if (isDragging && x < 2048 / 2) {
playerPaddle.y = y;
// Keep paddle within bounds
var halfHeight = 75;
if (playerPaddle.y < halfHeight) {
playerPaddle.y = halfHeight;
} else if (playerPaddle.y > 2732 - halfHeight) {
playerPaddle.y = 2732 - halfHeight;
}
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
game.update = function () {
if (gameEnded) {
return;
}
// Update AI paddle target based on ball position
aiPaddle.targetY = ball.y;
// Check ball-paddle collisions
checkBallPaddleCollision();
}; /****
* Classes
****/
// var tween = LK.import("@upit/tween.v1");
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 24;
self.reset = function () {
self.x = 2048 / 2;
self.y = 2732 / 2;
// Random direction
var angle = (Math.random() - 0.5) * Math.PI / 3; // -30 to 30 degrees
var direction = Math.random() > 0.5 ? 1 : -1;
self.velocityX = Math.cos(angle) * self.speed * direction;
self.velocityY = Math.sin(angle) * self.speed;
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Bounce off top and bottom walls
if (self.y <= 10 || self.y >= 2732 - 10) {
self.velocityY = -self.velocityY;
self.y = self.y <= 10 ? 10 : 2732 - 10;
LK.getSound('wallHit').play();
}
// Check if ball went off screen (scoring)
if (self.x < -50) {
// AI scores
aiScore++;
updateScore();
LK.getSound('score').play();
checkWinCondition();
if (!gameEnded) {
self.reset();
}
} else if (self.x > 2048 + 50) {
// Player scores
playerScore++;
updateScore();
LK.getSound('score').play();
checkWinCondition();
if (!gameEnded) {
self.reset();
}
}
};
return self;
});
var Paddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.attachAsset('paddle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 16;
self.targetY = 0;
self.isPlayer = false;
self.update = function () {
if (!self.isPlayer) {
// AI paddle movement
var diff = self.targetY - self.y;
if (Math.abs(diff) > 5) {
self.y += diff > 0 ? self.speed : -self.speed;
}
// Keep AI paddle within bounds
var halfHeight = paddleGraphics.height / 2;
if (self.y < halfHeight) {
self.y = halfHeight;
} else if (self.y > 2732 - halfHeight) {
self.y = 2732 - halfHeight;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var playerPaddle;
var aiPaddle;
var ball;
var centerLine;
var playerScore = 0;
var aiScore = 0;
var scoreText;
var gameEnded = false;
var winningScore = 5;
var isDragging = false;
// Create center line
centerLine = game.addChild(LK.getAsset('centerLine', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
}));
// Create player paddle (left side)
playerPaddle = game.addChild(new Paddle());
playerPaddle.x = 100;
playerPaddle.y = 2732 / 2;
playerPaddle.isPlayer = true;
// Create AI paddle (right side)
aiPaddle = game.addChild(new Paddle());
aiPaddle.x = 2048 - 100;
aiPaddle.y = 2732 / 2;
aiPaddle.isPlayer = false;
// Create ball
ball = game.addChild(new Ball());
ball.reset();
// Create score display
scoreText = new Text2('0 - 0', {
size: 100,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
function updateScore() {
scoreText.setText(playerScore + ' - ' + aiScore);
}
function checkWinCondition() {
if (playerScore >= winningScore) {
gameEnded = true;
LK.showYouWin();
} else if (aiScore >= winningScore) {
gameEnded = true;
LK.showGameOver();
}
}
function checkBallPaddleCollision() {
var ballBounds = ball.getBounds();
var playerBounds = playerPaddle.getBounds();
var aiBounds = aiPaddle.getBounds();
// Check collision with player paddle
if (ball.intersects(playerPaddle) && ball.velocityX < 0) {
var relativeIntersectY = (ball.y - playerPaddle.y) / (150 / 2);
var bounceAngle = relativeIntersectY * Math.PI / 4; // Max 45 degrees
ball.velocityX = Math.abs(ball.velocityX);
ball.velocityY = Math.sin(bounceAngle) * ball.speed;
// Increase speed slightly
ball.speed += 0.2;
var magnitude = Math.sqrt(ball.velocityX * ball.velocityX + ball.velocityY * ball.velocityY);
ball.velocityX = ball.velocityX / magnitude * ball.speed;
ball.velocityY = ball.velocityY / magnitude * ball.speed;
LK.getSound('paddleHit').play();
}
// Check collision with AI paddle
if (ball.intersects(aiPaddle) && ball.velocityX > 0) {
var relativeIntersectY = (ball.y - aiPaddle.y) / (150 / 2);
var bounceAngle = relativeIntersectY * Math.PI / 4;
ball.velocityX = -Math.abs(ball.velocityX);
ball.velocityY = Math.sin(bounceAngle) * ball.speed;
// Increase speed slightly
ball.speed += 0.2;
var magnitude = Math.sqrt(ball.velocityX * ball.velocityX + ball.velocityY * ball.velocityY);
ball.velocityX = ball.velocityX / magnitude * ball.speed;
ball.velocityY = ball.velocityY / magnitude * ball.speed;
LK.getSound('paddleHit').play();
}
}
// Touch controls for player paddle
game.down = function (x, y, obj) {
// Only respond to touches on the left half of the screen
if (x < 2048 / 2) {
isDragging = true;
playerPaddle.y = y;
// Keep paddle within bounds
var halfHeight = 75; // Half of paddle height
if (playerPaddle.y < halfHeight) {
playerPaddle.y = halfHeight;
} else if (playerPaddle.y > 2732 - halfHeight) {
playerPaddle.y = 2732 - halfHeight;
}
}
};
game.move = function (x, y, obj) {
if (isDragging && x < 2048 / 2) {
playerPaddle.y = y;
// Keep paddle within bounds
var halfHeight = 75;
if (playerPaddle.y < halfHeight) {
playerPaddle.y = halfHeight;
} else if (playerPaddle.y > 2732 - halfHeight) {
playerPaddle.y = 2732 - halfHeight;
}
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
game.update = function () {
if (gameEnded) {
return;
}
// Update AI paddle target based on ball position
aiPaddle.targetY = ball.y;
// Check ball-paddle collisions
checkBallPaddleCollision();
};