/**** * Classes ****/ // Ball class var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); self.mass = 10; self.velocity = { x: 0, y: 0 }; self.radius = ballGraphics.width / 2; self.update = function () { var initialSpeed = 15; var maxSpeed = initialSpeed * 2; var currentSpeed = Math.sqrt(self.velocity.x * self.velocity.x + self.velocity.y * self.velocity.y); if (currentSpeed > maxSpeed) { var speedReductionFactor = maxSpeed / currentSpeed; self.velocity.x *= speedReductionFactor; self.velocity.y *= speedReductionFactor; } self.x += self.velocity.x; self.y += self.velocity.y; }; self.reset = function () { var safeZone = planet.radius * 3; var minX = safeZone; var maxX = game.width - safeZone; var minY = safeZone; var maxY = game.height - safeZone; do { self.x = Math.random() * (maxX - minX) + minX; self.y = Math.random() * (maxY - minY) + minY; var dx = planet.x - self.x; var dy = planet.y - self.y; } while (Math.sqrt(dx * dx + dy * dy) < safeZone); var angle = Math.random() * Math.PI * 2; self.velocity = { x: Math.cos(angle) * 15, // Increased initial speed y: Math.sin(angle) * 15 // Increased initial speed }; }; }); // Paddle class var Paddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.attachAsset('paddle', { anchorX: 0.5, anchorY: 0.5 }); self.isMoving = false; self.update = function () { // Paddle update logic }; }); // SecondPlanet class var SecondPlanet = Container.expand(function () { var self = Container.call(this); var planetGraphics = self.attachAsset('secondPlanet', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.mass = 5000; // Increased mass for stronger gravity calculation self.radius = planetGraphics.width / 2; self.x = game.width / 2; self.y = game.height / 2 - 150; // Move the second planet up by 150 units }); // Health class var Health = Container.expand(function () { var self = Container.call(this); var healthGraphics = self.attachAsset('health', { anchorX: 0.5, anchorY: 0.5 }); self.width = healthGraphics.width; self.height = healthGraphics.height; }); // Satellite class var Satellite = Container.expand(function () { var self = Container.call(this); var satelliteGraphics = self.attachAsset('satellite', { anchorX: 0.5, anchorY: 0.5 }); self.orbitRadius = 0; self.orbitSpeed = 0.01; self.orbitAngle = Math.random() * Math.PI * 2; self.update = function () { self.orbitAngle += self.orbitSpeed; var dx = planet.x - game.width / 2; var dy = planet.y - game.height / 2; var ellipseRatio = 3; // Reduce the mass of the satellite to decrease gravitational force self.mass = 1000; // Adjusted mass for weaker gravity calculation self.x = game.width / 2 + self.orbitRadius * ellipseRatio * Math.cos(self.orbitAngle) + dx + 1500; self.y = game.height / 2 + self.orbitRadius / ellipseRatio * Math.sin(self.orbitAngle) + dy; if (self.x < -self.width * 2 || self.x > game.width + self.width * 2 || self.y < -self.height * 2 || self.y > game.height + self.height * 2) { self.orbitRadius = Math.max(game.width, game.height) / 3.5; } }; self.reset = function () { self.orbitRadius = Math.max(game.width, game.height) / 4; self.orbitSpeed = (Math.random() * 0.02 + 0.005) * 0.5; self.orbitAngle = Math.random() * Math.PI * 2; }; }); // EllipticalOrbitObject class var EllipticalOrbitObject = Container.expand(function () { var self = Container.call(this); var orbitObjectGraphics = self.attachAsset('ellipticalOrbitObject', { anchorX: 0.5, anchorY: 0.5 }); self.orbitRadius = 0; self.orbitSpeed = 0.01; self.orbitAngle = Math.random() * Math.PI * 2; self.update = function (secondPlanet, ball) { self.orbitAngle += self.orbitSpeed; var dx = secondPlanet.x - game.width / 2; var dy = secondPlanet.y - game.height / 2; var ellipseRatio = 2; // Ratio for the elliptical orbit self.x = game.width / 2 + self.orbitRadius / ellipseRatio * Math.sin(self.orbitAngle + Math.PI / 2) + dx; self.y = game.height / 2 + self.orbitRadius * ellipseRatio * Math.cos(self.orbitAngle + Math.PI / 2) + dy - 900; if (self.x < -self.width * 2 || self.x > game.width + self.width * 2 || self.y < -self.height * 2 || self.y > game.height + self.height * 2) { self.orbitRadius = Math.max(game.width, game.height) / 4; } // Gravity effect on the ball if (ball) { if (ball) { var distanceToBall = Math.sqrt(Math.pow(ball.x - self.x, 2) + Math.pow(ball.y - self.y, 2)); // Rest of the code that uses distanceToBall } // Rest of the code that uses distanceToBall } var gravityStrength = self.mass / Math.pow(distanceToBall, 1.8); // Decreased the exponent to increase gravity effect if (distanceToBall < self.orbitRadius) { var gravityX = (self.x - ball.x) / distanceToBall * gravityStrength; var gravityY = (self.y - ball.y) / distanceToBall * gravityStrength; ball.velocity.x += gravityX; ball.velocity.y += gravityY; } }; self.reset = function () { self.orbitRadius = Math.max(game.width, game.height) / 5; self.orbitSpeed = (Math.random() * 0.02 + 0.005) * 0.65; self.orbitAngle = Math.random() * Math.PI * 2; }; }); // Background class var Background = Container.expand(function () { var self = Container.call(this); var backgroundGraphics = self.attachAsset('background', {}); backgroundGraphics.width = game.width; backgroundGraphics.height = game.height; self.addChild(backgroundGraphics); }); /**** * Initialize Game ****/ // Initialize background var game = new LK.Game({ backgroundColor: 0x000000 // Init game with black background }); /**** * Game Code ****/ // Initialize background var background = game.addChild(new Background()); // Initialize game elements var ball = game.addChild(new Ball()); var leftPaddle = game.addChild(new Paddle()); var rightPaddle = game.addChild(new Paddle()); // Initialize health objects var healthObjects = []; for (var i = 0; i < 5; i++) { var health = game.addChild(new Health()); health.x = game.width - (i + 1) * (health.width + 10); health.y = 110; healthObjects.push(health); } // Set initial positions leftPaddle.x = 100; leftPaddle.y = game.height / 2; rightPaddle.x = game.width - 100; rightPaddle.y = game.height / 2; var planet = game.addChild(new SecondPlanet()); ball.reset(); // Initialize the elliptical orbit object var ellipticalOrbitObject = game.addChild(new EllipticalOrbitObject()); ellipticalOrbitObject.reset(); // Initialize satellite var satellite = game.addChild(new Satellite()); satellite.reset(); // Game logic LK.on('tick', function () { ball.update(); leftPaddle.update(); rightPaddle.update(); // Check for collisions with paddles and prevent ball from passing through if (ball.intersects(leftPaddle)) { ball.velocity.x = Math.abs(ball.velocity.x) * (leftPaddle.isMoving ? 1.05 : 1); ball.x = leftPaddle.x + leftPaddle.width / 2 + ball.radius; leftPaddle.isMoving = false; } else if (ball.intersects(rightPaddle)) { ball.velocity.x = -Math.abs(ball.velocity.x) * (rightPaddle.isMoving ? 1.05 : 1); ball.x = rightPaddle.x - rightPaddle.width / 2 - ball.radius; rightPaddle.isMoving = false; } // Check for collisions with top and bottom boundaries if (ball.y - ball.radius <= 0 || ball.y + ball.radius >= game.height) { ball.velocity.y *= -1; } // Gravity effect from planets var planets = [planet]; planets.forEach(function (currentPlanet) { var dx = currentPlanet.x - ball.x; var dy = currentPlanet.y - ball.y; var distance = Math.sqrt(dx * dx + dy * dy); var safeDistance = (currentPlanet.radius + ball.radius + 50) * 2; // Doubling the safe margin to increase gravity range if (distance < safeDistance) { // Adjusted gravity effect to maintain a safe distance var gravityMultiplier = currentPlanet === planet ? 1.3 : 5 * 1.3; var gravity = currentPlanet.mass / (distance * distance) * (10 * gravityMultiplier); // Adjust gravity based on planet var gravityX = dx / distance * gravity; var gravityY = dy / distance * gravity; ball.velocity.x += gravityX * (1 - (safeDistance - distance) / safeDistance); ball.velocity.y += gravityY * (1 - (safeDistance - distance) / safeDistance); } }); // Update satellite orbit and check for collision with the ball satellite.update(); if (satellite.intersects(ball)) { // Reflect ball velocity var normalX = ball.x - satellite.x; var normalY = ball.y - satellite.y; var normalLength = Math.sqrt(normalX * normalX + normalY * normalY); normalX /= normalLength; normalY /= normalLength; var dotProduct = ball.velocity.x * normalX + ball.velocity.y * normalY; ball.velocity.x -= 2 * dotProduct * normalX; ball.velocity.y -= 2 * dotProduct * normalY; } // Reset ball if it goes off screen and remove one health object if (ball.x < -ball.radius || ball.x > game.width + ball.radius) { if (healthObjects.length > 0) { var lastHealthIndex = healthObjects.length - 1; healthObjects[lastHealthIndex].destroy(); healthObjects.splice(lastHealthIndex, 1); } ball.reset(); if (healthObjects.length === 0) { LK.showGameOver(); } } // Update the elliptical orbit object and check for collision with the ball ellipticalOrbitObject.update(planet); if (ellipticalOrbitObject.intersects(ball)) { // Reflect ball velocity var normalX = ball.x - ellipticalOrbitObject.x; var normalY = ball.y - ellipticalOrbitObject.y; var normalLength = Math.sqrt(normalX * normalX + normalY * normalY); normalX /= normalLength; normalY /= normalLength; var dotProduct = ball.velocity.x * normalX + ball.velocity.y * normalY; ball.velocity.x -= 2 * dotProduct * normalX; ball.velocity.y -= 2 * dotProduct * normalY; } }); // Touch controls for paddles function handleTouch(obj) { var touchPos = obj.event.getLocalPosition(game); if (touchPos.x < game.width / 2) { leftPaddle.isMoving = leftPaddle.y !== touchPos.y; leftPaddle.y = touchPos.y; } else { rightPaddle.isMoving = rightPaddle.y !== touchPos.y; rightPaddle.y = touchPos.y; } } game.on('down', handleTouch); game.on('move', handleTouch);
/****
* Classes
****/
// Ball class
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.mass = 10;
self.velocity = {
x: 0,
y: 0
};
self.radius = ballGraphics.width / 2;
self.update = function () {
var initialSpeed = 15;
var maxSpeed = initialSpeed * 2;
var currentSpeed = Math.sqrt(self.velocity.x * self.velocity.x + self.velocity.y * self.velocity.y);
if (currentSpeed > maxSpeed) {
var speedReductionFactor = maxSpeed / currentSpeed;
self.velocity.x *= speedReductionFactor;
self.velocity.y *= speedReductionFactor;
}
self.x += self.velocity.x;
self.y += self.velocity.y;
};
self.reset = function () {
var safeZone = planet.radius * 3;
var minX = safeZone;
var maxX = game.width - safeZone;
var minY = safeZone;
var maxY = game.height - safeZone;
do {
self.x = Math.random() * (maxX - minX) + minX;
self.y = Math.random() * (maxY - minY) + minY;
var dx = planet.x - self.x;
var dy = planet.y - self.y;
} while (Math.sqrt(dx * dx + dy * dy) < safeZone);
var angle = Math.random() * Math.PI * 2;
self.velocity = {
x: Math.cos(angle) * 15,
// Increased initial speed
y: Math.sin(angle) * 15 // Increased initial speed
};
};
});
// Paddle class
var Paddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.attachAsset('paddle', {
anchorX: 0.5,
anchorY: 0.5
});
self.isMoving = false;
self.update = function () {
// Paddle update logic
};
});
// SecondPlanet class
var SecondPlanet = Container.expand(function () {
var self = Container.call(this);
var planetGraphics = self.attachAsset('secondPlanet', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.mass = 5000; // Increased mass for stronger gravity calculation
self.radius = planetGraphics.width / 2;
self.x = game.width / 2;
self.y = game.height / 2 - 150; // Move the second planet up by 150 units
});
// Health class
var Health = Container.expand(function () {
var self = Container.call(this);
var healthGraphics = self.attachAsset('health', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = healthGraphics.width;
self.height = healthGraphics.height;
});
// Satellite class
var Satellite = Container.expand(function () {
var self = Container.call(this);
var satelliteGraphics = self.attachAsset('satellite', {
anchorX: 0.5,
anchorY: 0.5
});
self.orbitRadius = 0;
self.orbitSpeed = 0.01;
self.orbitAngle = Math.random() * Math.PI * 2;
self.update = function () {
self.orbitAngle += self.orbitSpeed;
var dx = planet.x - game.width / 2;
var dy = planet.y - game.height / 2;
var ellipseRatio = 3;
// Reduce the mass of the satellite to decrease gravitational force
self.mass = 1000; // Adjusted mass for weaker gravity calculation
self.x = game.width / 2 + self.orbitRadius * ellipseRatio * Math.cos(self.orbitAngle) + dx + 1500;
self.y = game.height / 2 + self.orbitRadius / ellipseRatio * Math.sin(self.orbitAngle) + dy;
if (self.x < -self.width * 2 || self.x > game.width + self.width * 2 || self.y < -self.height * 2 || self.y > game.height + self.height * 2) {
self.orbitRadius = Math.max(game.width, game.height) / 3.5;
}
};
self.reset = function () {
self.orbitRadius = Math.max(game.width, game.height) / 4;
self.orbitSpeed = (Math.random() * 0.02 + 0.005) * 0.5;
self.orbitAngle = Math.random() * Math.PI * 2;
};
});
// EllipticalOrbitObject class
var EllipticalOrbitObject = Container.expand(function () {
var self = Container.call(this);
var orbitObjectGraphics = self.attachAsset('ellipticalOrbitObject', {
anchorX: 0.5,
anchorY: 0.5
});
self.orbitRadius = 0;
self.orbitSpeed = 0.01;
self.orbitAngle = Math.random() * Math.PI * 2;
self.update = function (secondPlanet, ball) {
self.orbitAngle += self.orbitSpeed;
var dx = secondPlanet.x - game.width / 2;
var dy = secondPlanet.y - game.height / 2;
var ellipseRatio = 2; // Ratio for the elliptical orbit
self.x = game.width / 2 + self.orbitRadius / ellipseRatio * Math.sin(self.orbitAngle + Math.PI / 2) + dx;
self.y = game.height / 2 + self.orbitRadius * ellipseRatio * Math.cos(self.orbitAngle + Math.PI / 2) + dy - 900;
if (self.x < -self.width * 2 || self.x > game.width + self.width * 2 || self.y < -self.height * 2 || self.y > game.height + self.height * 2) {
self.orbitRadius = Math.max(game.width, game.height) / 4;
}
// Gravity effect on the ball
if (ball) {
if (ball) {
var distanceToBall = Math.sqrt(Math.pow(ball.x - self.x, 2) + Math.pow(ball.y - self.y, 2));
// Rest of the code that uses distanceToBall
}
// Rest of the code that uses distanceToBall
}
var gravityStrength = self.mass / Math.pow(distanceToBall, 1.8); // Decreased the exponent to increase gravity effect
if (distanceToBall < self.orbitRadius) {
var gravityX = (self.x - ball.x) / distanceToBall * gravityStrength;
var gravityY = (self.y - ball.y) / distanceToBall * gravityStrength;
ball.velocity.x += gravityX;
ball.velocity.y += gravityY;
}
};
self.reset = function () {
self.orbitRadius = Math.max(game.width, game.height) / 5;
self.orbitSpeed = (Math.random() * 0.02 + 0.005) * 0.65;
self.orbitAngle = Math.random() * Math.PI * 2;
};
});
// Background class
var Background = Container.expand(function () {
var self = Container.call(this);
var backgroundGraphics = self.attachAsset('background', {});
backgroundGraphics.width = game.width;
backgroundGraphics.height = game.height;
self.addChild(backgroundGraphics);
});
/****
* Initialize Game
****/
// Initialize background
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Initialize background
var background = game.addChild(new Background());
// Initialize game elements
var ball = game.addChild(new Ball());
var leftPaddle = game.addChild(new Paddle());
var rightPaddle = game.addChild(new Paddle());
// Initialize health objects
var healthObjects = [];
for (var i = 0; i < 5; i++) {
var health = game.addChild(new Health());
health.x = game.width - (i + 1) * (health.width + 10);
health.y = 110;
healthObjects.push(health);
}
// Set initial positions
leftPaddle.x = 100;
leftPaddle.y = game.height / 2;
rightPaddle.x = game.width - 100;
rightPaddle.y = game.height / 2;
var planet = game.addChild(new SecondPlanet());
ball.reset();
// Initialize the elliptical orbit object
var ellipticalOrbitObject = game.addChild(new EllipticalOrbitObject());
ellipticalOrbitObject.reset();
// Initialize satellite
var satellite = game.addChild(new Satellite());
satellite.reset();
// Game logic
LK.on('tick', function () {
ball.update();
leftPaddle.update();
rightPaddle.update();
// Check for collisions with paddles and prevent ball from passing through
if (ball.intersects(leftPaddle)) {
ball.velocity.x = Math.abs(ball.velocity.x) * (leftPaddle.isMoving ? 1.05 : 1);
ball.x = leftPaddle.x + leftPaddle.width / 2 + ball.radius;
leftPaddle.isMoving = false;
} else if (ball.intersects(rightPaddle)) {
ball.velocity.x = -Math.abs(ball.velocity.x) * (rightPaddle.isMoving ? 1.05 : 1);
ball.x = rightPaddle.x - rightPaddle.width / 2 - ball.radius;
rightPaddle.isMoving = false;
}
// Check for collisions with top and bottom boundaries
if (ball.y - ball.radius <= 0 || ball.y + ball.radius >= game.height) {
ball.velocity.y *= -1;
}
// Gravity effect from planets
var planets = [planet];
planets.forEach(function (currentPlanet) {
var dx = currentPlanet.x - ball.x;
var dy = currentPlanet.y - ball.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var safeDistance = (currentPlanet.radius + ball.radius + 50) * 2; // Doubling the safe margin to increase gravity range
if (distance < safeDistance) {
// Adjusted gravity effect to maintain a safe distance
var gravityMultiplier = currentPlanet === planet ? 1.3 : 5 * 1.3;
var gravity = currentPlanet.mass / (distance * distance) * (10 * gravityMultiplier); // Adjust gravity based on planet
var gravityX = dx / distance * gravity;
var gravityY = dy / distance * gravity;
ball.velocity.x += gravityX * (1 - (safeDistance - distance) / safeDistance);
ball.velocity.y += gravityY * (1 - (safeDistance - distance) / safeDistance);
}
});
// Update satellite orbit and check for collision with the ball
satellite.update();
if (satellite.intersects(ball)) {
// Reflect ball velocity
var normalX = ball.x - satellite.x;
var normalY = ball.y - satellite.y;
var normalLength = Math.sqrt(normalX * normalX + normalY * normalY);
normalX /= normalLength;
normalY /= normalLength;
var dotProduct = ball.velocity.x * normalX + ball.velocity.y * normalY;
ball.velocity.x -= 2 * dotProduct * normalX;
ball.velocity.y -= 2 * dotProduct * normalY;
}
// Reset ball if it goes off screen and remove one health object
if (ball.x < -ball.radius || ball.x > game.width + ball.radius) {
if (healthObjects.length > 0) {
var lastHealthIndex = healthObjects.length - 1;
healthObjects[lastHealthIndex].destroy();
healthObjects.splice(lastHealthIndex, 1);
}
ball.reset();
if (healthObjects.length === 0) {
LK.showGameOver();
}
}
// Update the elliptical orbit object and check for collision with the ball
ellipticalOrbitObject.update(planet);
if (ellipticalOrbitObject.intersects(ball)) {
// Reflect ball velocity
var normalX = ball.x - ellipticalOrbitObject.x;
var normalY = ball.y - ellipticalOrbitObject.y;
var normalLength = Math.sqrt(normalX * normalX + normalY * normalY);
normalX /= normalLength;
normalY /= normalLength;
var dotProduct = ball.velocity.x * normalX + ball.velocity.y * normalY;
ball.velocity.x -= 2 * dotProduct * normalX;
ball.velocity.y -= 2 * dotProduct * normalY;
}
});
// Touch controls for paddles
function handleTouch(obj) {
var touchPos = obj.event.getLocalPosition(game);
if (touchPos.x < game.width / 2) {
leftPaddle.isMoving = leftPaddle.y !== touchPos.y;
leftPaddle.y = touchPos.y;
} else {
rightPaddle.isMoving = rightPaddle.y !== touchPos.y;
rightPaddle.y = touchPos.y;
}
}
game.on('down', handleTouch);
game.on('move', handleTouch);
plasma barrier. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
neutron star. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
neutron star, pulsar. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cat eye nebula, cartoon style. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
flying saucer, cartoon style. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
erase