User prompt
Randomise intital speed and direction of ball
User prompt
smallballs should bounce off the edge of the screen
User prompt
generate 20 smallball when enemy hits the ball
User prompt
add 5 new balls each time the player hits the ball, they should move towards the other player in an arc at random speeds
User prompt
new balls should be 80% of the size of ball
User prompt
new balls are still static, they should move in random directions
User prompt
the new balls are static, plox fix xxx
User prompt
add 5 new balls at the start of a point, make them fire at random dierections and speeds
User prompt
Delete extra balls added at end of round
User prompt
There is a bug, only one ball should be able to score one point per round
User prompt
Also create 5 balls every time a player contacts the real ball, they should shoot in a 25 degree arc towards the other player
User prompt
No, create 5 new balls at tthe start of ever point
User prompt
Now there is only one ball, or they might all be moving the same path, please change that
User prompt
Only one ball is move, but I'd liek all of them to move
User prompt
Repair change set 13
User prompt
create 5 balls at start of game
User prompt
clone ball 5 times
User prompt
create increasing numbers of balls on every round
User prompt
upon loss, double the number of balls
User prompt
make the rendered blood stay on screen
User prompt
add blood splatter special effects
User prompt
Migrate to the latest version of LK
Remix started
Copy Wall Bounce
/****
* Classes
****/
// Assets will be automatically created based on usage in the code.
// Ball class
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 15;
self.speedY = 15;
self.move = function () {
self.x += self.speedX;
self.y += self.speedY;
// Bounce off top and bottom walls
if (self.y <= 0 || self.y >= 2732) {
self.speedY *= -1;
}
};
});
// DashedLine class
var DashedLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('dashedLine', {
anchorX: 0.5,
anchorY: 0.5
});
});
// Paddle class
var Paddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.attachAsset('paddle', {
anchorX: 0.5,
anchorY: 0.5
});
self.score = 0; // Initialize score counter
self.move = function (y) {
self.y = y;
// Prevent paddle from moving out of bounds
if (self.y < 0) {
self.y = 0;
} else if (self.y > 2732) {
self.y = 2732;
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Initialize ball and paddles
var ball = game.addChild(new Ball());
ball.x = 1024; // Center horizontally
ball.y = 1366; // Center vertically
var playerPaddle = game.addChild(new Paddle());
playerPaddle.x = 100; // Position player paddle on the left
var aiPaddle = game.addChild(new Paddle());
aiPaddle.x = 1948; // Position AI paddle on the right
// Initialize score text
var playerScoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff" //Optional (this is the default string)
});
playerScoreTxt.anchor.set(0, 0); // Sets anchor to the left of the top edge of the text.
playerScoreTxt.x = 500; // Move the player score 500 pixels to the right
LK.gui.topLeft.addChild(playerScoreTxt); // Add the player's score text to the GUI overlay
var aiScoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
aiScoreTxt.anchor.set(1, 0);
aiScoreTxt.x = -500; // Move the computer score 500 pixels to the left
LK.gui.topRight.addChild(aiScoreTxt);
// Initialize and position the dashed line
for (var i = 0; i < 2732; i += 200) {
var dashedLine = game.addChild(new DashedLine());
dashedLine.x = 1024; // Center horizontally
dashedLine.y = i;
}
// Handle touch movement for player paddle
game.on('move', function (obj) {
var pos = obj.event.getLocalPosition(game);
playerPaddle.move(pos.y);
});
// AI movement
function aiMove() {
var speed = 20; // Increase the speed of AI paddle
var inaccuracy = Math.random() < 0.5 ? 200 : 0; // 50% chance to move inaccurately
var targetY = ball.y + inaccuracy;
var diff = targetY - aiPaddle.y;
if (Math.abs(diff) < speed) {
aiPaddle.y = targetY;
} else {
aiPaddle.y += Math.sign(diff) * speed;
}
}
// Check for ball collisions with paddles
function checkCollisions() {
if (ball.intersects(playerPaddle)) {
// Calculate the difference between the center of the ball and the center of the paddle
var diffY = ball.y - playerPaddle.y;
// Normalize the difference to get a value between -1 and 1
var normalizedDiffY = diffY / (playerPaddle.height / 2);
// Multiply the normalized difference by the maximum angle of deflection (in radians)
var angle = normalizedDiffY * (5 * Math.PI / 12);
// Ensure the angle is at least 30 degrees
angle = Math.max(angle, Math.PI / 6);
// Set the new speeds based on the angle and increase it by 3 times
ball.speedX = Math.cos(angle) * 5 * 3;
ball.speedY = Math.sin(angle) * 5 * 3;
// Calculate the difference between the center of the ball and the center of the paddle
var diffY = ball.y - playerPaddle.y;
// Normalize the difference to get a value between -1 and 1
var normalizedDiffY = diffY / (playerPaddle.height / 2);
// Multiply the normalized difference by the maximum angle of deflection (in radians)
var angle = normalizedDiffY * (5 * Math.PI / 12);
// Ensure the angle is at least 30 degrees
angle = Math.max(angle, Math.PI / 6);
// Set the new speeds based on the angle and increase it by 3 times
ball.speedX = Math.cos(angle) * 5 * 3;
ball.speedY = Math.sin(angle) * 5 * 3;
}
if (ball.intersects(aiPaddle)) {
// Calculate the difference between the center of the ball and the center of the paddle
var diffY = ball.y - aiPaddle.y;
// Normalize the difference to get a value between -1 and 1
var normalizedDiffY = diffY / (aiPaddle.height / 2);
// Multiply the normalized difference by the maximum angle of deflection (in radians)
var angle = normalizedDiffY * (5 * Math.PI / 12);
// Ensure the angle is at least 30 degrees
angle = Math.max(angle, Math.PI / 6);
// Set the new speeds based on the angle and increase it by 3 times
ball.speedX = -Math.cos(angle) * 5 * 3;
ball.speedY = Math.sin(angle) * 5 * 3;
// Calculate the difference between the center of the ball and the center of the paddle
var diffY = ball.y - aiPaddle.y;
// Normalize the difference to get a value between -1 and 1
var normalizedDiffY = diffY / (aiPaddle.height / 2);
// Multiply the normalized difference by the maximum angle of deflection (in radians)
var angle = normalizedDiffY * (5 * Math.PI / 12);
// Ensure the angle is at least 30 degrees
angle = Math.max(angle, Math.PI / 6);
// Set the new speeds based on the angle and increase it by 3 times
ball.speedX = -Math.cos(angle) * 5 * 3;
ball.speedY = Math.sin(angle) * 5 * 3;
}
// Check for scoring
if (ball.x <= 0) {
// Reset ball position
ball.x = 1024;
ball.y = 1366;
ball.speedX *= -1;
aiPaddle.score++; // Increase AI's score
aiScoreTxt.setText(aiPaddle.score); // Update AI's score display
}
if (ball.x >= 2048) {
// Reset ball position
ball.x = 1024;
ball.y = 1366;
ball.speedX *= -1;
playerPaddle.score++; // Increase player's score
playerScoreTxt.setText(playerPaddle.score); // Update player's score display
}
// Check if the player or the AI has won
if (playerPaddle.score >= 10 || aiPaddle.score >= 10) {
// Flash screen red for 1 second (1000ms) to show game over.
LK.effects.flashScreen(0xff0000, 1000);
// Show game over. The game will be automatically paused while game over is showing.
LK.showGameOver(); // Calling this will destroy the 'Game' and reset entire game state.
}
}
// Game tick
LK.on('tick', function () {
ball.move();
aiMove();
checkCollisions();
playerScoreTxt.setText(playerPaddle.score); // Update score display
});