/**** * Classes ****/ var HelpMenuBackground = Container.expand(function (positionX, positionY) { var self = Container.call(this); var backgroundGraphics = self.attachAsset('helpMenuBackground', { anchorX: 0.5, anchorY: 0.5 }); // Create and add welcome text to the HelpMenuBackground var textline1 = new Text2('Welcome to Blast through the Cosmos - Your Ultimate Space Adventure!', { size: 60, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline1.anchor.set(0.5); textline1.x = 0; textline1.y = -800; // Position the text at 0,0 self.addChild(textline1); // Create and add controls text to the HelpMenuBackground var textline2 = new Text2('Controls:', { size: 50, fill: "#ffffff", font: "Game Over", align: 'center' }); textline2.anchor.set(0.5); textline2.x = 0; textline2.y = -650; // Position the text below textline1 self.addChild(textline2); self.x = positionX; var textline3 = new Text2('Move your spaceship: For mouse, the spaceship will follow your cursor. For phone, tap where you want your ship to go.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline3.anchor.set(0.5); textline3.x = 0; textline3.y = -500; // Position the text below textline2 self.addChild(textline3); var textline4 = new Text2('Fire bullets: Double Tap anywhere on the screen.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline4.anchor.set(0.5); textline4.x = 0; textline4.y = -350; // Position the text below textline3 self.addChild(textline4); var textline5 = new Text2('Objective:', { size: 50, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline5.anchor.set(0.5); textline5.x = 0; textline5.y = -200; // Position the text below textline4 self.addChild(textline5); var textline6 = new Text2('Destroy the robotic android enemies to increase your score, Cosmic Credits, and replenish your bullets.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline6.anchor.set(0.5); textline6.x = 0; textline6.y = -100; // Position the text below textline5 self.addChild(textline6); var textline7 = new Text2('Running out of bullets results in defeat, so keep an eye on your ammo!', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline7.anchor.set(0.5); textline7.x = 0; textline7.y = 0 + 50; // Position the text below textline6 self.addChild(textline7); var textline8 = new Text2('Game Elements:', { size: 50, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline8.anchor.set(0.5); textline8.x = 0; textline8.y = textline7.y + 150; // Position the text below textline7 self.addChild(textline8); var textline9 = new Text2('Bullets: Start with 3 bullets. Shoot enemies to gain Cosmic Credits and earn back your bullets. Collect bullet packs to add 5 bullets instantly.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline9.anchor.set(0.5); textline9.x = 0; textline9.y = textline8.y + 150; // Position the text below textline8 self.addChild(textline9); var textline10 = new Text2('Cosmic Credits (CC): Use CC to purchase bullets. Spend wisely to survive longer and achieve higher scores.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline10.anchor.set(0.5); textline10.x = 0; textline10.y = textline9.y + 200; // Position the text below textline9 self.addChild(textline10); var textline11 = new Text2('Tips for Success:', { size: 50, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline11.anchor.set(0.5); textline11.x = 0; textline11.y = textline10.y + 150; // Position the text below textline10 self.addChild(textline11); var textline12 = new Text2('Prioritize enemies strategically to maximize your score and rewards.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline12.anchor.set(0.5); textline12.x = 0; textline12.y = textline11.y + 100; // Position the text below textline11 self.addChild(textline12); var textline13 = new Text2('Master your spaceship\'s movements to navigate through challenging obstacles.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline13.anchor.set(0.5); textline13.x = 0; textline13.y = textline12.y + 150; // Position the text below textline12 self.addChild(textline13); var textline14 = new Text2('Save up Cosmic Credits for crucial upgrades as you progress.', { size: 70, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline14.anchor.set(0.5); textline14.x = 0; textline14.y = textline13.y + 175; // Position the text below textline13 self.addChild(textline14); var textline15 = new Text2('This game is no longer updated.', { size: 45, fill: "#ffffff", font: "Game Over", align: 'center', wordWrap: true, wordWrapWidth: game.width * 0.8 }); textline15.anchor.set(0.5); textline15.x = 0; textline15.y = textline14.y + 150; // Position the text below textline14 self.addChild(textline15); self.y = positionY; }); var RestartButton = Container.expand(function (positionX, positionY) { var self = Container.call(this); var buttonGraphics = self.attachAsset('restartButton', { anchorX: 0.5, anchorY: 0.5 }); var restartText = new Text2('Restart', { size: 150, fill: "#ffffff", font: "Game Over" }); restartText.anchor.set(0.5); self.addChild(restartText); self.x = positionX; self.y = positionY; self.interactive = true; self.on('down', function (obj) { self.alpha = 0.5; }); self.on('up', function (obj) { self.alpha = 1.0; LK.showGameOver(); }); }); var ResumeButton = Container.expand(function (positionX, positionY) { var self = Container.call(this); var buttonGraphics = self.attachAsset('resume', { anchorX: 0.5, anchorY: 0.5 }); // Create and add the resume text to the button var resumeText = new Text2('Resume', { size: 150, fill: "#ffffff", font: "Game Over" }); resumeText.anchor.set(0.5); self.addChild(resumeText); self.x = positionX; self.y = positionY; self.interactive = true; self.on('down', function (obj) { self.alpha = 0.5; }); self.on('up', function (obj) { self.alpha = 1.0; isGamePaused = false; bulletAddedOnPause = false; pauseButton.interactive = true; // Re-enable the pause button self.destroy(); pauseMenuBackground.destroy(); restartButton.destroy(); settingsButton.destroy(); }); }); var PurchaseButtonWithText = Container.expand(function (buttonAssetId, buttonText, buttonSubText, positionX, positionY, onClickCallback) { var self = Container.call(this); var button = self.attachAsset('purchase1', { anchorX: 0.5, anchorY: 0.5 }); var text = new Text2(buttonText, { size: 45, fill: "#ffffff", font: "Game Over" }); var subText = new Text2(buttonSubText, { size: 45, fill: "#ffffff", font: "Game Over" }); text.anchor.set(0.5, 1); subText.anchor.set(0.5, 0); text.y = -button.height / 2 - 10; subText.y = button.height / 2 + 10; self.addChild(text); self.addChild(subText); self.x = positionX; self.y = positionY; self.interactive = true; self.on('down', function (obj) { self.alpha = 0.5; onClickCallback(); }); self.on('up', function (obj) { self.alpha = 1.0; }); }); // BulletPack class var BulletPack = Container.expand(function () { var self = Container.call(this); var bulletPackGraphics = self.attachAsset('bulletPack', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.direction = Math.random() < 0.5 ? -1 : 1; self.move = function () { var speedIncreaseFactor = 0.1 + LK.ticks * 0.0002; self.y += self.speed + speedIncreaseFactor; // Randomly change direction with a 10% chance each tick if (Math.random() < 0.1) { self.direction *= -1; } self.x += self.direction * (10 + speedIncreaseFactor); // Keep BulletPack within game bounds if (self.x < 0) { self.x = 0; self.direction *= -1; } if (self.x > game.width) { self.x = game.width; self.direction *= -1; } }; }); // Character class var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.bulletLimit = 3; // Initialize bullet limit self.canShoot = true; // Allow shooting initially self.update = function () { // Hero update logic }; self.shoot = function () { if (this.bulletLimit > 0 && this.canShoot && !isGamePaused) { var bullet = new Bullet(); bullet.x = this.x; bullet.y = this.y - this.height / 2; heroBullets.push(bullet); game.addChild(bullet); this.bulletLimit--; bulletCountTxt.setText('Bullets: ' + this.bulletLimit); // Update bullet count display this.canShoot = false; // Set shooting cooldown LK.setTimeout(function () { self.canShoot = true; }, 500); // Cooldown of 500ms before next shot } }; }); // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('Bullet', { anchorX: 0.0625, anchorY: 0.0625 }); self.speed = -10; self.move = function () { self.y += self.speed; }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.direction = Math.random() < 0.5 ? -1 : 1; self.move = function () { self.y += self.speed; var speedIncreaseFactor = 0.1 + LK.ticks * 0.0002; // Increase the speed factor over time self.x += self.direction * (4 + speedIncreaseFactor); // Randomly change direction with a 5% chance each tick if (Math.random() < 0.05 || self.x < 0 || self.x > game.width) { self.direction *= -1; } // Keep enemy within game bounds if (self.x < 0) { self.x = 0; } if (self.x > game.width) { self.x = game.width; } self.speed += 0.02 + LK.ticks * 0.0001; // Increase speed over time with an accelerating factor }; }); var Button = Container.expand(function (text, positionX, positionY, onClickCallback) { var self = Container.call(this); var buttonText = new Text2(text, { size: 200, fill: "#ffffff" }); buttonText.anchor.set(0.5); self.addChild(buttonText); self.x = positionX; self.y = positionY; self.interactive = true; self.on('down', function (obj) { self.alpha = 0.5; onClickCallback(); }); self.on('up', function (obj) { self.alpha = 1.0; }); }); // JoystickAsset class var JoystickAsset = Container.expand(function () { var self = Container.call(this); self.interactive = true; self.isDragging = false; self.onMoveCallback = null; self.setMoveCallback = function (callback) { self.onMoveCallback = function (direction) { callback({ x: direction.x, y: 0 }); }; }; self.on('down', function (obj) { self.isDragging = true; }); self.on('up', function (obj) { self.isDragging = false; stickGraphics.x = stickOrigin.x; stickGraphics.y = stickOrigin.y; if (self.onMoveCallback) { self.onMoveCallback({ x: 0, y: 0 }); } }); self.on('move', function (obj) { if (self.isDragging) { var event = obj.event; var pos = event.getLocalPosition(self); var dx = pos.x - stickOrigin.x; var maxDistance = stickGraphics.width * 0.5; if (Math.abs(dx) > maxDistance) { dx = maxDistance * (dx > 0 ? 1 : -1); } stickGraphics.x = stickOrigin.x + dx; stickGraphics.y = stickOrigin.y; if (self.onMoveCallback) { self.onMoveCallback({ x: dx / maxDistance, y: 0 }); } } }); self.containsPoint = function (point) { return point.x >= self.x - self.width / 2 && point.x <= self.x + self.width / 2 && point.y >= self.y - self.height / 2 && point.y <= self.y + self.height / 2; }; }); var SettingsButton = Container.expand(function (positionX, positionY) { var self = Container.call(this); var buttonGraphics = self.attachAsset('help', { anchorX: 0.5, anchorY: 0.5 }); // Create and add the settings text to the button var settingsText = new Text2('Help', { size: 150, fill: "#ffffff", font: "Game Over" }); settingsText.anchor.set(0.5); self.addChild(settingsText); self.x = positionX; self.y = positionY; self.interactive = true; self.on('down', function (obj) { self.alpha = 0.5; }); self.on('up', function (obj) { self.alpha = 1.0; var settingsMenuOpen = false; var helpMenuBackground = game.addChild(new HelpMenuBackground(game.width / 2, game.height / 2)); settingsMenuOpen = true; // Add 'exit' asset to the settings menu var exitButton = helpMenuBackground.addChild(LK.getAsset('exit', { anchorX: 0.5, anchorY: 0.5, x: game.width / 2 - 1000, // Move 100 pixels to the left y: -1250 })); exitButton.interactive = true; exitButton.on('down', function () { exitButton.alpha = 0.5; }); exitButton.on('up', function () { exitButton.alpha = 1.0; helpMenuBackground.destroy(); // Close help menu settingsMenuOpen = false; }); }); }); /**** * Initialize Game ****/ var game = new LK.Game({ title: 'gameplaypage' }); /**** * Game Code ****/ var backgrounds = ['gameBackground', 'gamebackground2', 'gamebackground3', 'gamebackground4', 'gamebackground5', 'gamebackground6', 'gamebackground7', 'gamebackground8', 'gamebackground9', 'gamebackground10']; var selectedBackground = backgrounds[Math.floor(Math.random() * backgrounds.length)]; var background = game.addChild(LK.getAsset(selectedBackground, { width: game.width, height: game.height, x: game.width / 2, y: game.height / 2, anchorX: 0.5, anchorY: 0.5 })); var pauseMenuBackground, resumeButton, restartButton, settingsButton; function showPauseMenu() { if (isGamePaused) { pauseMenuBackground = game.addChild(LK.getAsset('pauseMenuBackground', { width: game.width, height: game.height, color: 0x000000, alpha: 0.5 })); resumeButton = game.addChild(new ResumeButton(game.width / 2, game.height / 2 - 750)); restartButton = game.addChild(new RestartButton(game.width / 2, game.height / 2 + 250)); settingsButton = game.addChild(new SettingsButton(game.width / 2, game.height / 2 - 250)); } } var isGamePaused = false, settingsMenuOpen = false; // Global variables to track the pause state of the game and settings menu state var Purchase1 = game.addChild(new PurchaseButtonWithText('purchase1', '10 Bullets for:', '50 Cosmic Credits', 200, game.height - 200, function () { if (cosmicCredits >= 50) { cosmicCredits -= 50; hero.bulletLimit += 10; bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits); } })); Purchase1.interactive = true; Purchase1.on('down', function () { Purchase1.alpha = 0.5; if (cosmicCredits >= 50) { cosmicCredits -= 50; hero.bulletLimit += 10; bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits); } }); Purchase1.on('up', function () { Purchase1.alpha = 1.0; }); var purchase2 = game.addChild(new PurchaseButtonWithText('purchase2', '20 Bullets for:', '75 Cosmic Credits', game.width - 200, game.height - 200, function () { if (cosmicCredits >= 75) { cosmicCredits -= 75; hero.bulletLimit += 20; bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits); } })); purchase2.interactive = true; purchase2.on('down', function () { purchase2.alpha = 0.5; if (cosmicCredits >= 75) { cosmicCredits -= 75; hero.bulletLimit += 20; bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits); } }); purchase2.on('up', function () { purchase2.alpha = 1.0; }); // Initialize important asset arrays var heroBullets = []; var enemies = []; // Create character var hero = game.addChild(new Hero()); hero.x = game.width / 2; hero.y = game.height - 100; var cosmicCredits = 0; // Initialize cosmic credits // Create score display var scoreTxt = new Text2('Score: 0', { size: 50, fill: "#ffffff", font: "Game Over" }); var cosmicCreditsTxt = new Text2('Cosmic Credits: 0', { size: 50, fill: "#ffffff", font: "Game Over" }); // New currency display scoreTxt.anchor.set(1, 0); cosmicCreditsTxt.anchor.set(1, 0); cosmicCreditsTxt.y = scoreTxt.y + scoreTxt.height + 20; // Position below the score display LK.gui.topRight.addChild(scoreTxt); LK.gui.topRight.addChild(cosmicCreditsTxt); // Add the cosmic credits display to the GUI // Create version display var versionTxt = new Text2('v0.3.0 BETA', { size: 50, fill: "#ffffff", font: "Game Over" }); versionTxt.anchor.set(1, 0); versionTxt.y = cosmicCreditsTxt.y + cosmicCreditsTxt.height + 20; // Position below the cosmic credits display LK.gui.topRight.addChild(versionTxt); // Add the version display to the GUI // Create bullet count display var bulletCountTxt = new Text2('Bullets: 3', { size: 100, fill: "#ffffff", font: "Game Over" }); bulletCountTxt.anchor.set(0, 0); bulletCountTxt.y = scoreTxt.height + 50; // Position below the score display LK.gui.topLeft.addChild(bulletCountTxt); // Create instructions display var instructionsTxt = new Text2('Double tap anywhere to shoot', { size: 50, fill: "#ffffff", font: "Game Over" }); instructionsTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(instructionsTxt); // Pause button event listener var pauseButton = game.addChild(LK.getAsset('pause', { x: 1000 })); pauseButton.interactive = true; var bulletAddedOnPause = false; pauseButton.on('down', function () { if (!isGamePaused && !settingsMenuOpen) { isGamePaused = true; pauseButton.interactive = false; // Disable the pause button // Make the bullet closest to the hero null var closestBullet = null; var closestDistance = Infinity; heroBullets.forEach(function (bullet) { var distance = hero.y - bullet.y; if (distance >= 0 && distance < closestDistance) { closestDistance = distance; closestBullet = bullet; } }); if (closestBullet) { closestBullet.destroy(); heroBullets.splice(heroBullets.indexOf(closestBullet), 1); } showPauseMenu(); } }); // Create a red line 3/4 down the screen var redLine = LK.getAsset('redLine', {}); redLine.width = game.width; redLine.height = 5; redLine.y = game.height * 0.75; game.addChild(redLine); // Create joystick instance var joystick = new JoystickAsset(); joystick.x = joystick.width / 2 + 150; joystick.y = game.height - joystick.height / 2 - 150; joystick.setMoveCallback(function (direction) { hero.x = Math.max(hero.width / 2, Math.min(game.width - hero.width / 2, hero.x + direction.x * 10)); }); game.addChild(joystick); // Handle tap on the game stage to shoot bullets, excluding buttons var dragNode = null; var lastTapTime = 0; game.on('down', function (obj) { var currentTime = Date.now(); var event = obj.event; var pos = event.getLocalPosition(game); // Check if the tap is not on any button or the pause button var purchaseButtonBoundsLeft = Purchase1.getBounds(); var purchaseButtonBoundsRight = purchase2.getBounds(); var pauseButtonBounds = pauseButton.getBounds(); if (!(pos.x >= purchaseButtonBoundsLeft.x && pos.x <= purchaseButtonBoundsLeft.x + purchaseButtonBoundsLeft.width && pos.y >= purchaseButtonBoundsLeft.y && pos.y <= purchaseButtonBoundsLeft.y + purchaseButtonBoundsLeft.height || pos.x >= purchaseButtonBoundsRight.x && pos.x <= purchaseButtonBoundsRight.x + purchaseButtonBoundsRight.width && pos.y >= purchaseButtonBoundsRight.y && pos.y <= purchaseButtonBoundsRight.y + purchaseButtonBoundsRight.height || pos.x >= pauseButtonBounds.x && pos.x <= pauseButtonBounds.x + pauseButtonBounds.width && pos.y >= pauseButtonBounds.y && pos.y <= pauseButtonBounds.y + pauseButtonBounds.height) && !joystick.containsPoint(pos)) { if (currentTime - lastTapTime < 300) { hero.shoot(); } lastTapTime = currentTime; } }); game.on('move', function (obj) { if (isGamePaused) { return; } var event = obj.event; var pos = event.getLocalPosition(game); hero.x = pos.x; // hero.y = pos.y; // Removed the line that sets the hero's y position }); // Game tick event LK.on('tick', function () { if (isGamePaused || settingsMenuOpen) { return; } // Stop updating if game is paused or settings menu is open // Update character hero.update(); // Move and check bullets for (var i = heroBullets.length - 1; i >= 0; i--) { var bullet = heroBullets[i]; bullet.move(); // Check for bullet collision with enemies and bullet packs for (var j = enemies.length - 1; j >= 0; j--) { if (bullet.intersects(enemies[j])) { if (enemies[j] instanceof BulletPack) { // If the enemy is a bullet pack // Increment character's bullet limit by 5 hero.bulletLimit += 5; } else { // If the enemy is an actual enemy // Update score and increase cosmic credits by 5 var newScore = LK.getScore() + 1; LK.setScore(newScore); scoreTxt.setText('Score: ' + newScore); cosmicCredits += 5; cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits); if (typeof localStorage !== 'undefined' && newScore > highScore) { localStorage.setItem('highScore', newScore.toString()); } // Increment character's bullet limit hero.bulletLimit++; } bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); // Update bullet count display // Destroy enemy/bullet pack and bullet enemies[j].destroy(); enemies.splice(j, 1); bullet.destroy(); heroBullets.splice(i, 1); break; } } // Remove off-screen bullets and end the game if it's the last one if (bullet.y < 0) { bullet.destroy(); heroBullets.splice(i, 1); if (heroBullets.length === 0 && hero.bulletLimit === 0) { LK.showGameOver(); // End the game when the last bullet is out of frame } } } // Move enemies and check if they pass the red line for (var k = enemies.length - 1; k >= 0; k--) { enemies[k].move(); if (enemies[k].y > game.height * 0.75) { enemies[k].destroy(); enemies[k] = null; enemies.splice(k, 1); } } var enemySpawnRate = 60; // Initialize enemy spawn rate // Spawn enemies and bullet packs if (LK.ticks % enemySpawnRate == 0) { var enemy = new Enemy(); enemy.x = Math.random() * (game.width - enemy.width) + enemy.width / 2; enemy.y = -enemy.height; enemies.push(enemy); game.addChild(enemy); if (enemySpawnRate > 30) { enemySpawnRate -= 0.5; } // Decrease spawn rate over time to a minimum of 30 ticks } if (LK.ticks % 600 == 0) { // Spawn a bullet pack every 600 ticks var bulletPack = new BulletPack(); bulletPack.x = Math.random() * (game.width - bulletPack.width) + bulletPack.width / 2; bulletPack.y = -bulletPack.height; enemies.push(bulletPack); // Add bullet pack to enemies array for collision detection game.addChild(bulletPack); } });
/****
* Classes
****/
var HelpMenuBackground = Container.expand(function (positionX, positionY) {
var self = Container.call(this);
var backgroundGraphics = self.attachAsset('helpMenuBackground', {
anchorX: 0.5,
anchorY: 0.5
});
// Create and add welcome text to the HelpMenuBackground
var textline1 = new Text2('Welcome to Blast through the Cosmos - Your Ultimate Space Adventure!', {
size: 60,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline1.anchor.set(0.5);
textline1.x = 0;
textline1.y = -800; // Position the text at 0,0
self.addChild(textline1);
// Create and add controls text to the HelpMenuBackground
var textline2 = new Text2('Controls:', {
size: 50,
fill: "#ffffff",
font: "Game Over",
align: 'center'
});
textline2.anchor.set(0.5);
textline2.x = 0;
textline2.y = -650; // Position the text below textline1
self.addChild(textline2);
self.x = positionX;
var textline3 = new Text2('Move your spaceship: For mouse, the spaceship will follow your cursor. For phone, tap where you want your ship to go.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline3.anchor.set(0.5);
textline3.x = 0;
textline3.y = -500; // Position the text below textline2
self.addChild(textline3);
var textline4 = new Text2('Fire bullets: Double Tap anywhere on the screen.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline4.anchor.set(0.5);
textline4.x = 0;
textline4.y = -350; // Position the text below textline3
self.addChild(textline4);
var textline5 = new Text2('Objective:', {
size: 50,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline5.anchor.set(0.5);
textline5.x = 0;
textline5.y = -200; // Position the text below textline4
self.addChild(textline5);
var textline6 = new Text2('Destroy the robotic android enemies to increase your score, Cosmic Credits, and replenish your bullets.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline6.anchor.set(0.5);
textline6.x = 0;
textline6.y = -100; // Position the text below textline5
self.addChild(textline6);
var textline7 = new Text2('Running out of bullets results in defeat, so keep an eye on your ammo!', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline7.anchor.set(0.5);
textline7.x = 0;
textline7.y = 0 + 50; // Position the text below textline6
self.addChild(textline7);
var textline8 = new Text2('Game Elements:', {
size: 50,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline8.anchor.set(0.5);
textline8.x = 0;
textline8.y = textline7.y + 150; // Position the text below textline7
self.addChild(textline8);
var textline9 = new Text2('Bullets: Start with 3 bullets. Shoot enemies to gain Cosmic Credits and earn back your bullets. Collect bullet packs to add 5 bullets instantly.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline9.anchor.set(0.5);
textline9.x = 0;
textline9.y = textline8.y + 150; // Position the text below textline8
self.addChild(textline9);
var textline10 = new Text2('Cosmic Credits (CC): Use CC to purchase bullets. Spend wisely to survive longer and achieve higher scores.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline10.anchor.set(0.5);
textline10.x = 0;
textline10.y = textline9.y + 200; // Position the text below textline9
self.addChild(textline10);
var textline11 = new Text2('Tips for Success:', {
size: 50,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline11.anchor.set(0.5);
textline11.x = 0;
textline11.y = textline10.y + 150; // Position the text below textline10
self.addChild(textline11);
var textline12 = new Text2('Prioritize enemies strategically to maximize your score and rewards.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline12.anchor.set(0.5);
textline12.x = 0;
textline12.y = textline11.y + 100; // Position the text below textline11
self.addChild(textline12);
var textline13 = new Text2('Master your spaceship\'s movements to navigate through challenging obstacles.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline13.anchor.set(0.5);
textline13.x = 0;
textline13.y = textline12.y + 150; // Position the text below textline12
self.addChild(textline13);
var textline14 = new Text2('Save up Cosmic Credits for crucial upgrades as you progress.', {
size: 70,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline14.anchor.set(0.5);
textline14.x = 0;
textline14.y = textline13.y + 175; // Position the text below textline13
self.addChild(textline14);
var textline15 = new Text2('This game is no longer updated.', {
size: 45,
fill: "#ffffff",
font: "Game Over",
align: 'center',
wordWrap: true,
wordWrapWidth: game.width * 0.8
});
textline15.anchor.set(0.5);
textline15.x = 0;
textline15.y = textline14.y + 150; // Position the text below textline14
self.addChild(textline15);
self.y = positionY;
});
var RestartButton = Container.expand(function (positionX, positionY) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('restartButton', {
anchorX: 0.5,
anchorY: 0.5
});
var restartText = new Text2('Restart', {
size: 150,
fill: "#ffffff",
font: "Game Over"
});
restartText.anchor.set(0.5);
self.addChild(restartText);
self.x = positionX;
self.y = positionY;
self.interactive = true;
self.on('down', function (obj) {
self.alpha = 0.5;
});
self.on('up', function (obj) {
self.alpha = 1.0;
LK.showGameOver();
});
});
var ResumeButton = Container.expand(function (positionX, positionY) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('resume', {
anchorX: 0.5,
anchorY: 0.5
});
// Create and add the resume text to the button
var resumeText = new Text2('Resume', {
size: 150,
fill: "#ffffff",
font: "Game Over"
});
resumeText.anchor.set(0.5);
self.addChild(resumeText);
self.x = positionX;
self.y = positionY;
self.interactive = true;
self.on('down', function (obj) {
self.alpha = 0.5;
});
self.on('up', function (obj) {
self.alpha = 1.0;
isGamePaused = false;
bulletAddedOnPause = false;
pauseButton.interactive = true; // Re-enable the pause button
self.destroy();
pauseMenuBackground.destroy();
restartButton.destroy();
settingsButton.destroy();
});
});
var PurchaseButtonWithText = Container.expand(function (buttonAssetId, buttonText, buttonSubText, positionX, positionY, onClickCallback) {
var self = Container.call(this);
var button = self.attachAsset('purchase1', {
anchorX: 0.5,
anchorY: 0.5
});
var text = new Text2(buttonText, {
size: 45,
fill: "#ffffff",
font: "Game Over"
});
var subText = new Text2(buttonSubText, {
size: 45,
fill: "#ffffff",
font: "Game Over"
});
text.anchor.set(0.5, 1);
subText.anchor.set(0.5, 0);
text.y = -button.height / 2 - 10;
subText.y = button.height / 2 + 10;
self.addChild(text);
self.addChild(subText);
self.x = positionX;
self.y = positionY;
self.interactive = true;
self.on('down', function (obj) {
self.alpha = 0.5;
onClickCallback();
});
self.on('up', function (obj) {
self.alpha = 1.0;
});
});
// BulletPack class
var BulletPack = Container.expand(function () {
var self = Container.call(this);
var bulletPackGraphics = self.attachAsset('bulletPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.move = function () {
var speedIncreaseFactor = 0.1 + LK.ticks * 0.0002;
self.y += self.speed + speedIncreaseFactor;
// Randomly change direction with a 10% chance each tick
if (Math.random() < 0.1) {
self.direction *= -1;
}
self.x += self.direction * (10 + speedIncreaseFactor);
// Keep BulletPack within game bounds
if (self.x < 0) {
self.x = 0;
self.direction *= -1;
}
if (self.x > game.width) {
self.x = game.width;
self.direction *= -1;
}
};
});
// Character class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.bulletLimit = 3; // Initialize bullet limit
self.canShoot = true; // Allow shooting initially
self.update = function () {
// Hero update logic
};
self.shoot = function () {
if (this.bulletLimit > 0 && this.canShoot && !isGamePaused) {
var bullet = new Bullet();
bullet.x = this.x;
bullet.y = this.y - this.height / 2;
heroBullets.push(bullet);
game.addChild(bullet);
this.bulletLimit--;
bulletCountTxt.setText('Bullets: ' + this.bulletLimit); // Update bullet count display
this.canShoot = false; // Set shooting cooldown
LK.setTimeout(function () {
self.canShoot = true;
}, 500); // Cooldown of 500ms before next shot
}
};
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('Bullet', {
anchorX: 0.0625,
anchorY: 0.0625
});
self.speed = -10;
self.move = function () {
self.y += self.speed;
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.move = function () {
self.y += self.speed;
var speedIncreaseFactor = 0.1 + LK.ticks * 0.0002; // Increase the speed factor over time
self.x += self.direction * (4 + speedIncreaseFactor);
// Randomly change direction with a 5% chance each tick
if (Math.random() < 0.05 || self.x < 0 || self.x > game.width) {
self.direction *= -1;
}
// Keep enemy within game bounds
if (self.x < 0) {
self.x = 0;
}
if (self.x > game.width) {
self.x = game.width;
}
self.speed += 0.02 + LK.ticks * 0.0001; // Increase speed over time with an accelerating factor
};
});
var Button = Container.expand(function (text, positionX, positionY, onClickCallback) {
var self = Container.call(this);
var buttonText = new Text2(text, {
size: 200,
fill: "#ffffff"
});
buttonText.anchor.set(0.5);
self.addChild(buttonText);
self.x = positionX;
self.y = positionY;
self.interactive = true;
self.on('down', function (obj) {
self.alpha = 0.5;
onClickCallback();
});
self.on('up', function (obj) {
self.alpha = 1.0;
});
});
// JoystickAsset class
var JoystickAsset = Container.expand(function () {
var self = Container.call(this);
self.interactive = true;
self.isDragging = false;
self.onMoveCallback = null;
self.setMoveCallback = function (callback) {
self.onMoveCallback = function (direction) {
callback({
x: direction.x,
y: 0
});
};
};
self.on('down', function (obj) {
self.isDragging = true;
});
self.on('up', function (obj) {
self.isDragging = false;
stickGraphics.x = stickOrigin.x;
stickGraphics.y = stickOrigin.y;
if (self.onMoveCallback) {
self.onMoveCallback({
x: 0,
y: 0
});
}
});
self.on('move', function (obj) {
if (self.isDragging) {
var event = obj.event;
var pos = event.getLocalPosition(self);
var dx = pos.x - stickOrigin.x;
var maxDistance = stickGraphics.width * 0.5;
if (Math.abs(dx) > maxDistance) {
dx = maxDistance * (dx > 0 ? 1 : -1);
}
stickGraphics.x = stickOrigin.x + dx;
stickGraphics.y = stickOrigin.y;
if (self.onMoveCallback) {
self.onMoveCallback({
x: dx / maxDistance,
y: 0
});
}
}
});
self.containsPoint = function (point) {
return point.x >= self.x - self.width / 2 && point.x <= self.x + self.width / 2 && point.y >= self.y - self.height / 2 && point.y <= self.y + self.height / 2;
};
});
var SettingsButton = Container.expand(function (positionX, positionY) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('help', {
anchorX: 0.5,
anchorY: 0.5
});
// Create and add the settings text to the button
var settingsText = new Text2('Help', {
size: 150,
fill: "#ffffff",
font: "Game Over"
});
settingsText.anchor.set(0.5);
self.addChild(settingsText);
self.x = positionX;
self.y = positionY;
self.interactive = true;
self.on('down', function (obj) {
self.alpha = 0.5;
});
self.on('up', function (obj) {
self.alpha = 1.0;
var settingsMenuOpen = false;
var helpMenuBackground = game.addChild(new HelpMenuBackground(game.width / 2, game.height / 2));
settingsMenuOpen = true;
// Add 'exit' asset to the settings menu
var exitButton = helpMenuBackground.addChild(LK.getAsset('exit', {
anchorX: 0.5,
anchorY: 0.5,
x: game.width / 2 - 1000,
// Move 100 pixels to the left
y: -1250
}));
exitButton.interactive = true;
exitButton.on('down', function () {
exitButton.alpha = 0.5;
});
exitButton.on('up', function () {
exitButton.alpha = 1.0;
helpMenuBackground.destroy(); // Close help menu
settingsMenuOpen = false;
});
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
title: 'gameplaypage'
});
/****
* Game Code
****/
var backgrounds = ['gameBackground', 'gamebackground2', 'gamebackground3', 'gamebackground4', 'gamebackground5', 'gamebackground6', 'gamebackground7', 'gamebackground8', 'gamebackground9', 'gamebackground10'];
var selectedBackground = backgrounds[Math.floor(Math.random() * backgrounds.length)];
var background = game.addChild(LK.getAsset(selectedBackground, {
width: game.width,
height: game.height,
x: game.width / 2,
y: game.height / 2,
anchorX: 0.5,
anchorY: 0.5
}));
var pauseMenuBackground, resumeButton, restartButton, settingsButton;
function showPauseMenu() {
if (isGamePaused) {
pauseMenuBackground = game.addChild(LK.getAsset('pauseMenuBackground', {
width: game.width,
height: game.height,
color: 0x000000,
alpha: 0.5
}));
resumeButton = game.addChild(new ResumeButton(game.width / 2, game.height / 2 - 750));
restartButton = game.addChild(new RestartButton(game.width / 2, game.height / 2 + 250));
settingsButton = game.addChild(new SettingsButton(game.width / 2, game.height / 2 - 250));
}
}
var isGamePaused = false,
settingsMenuOpen = false; // Global variables to track the pause state of the game and settings menu state
var Purchase1 = game.addChild(new PurchaseButtonWithText('purchase1', '10 Bullets for:', '50 Cosmic Credits', 200, game.height - 200, function () {
if (cosmicCredits >= 50) {
cosmicCredits -= 50;
hero.bulletLimit += 10;
bulletCountTxt.setText('Bullets: ' + hero.bulletLimit);
cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits);
}
}));
Purchase1.interactive = true;
Purchase1.on('down', function () {
Purchase1.alpha = 0.5;
if (cosmicCredits >= 50) {
cosmicCredits -= 50;
hero.bulletLimit += 10;
bulletCountTxt.setText('Bullets: ' + hero.bulletLimit);
cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits);
}
});
Purchase1.on('up', function () {
Purchase1.alpha = 1.0;
});
var purchase2 = game.addChild(new PurchaseButtonWithText('purchase2', '20 Bullets for:', '75 Cosmic Credits', game.width - 200, game.height - 200, function () {
if (cosmicCredits >= 75) {
cosmicCredits -= 75;
hero.bulletLimit += 20;
bulletCountTxt.setText('Bullets: ' + hero.bulletLimit);
cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits);
}
}));
purchase2.interactive = true;
purchase2.on('down', function () {
purchase2.alpha = 0.5;
if (cosmicCredits >= 75) {
cosmicCredits -= 75;
hero.bulletLimit += 20;
bulletCountTxt.setText('Bullets: ' + hero.bulletLimit);
cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits);
}
});
purchase2.on('up', function () {
purchase2.alpha = 1.0;
});
// Initialize important asset arrays
var heroBullets = [];
var enemies = [];
// Create character
var hero = game.addChild(new Hero());
hero.x = game.width / 2;
hero.y = game.height - 100;
var cosmicCredits = 0; // Initialize cosmic credits
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 50,
fill: "#ffffff",
font: "Game Over"
});
var cosmicCreditsTxt = new Text2('Cosmic Credits: 0', {
size: 50,
fill: "#ffffff",
font: "Game Over"
}); // New currency display
scoreTxt.anchor.set(1, 0);
cosmicCreditsTxt.anchor.set(1, 0);
cosmicCreditsTxt.y = scoreTxt.y + scoreTxt.height + 20; // Position below the score display
LK.gui.topRight.addChild(scoreTxt);
LK.gui.topRight.addChild(cosmicCreditsTxt); // Add the cosmic credits display to the GUI
// Create version display
var versionTxt = new Text2('v0.3.0 BETA', {
size: 50,
fill: "#ffffff",
font: "Game Over"
});
versionTxt.anchor.set(1, 0);
versionTxt.y = cosmicCreditsTxt.y + cosmicCreditsTxt.height + 20; // Position below the cosmic credits display
LK.gui.topRight.addChild(versionTxt); // Add the version display to the GUI
// Create bullet count display
var bulletCountTxt = new Text2('Bullets: 3', {
size: 100,
fill: "#ffffff",
font: "Game Over"
});
bulletCountTxt.anchor.set(0, 0);
bulletCountTxt.y = scoreTxt.height + 50; // Position below the score display
LK.gui.topLeft.addChild(bulletCountTxt);
// Create instructions display
var instructionsTxt = new Text2('Double tap anywhere to shoot', {
size: 50,
fill: "#ffffff",
font: "Game Over"
});
instructionsTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(instructionsTxt);
// Pause button event listener
var pauseButton = game.addChild(LK.getAsset('pause', {
x: 1000
}));
pauseButton.interactive = true;
var bulletAddedOnPause = false;
pauseButton.on('down', function () {
if (!isGamePaused && !settingsMenuOpen) {
isGamePaused = true;
pauseButton.interactive = false; // Disable the pause button
// Make the bullet closest to the hero null
var closestBullet = null;
var closestDistance = Infinity;
heroBullets.forEach(function (bullet) {
var distance = hero.y - bullet.y;
if (distance >= 0 && distance < closestDistance) {
closestDistance = distance;
closestBullet = bullet;
}
});
if (closestBullet) {
closestBullet.destroy();
heroBullets.splice(heroBullets.indexOf(closestBullet), 1);
}
showPauseMenu();
}
});
// Create a red line 3/4 down the screen
var redLine = LK.getAsset('redLine', {});
redLine.width = game.width;
redLine.height = 5;
redLine.y = game.height * 0.75;
game.addChild(redLine);
// Create joystick instance
var joystick = new JoystickAsset();
joystick.x = joystick.width / 2 + 150;
joystick.y = game.height - joystick.height / 2 - 150;
joystick.setMoveCallback(function (direction) {
hero.x = Math.max(hero.width / 2, Math.min(game.width - hero.width / 2, hero.x + direction.x * 10));
});
game.addChild(joystick);
// Handle tap on the game stage to shoot bullets, excluding buttons
var dragNode = null;
var lastTapTime = 0;
game.on('down', function (obj) {
var currentTime = Date.now();
var event = obj.event;
var pos = event.getLocalPosition(game);
// Check if the tap is not on any button or the pause button
var purchaseButtonBoundsLeft = Purchase1.getBounds();
var purchaseButtonBoundsRight = purchase2.getBounds();
var pauseButtonBounds = pauseButton.getBounds();
if (!(pos.x >= purchaseButtonBoundsLeft.x && pos.x <= purchaseButtonBoundsLeft.x + purchaseButtonBoundsLeft.width && pos.y >= purchaseButtonBoundsLeft.y && pos.y <= purchaseButtonBoundsLeft.y + purchaseButtonBoundsLeft.height || pos.x >= purchaseButtonBoundsRight.x && pos.x <= purchaseButtonBoundsRight.x + purchaseButtonBoundsRight.width && pos.y >= purchaseButtonBoundsRight.y && pos.y <= purchaseButtonBoundsRight.y + purchaseButtonBoundsRight.height || pos.x >= pauseButtonBounds.x && pos.x <= pauseButtonBounds.x + pauseButtonBounds.width && pos.y >= pauseButtonBounds.y && pos.y <= pauseButtonBounds.y + pauseButtonBounds.height) && !joystick.containsPoint(pos)) {
if (currentTime - lastTapTime < 300) {
hero.shoot();
}
lastTapTime = currentTime;
}
});
game.on('move', function (obj) {
if (isGamePaused) {
return;
}
var event = obj.event;
var pos = event.getLocalPosition(game);
hero.x = pos.x;
// hero.y = pos.y; // Removed the line that sets the hero's y position
});
// Game tick event
LK.on('tick', function () {
if (isGamePaused || settingsMenuOpen) {
return;
} // Stop updating if game is paused or settings menu is open
// Update character
hero.update();
// Move and check bullets
for (var i = heroBullets.length - 1; i >= 0; i--) {
var bullet = heroBullets[i];
bullet.move();
// Check for bullet collision with enemies and bullet packs
for (var j = enemies.length - 1; j >= 0; j--) {
if (bullet.intersects(enemies[j])) {
if (enemies[j] instanceof BulletPack) {
// If the enemy is a bullet pack
// Increment character's bullet limit by 5
hero.bulletLimit += 5;
} else {
// If the enemy is an actual enemy
// Update score and increase cosmic credits by 5
var newScore = LK.getScore() + 1;
LK.setScore(newScore);
scoreTxt.setText('Score: ' + newScore);
cosmicCredits += 5;
cosmicCreditsTxt.setText('Cosmic Credits: ' + cosmicCredits);
if (typeof localStorage !== 'undefined' && newScore > highScore) {
localStorage.setItem('highScore', newScore.toString());
}
// Increment character's bullet limit
hero.bulletLimit++;
}
bulletCountTxt.setText('Bullets: ' + hero.bulletLimit); // Update bullet count display
// Destroy enemy/bullet pack and bullet
enemies[j].destroy();
enemies.splice(j, 1);
bullet.destroy();
heroBullets.splice(i, 1);
break;
}
}
// Remove off-screen bullets and end the game if it's the last one
if (bullet.y < 0) {
bullet.destroy();
heroBullets.splice(i, 1);
if (heroBullets.length === 0 && hero.bulletLimit === 0) {
LK.showGameOver(); // End the game when the last bullet is out of frame
}
}
}
// Move enemies and check if they pass the red line
for (var k = enemies.length - 1; k >= 0; k--) {
enemies[k].move();
if (enemies[k].y > game.height * 0.75) {
enemies[k].destroy();
enemies[k] = null;
enemies.splice(k, 1);
}
}
var enemySpawnRate = 60; // Initialize enemy spawn rate
// Spawn enemies and bullet packs
if (LK.ticks % enemySpawnRate == 0) {
var enemy = new Enemy();
enemy.x = Math.random() * (game.width - enemy.width) + enemy.width / 2;
enemy.y = -enemy.height;
enemies.push(enemy);
game.addChild(enemy);
if (enemySpawnRate > 30) {
enemySpawnRate -= 0.5;
} // Decrease spawn rate over time to a minimum of 30 ticks
}
if (LK.ticks % 600 == 0) {
// Spawn a bullet pack every 600 ticks
var bulletPack = new BulletPack();
bulletPack.x = Math.random() * (game.width - bulletPack.width) + bulletPack.width / 2;
bulletPack.y = -bulletPack.height;
enemies.push(bulletPack); // Add bullet pack to enemies array for collision detection
game.addChild(bulletPack);
}
});
android. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
letter X png. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
space background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
galaxy background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
galaxy background. High quality
space background.. High contrast