/****
* 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