User prompt
Ok when you lose in the game you keep the coins
User prompt
So if you reload the game your coins should reset to 0
User prompt
When you start game set coins to 0 I don't mean the shooter game I mean when you start playing this game
User prompt
Make sure when we start the game make sure to reset are coins so we can have a fresh play to collect coins
User prompt
Make sure not to show coins in shooter game
User prompt
When it is game over make sure we still keep are coins ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
When shop button is pressed show the score
User prompt
Let the enemy's shoot but have the enemy's spawn slower
User prompt
Make it mobile
User prompt
Fix mouse pointer bug
User prompt
Make it so it follows your mouse pointer
User prompt
Make the shooting faster
User prompt
When play button pressed start shooter game
User prompt
Fix te play bug it doesn't start the shooter game
User prompt
Make sure when play button pressed start shooter game
User prompt
Please fix the bug: 'Uncaught ReferenceError: startShooterGame is not defined' in or related to this line: 'startShooterGame();' Line Number: 427
User prompt
When the play button is pressed play a shooter game
User prompt
Make the prices higher
User prompt
Make the price for the skins
User prompt
Please fix the bug: 'Uncaught ReferenceError: skin1 is not defined' in or related to this line: 'skin1.alpha = 0;' Line Number: 311
User prompt
Whenever skin button is pressed show the buttons "blue
User prompt
When skin button open show the skins for the shooter.
User prompt
When shop is open open the shop with the buttons 'skins" "upgrades" and "back to menu"
User prompt
Make sure the play button is at the top ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var MenuButton = Container.expand(function (label, yPos) { var self = Container.call(this); // Button background var buttonBg = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5 }); // Button highlight (initially invisible) var highlight = self.attachAsset('buttonHighlight', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); // Button text var text = new Text2(label, { size: 70, fill: 0xFFFFFF }); text.anchor.set(0.5, 0.5); self.addChild(text); // Set position self.y = yPos; // Event handlers self.down = function (x, y, obj) { // Scale down effect tween(buttonBg, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100, easing: tween.easeOut }); // Play sound LK.getSound('buttonClick').play(); }; self.up = function (x, y, obj) { // Scale back to normal tween(buttonBg, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeOut }); // Handle button action if (label === "Shop") { showShopView(); } else if (label === "Play") { showPlayView(); } else if (label === "Settings") { showSettingsView(); } }; // Hover effect methods self.showHighlight = function () { tween(highlight, { alpha: 0.3 }, { duration: 200, easing: tween.easeOut }); }; self.hideHighlight = function () { tween(highlight, { alpha: 0 }, { duration: 200, easing: tween.easeOut }); }; // Function to set the button text self.setLabel = function (newLabel) { text.setText(newLabel); }; return self; }); var MenuView = Container.expand(function () { var self = Container.call(this); // Background panel var background = self.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5 }); // Title text var titleText = new Text2("Game Menu", { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -600; self.addChild(titleText); // Buttons var playButton = new MenuButton("Play", -250); var shopButton = new MenuButton("Shop", 0); var settingsButton = new MenuButton("Settings", 250); self.addChild(shopButton); self.addChild(playButton); self.addChild(settingsButton); // Hover tracking var hoveredButton = null; // Track mouse movement for hover effects self.move = function (x, y, obj) { var localPos = { x: x, y: y }; // Clear previous hover state if (hoveredButton) { hoveredButton.hideHighlight(); hoveredButton = null; } // Check if hovering over any button if (playButton.getBounds().contains(localPos.x, localPos.y)) { playButton.showHighlight(); hoveredButton = playButton; } else if (shopButton.getBounds().contains(localPos.x, localPos.y)) { shopButton.showHighlight(); hoveredButton = shopButton; } else if (settingsButton.getBounds().contains(localPos.x, localPos.y)) { settingsButton.showHighlight(); hoveredButton = settingsButton; } }; // Animation for showing the menu self.animateIn = function () { // Initial state background.alpha = 0; titleText.alpha = 0; shopButton.alpha = 0; playButton.alpha = 0; settingsButton.alpha = 0; // Background fade in tween(background, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); // Title slide down titleText.y = -800; tween(titleText, { alpha: 1, y: -600 }, { duration: 700, easing: tween.easeOut }); // Buttons fade in sequence LK.setTimeout(function () { tween(playButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 200); LK.setTimeout(function () { tween(shopButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 350); LK.setTimeout(function () { tween(settingsButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 500); }; return self; }); var ShooterGame = Container.expand(function () { var self = Container.call(this); // Game elements var player = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 100, height: 100, tint: 0xff0000 }); // Position player at bottom center player.x = 0; player.y = 500; // Score display var scoreText = new Text2("Score: 0", { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); scoreText.x = 0; scoreText.y = -650; self.addChild(scoreText); // Game variables // Reset coins to 0 at game start for fresh play experience storage.coins = 0; var score = 0; var bullets = []; var enemies = []; var enemyBullets = []; // Array to track enemy bullets // Player control - optimized for mobile touch self.move = function (x, y, obj) { // Convert global position to local position // Clamp player position within screen bounds to prevent going off-screen player.x = Math.max(-900, Math.min(900, x)); // Limit horizontal movement }; // Shoot function - optimized for mobile function shoot() { // Don't create too many bullets on mobile if (bullets.length > 80) { // Remove oldest bullets if we have too many (mobile optimization) var bulletsToRemove = bullets.length - 80; for (var i = 0; i < bulletsToRemove; i++) { if (bullets[i]) { bullets[i].destroy(); } } bullets.splice(0, bulletsToRemove); } var bullet = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 30, // Slightly larger for better visibility on mobile height: 50, tint: 0xffff00 }); bullet.x = player.x; bullet.y = player.y - 50; bullet.speed = -20; // Fast upward speed self.addChild(bullet); bullets.push(bullet); LK.getSound('buttonClick').play(); } // Player shooting - optimized for mobile touch self.down = function (x, y, obj) { // On mobile, we want to ensure the player can still shoot even if they tap slightly away from ship var touchDistance = Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2)); if (touchDistance < 150) { // Larger touch area for mobile shoot(); } else { // If they tap elsewhere, move the player there and shoot player.x = x; shoot(); } }; // Main game loop - optimized for mobile self.update = function () { // Auto shooting (adjust fire rate for mobile - slightly slower to prevent lag) if (LK.ticks % 15 === 0) { // Fire every 15 ticks instead of 10 for better mobile performance shoot(); } // Update bullets - with limit for mobile performance // Only process a maximum of 50 bullets at once to prevent performance issues var bulletProcessLimit = Math.min(bullets.length, 50); for (var i = bulletProcessLimit - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.y += bullet.speed; // Remove bullets that go off screen if (bullet.y < -700) { bullet.destroy(); bullets.splice(i, 1); } } // Create enemies randomly - reduced rate for mobile if (Math.random() < 0.008) { // Reduced spawn rate further // Reduced spawn rate for mobile performance var enemy = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 80, height: 80, tint: 0x00ff00 }); enemy.x = Math.random() * 1000 - 500; // Random position enemy.y = -700; // Start from top enemy.speed = 3; // Move downward enemy.lastShot = LK.ticks; // Track last shot time self.addChild(enemy); enemies.push(enemy); } // Update enemies - with limit for mobile performance // Only process a maximum of 30 enemies at once to prevent performance issues var enemyProcessLimit = Math.min(enemies.length, 30); for (var j = enemyProcessLimit - 1; j >= 0; j--) { var enemy = enemies[j]; enemy.y += enemy.speed; // Enemy shooting logic if (LK.ticks - enemy.lastShot > 90) { // Shoot every ~1.5 seconds // Create enemy bullet var enemyBullet = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 20, height: 40, tint: 0xff0088 }); enemyBullet.x = enemy.x; enemyBullet.y = enemy.y + 50; enemyBullet.speed = 8; // Downward speed self.addChild(enemyBullet); enemyBullets.push(enemyBullet); enemy.lastShot = LK.ticks; } // Check collision with bullets - optimized for mobile var hitDetected = false; for (var k = 0; k < bullets.length && !hitDetected; k++) { if (enemy.intersects(bullets[k])) { // Increase score score += 10; // Update coins in storage storage.coins = (storage.coins || 0) + 10; scoreText.setText("Score: " + score); // Remove bullet and enemy bullets[k].destroy(); bullets.splice(k, 1); enemy.destroy(); enemies.splice(j, 1); hitDetected = true; break; } } // Skip rest of processing if enemy was destroyed if (hitDetected) { continue; } // Remove enemies that go off screen if (enemy.y > 700) { enemy.destroy(); enemies.splice(j, 1); } } // Update enemy bullets for (var m = enemyBullets.length - 1; m >= 0; m--) { var enemyBullet = enemyBullets[m]; enemyBullet.y += enemyBullet.speed; // Check collision with player if (enemyBullet.intersects(player)) { // Player hit - ensure coins are saved before game over storage.coins = storage.coins || 0; // Player hit - game over LK.showGameOver(); enemyBullet.destroy(); enemyBullets.splice(m, 1); continue; } // Remove bullets that go off screen if (enemyBullet.y > 700) { enemyBullet.destroy(); enemyBullets.splice(m, 1); } } }; return self; }); var ShopView = Container.expand(function () { var self = Container.call(this); // Background panel var background = self.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5 }); // Title text var titleText = new Text2("Shop", { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -600; self.addChild(titleText); // Buttons var skinsButton = new MenuButton("Skins", -250); var upgradesButton = new MenuButton("Upgrades", 0); var backButton = new MenuButton("Back to Menu", 250); self.addChild(skinsButton); self.addChild(upgradesButton); self.addChild(backButton); // Button actions skinsButton.up = function (x, y, obj) { // Open skins view showSkinsView(); }; backButton.up = function (x, y, obj) { // Return to main menu showMainMenu(); }; // Animation for showing the shop self.animateIn = function () { // Initial state background.alpha = 0; titleText.alpha = 0; skinsButton.alpha = 0; upgradesButton.alpha = 0; backButton.alpha = 0; // Background fade in tween(background, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); // Title slide down titleText.y = -800; tween(titleText, { alpha: 1, y: -600 }, { duration: 700, easing: tween.easeOut }); // Buttons fade in sequence LK.setTimeout(function () { tween(skinsButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 200); LK.setTimeout(function () { tween(upgradesButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 350); LK.setTimeout(function () { tween(backButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 500); }; return self; }); var SkinsView = Container.expand(function () { var self = Container.call(this); // Background panel var background = self.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5 }); // Title text var titleText = new Text2("Skins", { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -600; self.addChild(titleText); // Skins display (example skins) var skin1 = new MenuButton("Blue - $10", -250); var skin2 = new MenuButton("Red - $14", 0); var greenButton = new MenuButton("Green - $12", 250); self.addChild(skin1); self.addChild(skin2); self.addChild(greenButton); var backButton = new MenuButton("Back to Shop", 250); self.addChild(backButton); // Button actions backButton.up = function (x, y, obj) { // Return to shop view showShopView(); }; // Animation for showing the skins self.animateIn = function () { // Initial state background.alpha = 0; titleText.alpha = 0; skin1.alpha = 0; skin2.alpha = 0; backButton.alpha = 0; // Background fade in tween(background, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); // Title slide down titleText.y = -800; tween(titleText, { alpha: 1, y: -600 }, { duration: 700, easing: tween.easeOut }); // Skins fade in sequence LK.setTimeout(function () { tween(skin1, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 200); LK.setTimeout(function () { tween(skin2, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 350); LK.setTimeout(function () { tween(backButton, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); }, 500); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ function showSkinsView() { if (currentView === "skins") { return; } // Destroy current view and create skins view if (currentView === "shop") { shopView.destroy(); } skinsView = new SkinsView(); skinsView.x = 2048 / 2; skinsView.y = 2732 / 2; game.addChild(skinsView); skinsView.animateIn(); currentView = "skins"; } function showMainMenu() { if (currentView === "main") { return; } // Destroy current view and create main menu if (currentView === "shop") { shopView.destroy(); } createMainMenu(); currentView = "main"; } // Main elements var mainMenu; var currentView = "main"; // Track which view is currently shown // Create the main menu function createMainMenu() { mainMenu = new MenuView(); mainMenu.x = 2048 / 2; mainMenu.y = 2732 / 2; game.addChild(mainMenu); mainMenu.animateIn(); } // Show functions for different views function showShopView() { if (currentView === "shop") { return; } // Destroy current view and create shop view if (currentView === "main") { mainMenu.destroy(); } shopView = new ShopView(); shopView.x = 2048 / 2; shopView.y = 2732 / 2; game.addChild(shopView); shopView.animateIn(); // Add coins display to shop view from persistent storage var scoreDisplay = new Text2("Your Coins: " + (storage.coins || 0), { size: 60, fill: 0xFFFFFF }); scoreDisplay.anchor.set(0.5, 0.5); scoreDisplay.x = 0; scoreDisplay.y = -400; shopView.addChild(scoreDisplay); currentView = "shop"; } function showPlayView() { if (currentView === "play") { return; } // Destroy current view if (currentView === "main") { mainMenu.destroy(); } else if (currentView === "shop") { shopView.destroy(); } else if (currentView === "skins") { skinsView.destroy(); } // Create and start the shooter game function startShooterGame() { // Initialize the shooter game - with mobile optimizations var shooterGame = new ShooterGame(); shooterGame.x = 2048 / 2; shooterGame.y = 2732 / 2; game.addChild(shooterGame); // Add mobile-specific instructions var instructionText = new Text2("Tap to shoot\nDrag to move", { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 0; instructionText.y = 300; shooterGame.addChild(instructionText); // Fade out instructions after 3 seconds LK.setTimeout(function () { tween(instructionText, { alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { instructionText.destroy(); } }); }, 3000); console.log("Shooter game started!"); } // Start the shooter game startShooterGame(); currentView = "play"; } function showSettingsView() { if (currentView === "settings") { return; } // Simple feedback for now - in a real game, this would show settings menu var notification = new Text2("Opening Settings...", { size: 70, fill: 0xFFFFFF }); notification.anchor.set(0.5, 0.5); notification.x = 2048 / 2; notification.y = 2732 - 300; notification.alpha = 0; game.addChild(notification); tween(notification, { alpha: 1 }, { duration: 300, easing: tween.linear, onFinish: function onFinish() { LK.setTimeout(function () { tween(notification, { alpha: 0 }, { duration: 300, easing: tween.linear, onFinish: function onFinish() { notification.destroy(); } }); }, 1500); } }); currentView = "settings"; } // Game events game.down = function (x, y, obj) { // Global down event if needed }; game.up = function (x, y, obj) { // Global up event if needed }; game.move = function (x, y, obj) { // Pass touch/mouse movement to active view based on current state // For mobile: Add check to ensure we have valid obj if (!obj || !obj.event) { return; } // Normalize touch events for mobile if (currentView === "play" && game.getChildAt(0) instanceof ShooterGame) { // Calculate position relative to game center for consistent mobile experience var gameX = x - 2048 / 2; var gameY = y - 2732 / 2; // Pass the normalized coordinates game.getChildAt(0).move(gameX, gameY, obj); } }; // Reset coins to 0 when starting the game storage.coins = 0; // Initialize game createMainMenu(); // Play background music LK.playMusic('menuMusic', { fade: { start: 0, end: 0.7, duration: 1000 } }); // Main game loop game.update = function () { // Any continuous updates can go here // For a menu, we don't need much in the update loop };
===================================================================
--- original.js
+++ change.js
@@ -709,8 +709,10 @@
// Pass the normalized coordinates
game.getChildAt(0).move(gameX, gameY, obj);
}
};
+// Reset coins to 0 when starting the game
+storage.coins = 0;
// Initialize game
createMainMenu();
// Play background music
LK.playMusic('menuMusic', {