User prompt
Ajusta el apartado de códigos ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz las letras más grandes y separadas ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que las letras y números estén simétricas y bonitas ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hazlo más grande
User prompt
Haz las letras y números más grandes en el apartado de códigos
User prompt
Mejora el diseño del apartado de codigos ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
En el apartado de códigos añade números del 0 al 9
User prompt
Haz que las letras en el apartado de códigos sea más grandes para que se puedan pulsar más fácilmente
User prompt
Mejora el apartado de códigos, de forma que sea simétrico y bonito ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
En el menú principal pon un apartado que se llame códigos, en el que se pueda escribir, y si pones “ZKUIT1gamesstaffmode” se te active un modo administrador durante 15 minutos en el que puedas ir a un nivel determinado ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Haz que de fondo pasen nubes y demás ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function. (In 'setTimeout(function () { __$(410); tween(game, { x: originalX }, { duration: 200, easing: tween.easeOut }); }, 600)', 'setTimeout' is undefined)' in or related to this line: 'setTimeout(function () {' Line Number: 776 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Mejora todo lo que puedas el juego ↪💡 Consider importing and using the following plugins: @upit/tween.v1, @upit/storage.v1
User prompt
Haz que el avión sea lo más realista posible
User prompt
ZK Haz que en el nivel 1 el progreso sea 5, en el nivel 2 sea 10, en el tres 15 y así sucesivamente
User prompt
Haz un menú principal, en el que ahí puedas darle a jugar y ver el leaderboard
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboard;' Line Number: 490 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Haz un leadertop en el que salga un top del 1 al 100 con las personas a las que más nivel a llegado ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Haz que el nivel 1 sea más fácil
User prompt
Haz que cuando llegue al final de un nivel haya una línea de meta, y que cuando la cruce salga un menú que en el que puedas reintentar el nivel, ir al siguiente nivel, o volver al nivel 1
User prompt
Haz que cuando pierda, no tenga que volver al nivel 1, sino no que empiece en el nivel que he perdido ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'tower.lastX')' in or related to this line: 'if (tower.lastX >= -200 && tower.x < -200) {' Line Number: 219
User prompt
Haz que el nivel 1 sea más fácil
User prompt
El avión vuelve a ir más rápido que la cámara
User prompt
Me gustaría que fuese un avión más realista y que vaya hacia delante y no de lado, también quiero que las torres sean más realistas
/**** * Plugins ****/ var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Aircraft = Container.expand(function () { var self = Container.call(this); // Main aircraft fuselage (body) var aircraftGraphics = self.attachAsset('aircraft', { anchorX: 0.5, anchorY: 0.5 }); // Main wings (positioned lower on fuselage for realism) var mainWing = self.attachAsset('aircraftWing', { anchorX: 0.5, anchorY: 0.5 }); mainWing.x = -15; mainWing.y = 0; // Aircraft tail (vertical stabilizer) var tail = self.attachAsset('aircraftTail', { anchorX: 0.5, anchorY: 0.5 }); tail.x = -60; tail.y = 0; tail.rotation = Math.PI / 2; // Vertical orientation // Horizontal stabilizer (smaller wing at tail) var horizontalStab = self.attachAsset('aircraftWing', { anchorX: 0.5, anchorY: 0.5 }); horizontalStab.x = -55; horizontalStab.y = 0; horizontalStab.scaleX = 0.4; horizontalStab.scaleY = 0.6; // Cockpit window var cockpit = self.attachAsset('aircraftCockpit', { anchorX: 0.5, anchorY: 0.5 }); cockpit.x = 35; cockpit.y = -2; // Engine nacelles under wings var leftEngine = self.attachAsset('aircraftEngine', { anchorX: 0.5, anchorY: 0.5 }); leftEngine.x = -20; leftEngine.y = 12; var rightEngine = self.attachAsset('aircraftEngine', { anchorX: 0.5, anchorY: 0.5 }); rightEngine.x = -20; rightEngine.y = -12; // Propeller at front var propeller = self.attachAsset('aircraftPropeller', { anchorX: 0.5, anchorY: 0.5 }); propeller.x = 70; propeller.y = 0; // Animate propeller rotation propeller.rotationSpeed = 0.3; self.speed = 3; self.lastY = 0; self.update = function () { // Update last position for collision detection self.lastY = self.y; // Animate propeller spinning propeller.rotation += propeller.rotationSpeed; }; return self; }); var FinishLine = Container.expand(function () { var self = Container.call(this); // Main finish line var lineGraphics = self.attachAsset('finishLine', { anchorX: 0.5, anchorY: 0.5 }); // Add flags at top and bottom for visibility var topFlag = self.attachAsset('finishFlag', { anchorX: 0.5, anchorY: 0.5 }); topFlag.y = -1300; var bottomFlag = self.attachAsset('finishFlag', { anchorX: 0.5, anchorY: 0.5 }); bottomFlag.y = 1300; self.lastX = 0; self.crossed = false; self.update = function () { // Update last position before moving self.lastX = self.x; // Move finish line from right to left var speed = Math.max(1.5, 3 - (5 - currentLevel) * 0.3); // Match tower speed self.x -= speed; }; return self; }); var Tower = Container.expand(function () { var self = Container.call(this); // Tower base var towerBase = self.attachAsset('towerBase', { anchorX: 0.5, anchorY: 0.5 }); // Tower top var towerTop = self.attachAsset('towerTop', { anchorX: 0.5, anchorY: 0.5 }); towerTop.y = -420; // Position at top of tower // Add windows to make it look more realistic for (var w = 0; w < 3; w++) { var window1 = self.attachAsset('towerWindow', { anchorX: 0.5, anchorY: 0.5 }); window1.x = -30; window1.y = -300 + w * 150; var window2 = self.attachAsset('towerWindow', { anchorX: 0.5, anchorY: 0.5 }); window2.x = 30; window2.y = -300 + w * 150; } self.lastX = 0; self.passed = false; self.update = function () { // Update last position before moving self.lastX = self.x; // Move tower from right to left (much slower for level 1) var speed = Math.max(1.5, 3 - (5 - currentLevel) * 0.3); // Very slow for level 1 self.x -= speed; }; return self; }); /**** * Initialize Game ****/ // Game variables var game = new LK.Game({ backgroundColor: 0x87CEFA // More realistic sky blue background }); /**** * Game Code ****/ // Initialize assets for the tower dodge flight game // Game variables //Storage plugin for persistent game data var aircraft; var towers = []; var finishLine = null; var showingMenu = false; var currentLevel = storage.currentLevel || 1; var levelScore = 0; var towersToComplete = 5 * currentLevel; // Level 1: 5, Level 2: 10, Level 3: 15, etc. var towerSpawnTimer = 0; var gameStarted = false; var menuContainer = null; var leaderboardContainer = null; var showingLeaderboard = false; var playerName = storage.playerName || generateRandomName(); var mainMenuContainer = null; var showingMainMenu = true; // UI Elements var levelText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); LK.gui.topLeft.addChild(levelText); levelText.x = 120; // Avoid top-left menu area levelText.y = 20; var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); var progressText = new Text2('Progress: 0/10', { size: 50, fill: 0xFFFFFF }); progressText.anchor.set(0.5, 0); LK.gui.top.addChild(progressText); progressText.y = 100; // Initialize aircraft aircraft = game.addChild(new Aircraft()); aircraft.x = 300; aircraft.y = 1366; // Center vertically aircraft.lastIntersecting = false; // Show main menu at start createMainMenu(); // Touch controls for aircraft movement var dragActive = false; game.down = function (x, y, obj) { if (showingMainMenu || showingLeaderboard || showingMenu) return; dragActive = true; }; game.up = function (x, y, obj) { if (showingMainMenu || showingLeaderboard || showingMenu) return; dragActive = false; }; game.move = function (x, y, obj) { if (showingMainMenu || showingLeaderboard || showingMenu) return; if (dragActive) { aircraft.y = y; // Keep aircraft within screen bounds if (aircraft.y < 50) aircraft.y = 50; if (aircraft.y > 2680) aircraft.y = 2680; } }; // Function to spawn tower function spawnTower() { var tower = new Tower(); tower.x = 2200; // Start from right edge // Random height position with gap for aircraft to pass var gapSize = Math.max(400, 700 - currentLevel * 40); // Much larger gap for level 1, reduce more gradually var gapPosition = Math.random() * (2732 - gapSize - 200) + 100; // Create top tower var topTower = game.addChild(new Tower()); topTower.x = tower.x; topTower.y = gapPosition / 2; topTower.lastIntersecting = false; towers.push(topTower); // Create bottom tower var bottomTower = game.addChild(new Tower()); bottomTower.x = tower.x; bottomTower.y = gapPosition + gapSize + (2732 - gapPosition - gapSize) / 2; bottomTower.lastIntersecting = false; towers.push(bottomTower); } // Function to spawn finish line function spawnFinishLine() { if (finishLine) return; // Don't spawn if already exists finishLine = game.addChild(new FinishLine()); finishLine.x = 2500; // Start further right than towers finishLine.y = 1366; // Center vertically finishLine.lastIntersecting = false; } // Function to create level completion menu function createLevelMenu() { showingMenu = true; menuContainer = new Container(); game.addChild(menuContainer); // Semi-transparent background var menuBg = LK.getAsset('towerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 8, scaleY: 2, alpha: 0.8 }); menuBg.x = 1024; menuBg.y = 1366; menuContainer.addChild(menuBg); // Title text var titleText = new Text2('Level ' + currentLevel + ' Complete!', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 1200; menuContainer.addChild(titleText); // Retry button var retryText = new Text2('Retry Level', { size: 60, fill: 0x00FF00 }); retryText.anchor.set(0.5, 0.5); retryText.x = 1024; retryText.y = 1300; retryText.interactive = true; retryText.down = function () { restartCurrentLevel(); }; menuContainer.addChild(retryText); // Next level button var nextText = new Text2('Next Level', { size: 60, fill: 0x0080FF }); nextText.anchor.set(0.5, 0.5); nextText.x = 1024; nextText.y = 1400; nextText.interactive = true; nextText.down = function () { goToNextLevel(); }; menuContainer.addChild(nextText); // Return to level 1 button var returnText = new Text2('Return to Level 1', { size: 60, fill: 0xFF8000 }); returnText.anchor.set(0.5, 0.5); returnText.x = 1024; returnText.y = 1500; returnText.interactive = true; returnText.down = function () { returnToLevel1(); }; menuContainer.addChild(returnText); // Leaderboard button var leaderboardText = new Text2('Leaderboard', { size: 60, fill: 0xFF00FF }); leaderboardText.anchor.set(0.5, 0.5); leaderboardText.x = 1024; leaderboardText.y = 1600; leaderboardText.interactive = true; leaderboardText.down = function () { showLeaderboard(); }; menuContainer.addChild(leaderboardText); } // Function to restart current level function restartCurrentLevel() { hideMenu(); levelScore = 0; // Clear existing towers and finish line clearLevel(); // Reset aircraft position aircraft.x = 300; aircraft.y = 1366; // Update UI progressText.setText('Progress: 0/' + towersToComplete); } // Function to go to next level function goToNextLevel() { hideMenu(); completeLevel(); } // Function to return to level 1 function returnToLevel1() { hideMenu(); currentLevel = 1; storage.currentLevel = 1; levelScore = 0; towersToComplete = 5 * currentLevel; // Clear existing towers and finish line clearLevel(); // Reset aircraft position aircraft.x = 300; aircraft.y = 1366; // Update UI levelText.setText('Level: ' + currentLevel); progressText.setText('Progress: 0/' + towersToComplete); } // Function to create main menu function createMainMenu() { showingMainMenu = true; mainMenuContainer = new Container(); game.addChild(mainMenuContainer); // Semi-transparent background var menuBg = LK.getAsset('towerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 10, scaleY: 4, alpha: 0.9 }); menuBg.x = 1024; menuBg.y = 1366; mainMenuContainer.addChild(menuBg); // Game title var titleText = new Text2('TOWER DODGE', { size: 120, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 800; mainMenuContainer.addChild(titleText); // Subtitle var subtitleText = new Text2('Navigate through the towers!', { size: 60, fill: 0xFFFFFF }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 1024; subtitleText.y = 950; mainMenuContainer.addChild(subtitleText); // Play button var playText = new Text2('PLAY', { size: 80, fill: 0x00FF00 }); playText.anchor.set(0.5, 0.5); playText.x = 1024; playText.y = 1200; playText.interactive = true; playText.down = function () { hideMainMenu(); startGame(); }; mainMenuContainer.addChild(playText); // Leaderboard button var leaderboardText = new Text2('LEADERBOARD', { size: 80, fill: 0xFF00FF }); leaderboardText.anchor.set(0.5, 0.5); leaderboardText.x = 1024; leaderboardText.y = 1400; leaderboardText.interactive = true; leaderboardText.down = function () { hideMainMenu(); showLeaderboard(); }; mainMenuContainer.addChild(leaderboardText); // Current level indicator var levelIndicatorText = new Text2('Continue from Level ' + currentLevel, { size: 50, fill: 0xFFFF00 }); levelIndicatorText.anchor.set(0.5, 0.5); levelIndicatorText.x = 1024; levelIndicatorText.y = 1600; mainMenuContainer.addChild(levelIndicatorText); } // Function to hide main menu function hideMainMenu() { if (mainMenuContainer) { mainMenuContainer.destroy(); mainMenuContainer = null; } showingMainMenu = false; } // Function to start game function startGame() { gameStarted = true; // Reset game state levelScore = 0; towersToComplete = 5 * currentLevel; // Clear any existing game objects clearLevel(); // Reset aircraft position aircraft.x = 300; aircraft.y = 1366; // Update UI levelText.setText('Level: ' + currentLevel); progressText.setText('Progress: 0/' + towersToComplete); scoreText.setText('Score: ' + LK.getScore()); } // Function to generate random player name function generateRandomName() { var adjectives = ['Swift', 'Brave', 'Quick', 'Sharp', 'Bold', 'Fast', 'Smart', 'Cool', 'Wild', 'Free']; var nouns = ['Pilot', 'Ace', 'Flyer', 'Eagle', 'Hawk', 'Storm', 'Wing', 'Sky', 'Star', 'Hero']; var randomAdj = adjectives[Math.floor(Math.random() * adjectives.length)]; var randomNoun = nouns[Math.floor(Math.random() * nouns.length)]; var randomNum = Math.floor(Math.random() * 999) + 1; return randomAdj + randomNoun + randomNum; } // Function to hide menu function hideMenu() { if (menuContainer) { menuContainer.destroy(); menuContainer = null; } showingMenu = false; gameStarted = true; } // Function to show leaderboard function showLeaderboard() { showingLeaderboard = true; leaderboardContainer = new Container(); game.addChild(leaderboardContainer); // Semi-transparent background var leaderboardBg = LK.getAsset('towerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 10, scaleY: 4, alpha: 0.9 }); leaderboardBg.x = 1024; leaderboardBg.y = 1366; leaderboardContainer.addChild(leaderboardBg); // Title var titleText = new Text2('LEADERBOARD - TOP 100', { size: 80, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 300; leaderboardContainer.addChild(titleText); // Get leaderboard data var leaderboardNames = storage.leaderboardNames || []; var leaderboardLevels = storage.leaderboardLevels || []; // Display top 10 entries (or all if less than 10) var displayCount = Math.min(10, leaderboardNames.length); for (var i = 0; i < displayCount; i++) { var rank = i + 1; var entryText = rank + '. ' + leaderboardNames[i] + ' - Level ' + leaderboardLevels[i]; var entryDisplay = new Text2(entryText, { size: 50, fill: i < 3 ? 0xFFD700 : 0xFFFFFF // Gold for top 3 }); entryDisplay.anchor.set(0.5, 0.5); entryDisplay.x = 1024; entryDisplay.y = 450 + i * 70; leaderboardContainer.addChild(entryDisplay); } // Show player's position if not in top 10 var playerRank = -1; for (var j = 0; j < leaderboardNames.length; j++) { if (leaderboardNames[j] === playerName) { playerRank = j + 1; break; } } if (playerRank > 10 && playerRank <= 100) { var playerEntryText = '...\n' + playerRank + '. ' + playerName + ' - Level ' + leaderboardLevels[playerRank - 1] + ' (You)'; var playerDisplay = new Text2(playerEntryText, { size: 45, fill: 0x00FF00 }); playerDisplay.anchor.set(0.5, 0.5); playerDisplay.x = 1024; playerDisplay.y = 1150; leaderboardContainer.addChild(playerDisplay); } // Close button var closeText = new Text2('Close', { size: 60, fill: 0xFF0000 }); closeText.anchor.set(0.5, 0.5); closeText.x = 1024; closeText.y = 1300; closeText.interactive = true; closeText.down = function () { hideLeaderboard(); }; leaderboardContainer.addChild(closeText); } // Function to hide leaderboard function hideLeaderboard() { if (leaderboardContainer) { leaderboardContainer.destroy(); leaderboardContainer = null; } showingLeaderboard = false; // Return to main menu if game hasn't started if (!gameStarted) { createMainMenu(); } } // Function to clear level objects function clearLevel() { // Clear existing towers for (var i = towers.length - 1; i >= 0; i--) { towers[i].destroy(); towers.splice(i, 1); } // Clear finish line if (finishLine) { finishLine.destroy(); finishLine = null; } } // Function to update leaderboard function updateLeaderboard(level) { var leaderboardNames = storage.leaderboardNames || []; var leaderboardLevels = storage.leaderboardLevels || []; // Find if player already exists in leaderboard var playerIndex = -1; for (var i = 0; i < leaderboardNames.length; i++) { if (leaderboardNames[i] === playerName) { playerIndex = i; break; } } if (playerIndex >= 0) { // Update existing player if new level is higher if (level > leaderboardLevels[playerIndex]) { leaderboardLevels[playerIndex] = level; } } else { // Add new player leaderboardNames.push(playerName); leaderboardLevels.push(level); } // Create combined array for sorting var combined = []; for (var j = 0; j < leaderboardNames.length; j++) { combined.push({ name: leaderboardNames[j], level: leaderboardLevels[j] }); } // Sort by level (highest first) combined.sort(function (a, b) { return b.level - a.level; }); // Keep only top 100 if (combined.length > 100) { combined = combined.slice(0, 100); } // Split back into separate arrays leaderboardNames = []; leaderboardLevels = []; for (var k = 0; k < combined.length; k++) { leaderboardNames.push(combined[k].name); leaderboardLevels.push(combined[k].level); } storage.leaderboardNames = leaderboardNames; storage.leaderboardLevels = leaderboardLevels; storage.playerName = playerName; } // Function to complete level function completeLevel() { currentLevel++; // Update leaderboard with new level updateLeaderboard(currentLevel); // Save progress to storage storage.currentLevel = currentLevel; levelScore = 0; towersToComplete = 5 * currentLevel; // Level 1: 5, Level 2: 10, Level 3: 15, etc. // Clear existing towers and finish line clearLevel(); // Reset aircraft position aircraft.x = 300; aircraft.y = 1366; // Update UI levelText.setText('Level: ' + currentLevel); progressText.setText('Progress: 0/' + towersToComplete); // Flash screen green for level completion LK.effects.flashScreen(0x00ff00, 1000); } // Function to handle game over function gameOver() { // Update leaderboard with current level reached updateLeaderboard(currentLevel); // Save current level to storage so player can restart from this level storage.currentLevel = currentLevel; LK.effects.flashScreen(0xff0000, 1000); LK.getSound('crash').play(); LK.showGameOver(); } // Main game update loop game.update = function () { if (!gameStarted || showingMenu || showingLeaderboard || showingMainMenu) return; // Spawn towers based on level difficulty var spawnRate = Math.max(120, 300 - currentLevel * 20); // Much slower spawning for level 1 if (LK.ticks % spawnRate === 0) { spawnTower(); } // Check if we should spawn finish line var progress = Math.floor(levelScore / 2); if (progress >= towersToComplete && !finishLine) { spawnFinishLine(); } // Update finish line if (finishLine) { // Check if finish line went off screen if (finishLine.lastX >= -200 && finishLine.x < -200) { finishLine.destroy(); finishLine = null; } // Check if aircraft crossed finish line if (!finishLine.crossed && finishLine.x < aircraft.x) { finishLine.crossed = true; createLevelMenu(); return; } } // Update towers for (var i = towers.length - 1; i >= 0; i--) { var tower = towers[i]; // Check if tower went off screen if (tower.lastX >= -200 && tower.x < -200) { tower.destroy(); towers.splice(i, 1); continue; } // Check collision with aircraft var currentIntersecting = aircraft.intersects(tower); if (!tower.lastIntersecting && currentIntersecting) { gameOver(); return; } tower.lastIntersecting = currentIntersecting; // Check if aircraft passed tower (score point) if (!tower.passed && tower.x < aircraft.x - 100) { tower.passed = true; levelScore++; LK.setScore(LK.getScore() + 10 * currentLevel); // More points per level LK.getSound('dodge').play(); // Update progress var progress = Math.floor(levelScore / 2); // Two towers per obstacle progressText.setText('Progress: ' + progress + '/' + towersToComplete); scoreText.setText('Score: ' + LK.getScore()); } } // Aircraft stays stationary while towers move to create forward movement illusion };
===================================================================
--- original.js
+++ change.js
@@ -7,40 +7,73 @@
* Classes
****/
var Aircraft = Container.expand(function () {
var self = Container.call(this);
- // Main aircraft body
+ // Main aircraft fuselage (body)
var aircraftGraphics = self.attachAsset('aircraft', {
anchorX: 0.5,
anchorY: 0.5
});
- // Aircraft wings
- var leftWing = self.attachAsset('aircraftWing', {
+ // Main wings (positioned lower on fuselage for realism)
+ var mainWing = self.attachAsset('aircraftWing', {
anchorX: 0.5,
anchorY: 0.5
});
- leftWing.x = -10;
- leftWing.y = 8;
- leftWing.rotation = -0.2;
- var rightWing = self.attachAsset('aircraftWing', {
+ mainWing.x = -15;
+ mainWing.y = 0;
+ // Aircraft tail (vertical stabilizer)
+ var tail = self.attachAsset('aircraftTail', {
anchorX: 0.5,
anchorY: 0.5
});
- rightWing.x = -10;
- rightWing.y = -8;
- rightWing.rotation = 0.2;
- // Aircraft tail
- var tail = self.attachAsset('aircraftTail', {
+ tail.x = -60;
+ tail.y = 0;
+ tail.rotation = Math.PI / 2; // Vertical orientation
+ // Horizontal stabilizer (smaller wing at tail)
+ var horizontalStab = self.attachAsset('aircraftWing', {
anchorX: 0.5,
anchorY: 0.5
});
- tail.x = -45;
- tail.y = 0;
+ horizontalStab.x = -55;
+ horizontalStab.y = 0;
+ horizontalStab.scaleX = 0.4;
+ horizontalStab.scaleY = 0.6;
+ // Cockpit window
+ var cockpit = self.attachAsset('aircraftCockpit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ cockpit.x = 35;
+ cockpit.y = -2;
+ // Engine nacelles under wings
+ var leftEngine = self.attachAsset('aircraftEngine', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ leftEngine.x = -20;
+ leftEngine.y = 12;
+ var rightEngine = self.attachAsset('aircraftEngine', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ rightEngine.x = -20;
+ rightEngine.y = -12;
+ // Propeller at front
+ var propeller = self.attachAsset('aircraftPropeller', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ propeller.x = 70;
+ propeller.y = 0;
+ // Animate propeller rotation
+ propeller.rotationSpeed = 0.3;
self.speed = 3;
self.lastY = 0;
self.update = function () {
// Update last position for collision detection
self.lastY = self.y;
+ // Animate propeller spinning
+ propeller.rotation += propeller.rotationSpeed;
};
return self;
});
var FinishLine = Container.expand(function () {