User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'to')' in or related to this line: 'tween(explosionAsset).to({' Line Number: 121
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(explosionAsset, {' Line Number: 121
User prompt
Please fix the bug: 'TypeError: tween.create is not a function' in or related to this line: 'tween.create(explosionAsset).to({' Line Number: 121
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(explosionAsset, {' Line Number: 121
User prompt
Düşman için patlama asset. Sağlık kutusu icin de patlama asset ekle
User prompt
Mermi daha sık gözüksün
User prompt
Arkaplanı tekrar ekle
User prompt
Arkaplanı test için kaldır
User prompt
Yardımcı cızgi ve mermiler arkaplanın onunde gözükecek
User prompt
Yardımci çizgi arkaplanin önünde olsun.
User prompt
Düşman zirha çarparak ölürse skor artsin.
User prompt
Sağlık kutusu vurmada skor artmasın.
User prompt
Health box vurulunca skora ekleme
User prompt
Dokunduğumuz noktaya yardimcı cizgi ciz
User prompt
Sağlık kutusu tek vurmada yok olsun. Farklı durumları iyileştir.
User prompt
Can tek vurmada yok olsun.
User prompt
Yardımcı çizgileri kaldır.
User prompt
Yardımcı çizgileri iyileştir
User prompt
Yardımcı çizgileri ciz
User prompt
Health barlar sağdan sola azalsin
User prompt
Kodları iyileştir.
User prompt
Yardımcı çizgileri daha sık ve belirgin yap.
User prompt
Yardımcı çizgiler gözükmüyor
User prompt
Dokunmayla yardımcı cızgiler gözükecek.
User prompt
Yardımci cizgiler gözükecek.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // --- Bullet Class --- var Bullet = Container.expand(function () { var self = Container.call(this); // Attach bullet asset (white ellipse) var bulletAsset = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); // Bullet speed (pixels per frame) self.speed = 160; // Direction in radians (set on creation) self.direction = 0; // Damage dealt by this bullet self.damage = 1; // Defensive: track last position for possible future use self.lastX = self.x; self.lastY = self.y; // Update method called every tick self.update = function () { self.lastX = self.x; self.lastY = self.y; self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; }; return self; }); // --- Enemy Class --- var Enemy = Container.expand(function () { var self = Container.call(this); // Attach enemy asset (pink ellipse), scaled up 2x var enemyAsset = self.attachAsset('enemyCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); // Enemy properties self.radius = 60 + Math.random() * 40; // for spawn distance self.speed = 1.15 + Math.random() * 0.55; // even faster approach self.maxHp = 3; // always 3 HP self.hp = self.maxHp; // Direction towards center (set on spawn) self.direction = 0; // Health bar (white background, green foreground), both rectangles, above the enemy self.hpBarBg = self.addChild(LK.getAsset('hpbar_bg', { anchorX: 0.5, anchorY: 1.0, y: -140 // higher above the enemy })); self.hpBar = self.addChild(LK.getAsset('hpbar_fg', { anchorX: 0.5, anchorY: 1.0, y: -140 // match background bar position })); // Defensive: track last position for possible future use self.lastX = self.x; self.lastY = self.y; // Update health bar width self.updateHpBar = function () { // Use asset width for scaling, so health bar always matches background self.hpBar.width = self.hpBarBg.width * (self.hp / self.maxHp); self.hpBar.x = self.hpBarBg.x - (self.hpBarBg.width - self.hpBar.width) / 2; }; // Update method called every tick self.update = function () { self.lastX = self.x; self.lastY = self.y; self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; }; // Take damage self.takeDamage = function (amount) { self.hp -= amount; if (self.hp < 0) self.hp = 0; self.updateHpBar(); }; // On death self.die = function () { // Flash effect LK.effects.flashObject(self, 0xffffff, 200); // Particle explosion (intense red, gravity-free) // More and bigger particles, even more red! for (var i = 0; i < 38; i++) { var p = new Container(); var asset = p.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5, // Make particles much bigger overall scaleX: 1.1 + Math.random() * 0.8, scaleY: 1.1 + Math.random() * 0.8, // Use a deeper, more saturated red color: 0xff0000, alpha: 0.82 + Math.random() * 0.18 }); p.x = self.x; p.y = self.y; var angle = Math.random() * Math.PI * 2; var speed = 22 + Math.random() * 20; var life = 26 + Math.floor(Math.random() * 18); p.update = function (a, s, l) { var vx = Math.cos(a) * s; var vy = Math.sin(a) * s; var ticks = 0; return function () { this.x += vx; this.y += vy; vx *= 0.88; vy *= 0.88; this.alpha *= 0.93; ticks++; if (ticks > l) { this.destroy(); } }; }(angle, speed, life); game.addChild(p); // Add to update loop if (!game._enemyParticles) game._enemyParticles = []; game._enemyParticles.push(p); } }; // Initialize health bar self.updateHpBar(); return self; }); // --- HealthBox Class --- var HealthBox = Container.expand(function () { var self = Container.call(this); // Attach health asset (red box), scaled up 1.5x var asset = self.attachAsset('healthBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); self.radius = 60 + Math.random() * 40; self.speed = 0.32 + Math.random() * 0.16; // even faster movement self.maxHp = 1; self.hp = self.maxHp; self.direction = 0; // Defensive: track last position self.lastX = self.x; self.lastY = self.y; // Update method self.update = function () { self.lastX = self.x; self.lastY = self.y; self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; }; // Take damage self.takeDamage = function (amount) { self.hp -= amount; if (self.hp < 0) self.hp = 0; }; // On death self.die = function () { LK.effects.flashObject(self, 0xffffff, 200); // Particle effect (white explosion) for (var i = 0; i < 18; i++) { var p = new Container(); var asset = p.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.9 + Math.random() * 0.7, scaleY: 0.9 + Math.random() * 0.7, color: 0xffffff, alpha: 0.8 + Math.random() * 0.15 }); p.x = self.x; p.y = self.y; var angle = Math.random() * Math.PI * 2; var speed = 12 + Math.random() * 10; var life = 16 + Math.floor(Math.random() * 10); p.update = function (a, s, l) { var vx = Math.cos(a) * s; var vy = Math.sin(a) * s; var ticks = 0; return function () { this.x += vx; this.y += vy; vx *= 0.88; vy *= 0.88; this.alpha *= 0.91; ticks++; if (ticks > l) { this.destroy(); } }; }(angle, speed, life); game.addChild(p); if (!game._enemyParticles) game._enemyParticles = []; game._enemyParticles.push(p); } }; return self; }); // --- Player Class --- var Player = Container.expand(function () { var self = Container.call(this); // Attach player asset (blue ellipse), scaled up 2x var playerAsset = self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); // Player properties self.radius = 0; // always at center self.rotation = 0; // radians self.maxHp = 5; self.hp = self.maxHp; // Health bar (red background, green foreground) - always on top, not rotating self.hpBarBg = LK.getAsset('hpbar_bg', { anchorX: 0.5, anchorY: 0.5, y: -140 }); self.hpBar = LK.getAsset('hpbar_fg', { anchorX: 0.5, anchorY: 0.5, y: -140 }); // Defensive: track last position for possible future use self.lastX = self.x; self.lastY = self.y; // Update health bar width self.updateHpBar = function () { // Use asset width for scaling, so health bar always matches background self.hpBar.width = self.hpBarBg.width * (self.hp / self.maxHp); self.hpBar.x = self.hpBarBg.x - (self.hpBarBg.width - self.hpBar.width) / 2; }; // Take damage self.takeDamage = function (amount) { self.hp -= amount; if (self.hp < 0) self.hp = 0; self.updateHpBar(); }; // On death self.die = function () { LK.effects.flashObject(self, 0xff0000, 500); }; // Initialize health bar self.updateHpBar(); return self; }); // --- Shield Layer Class --- var ShieldLayer = Container.expand(function () { var self = Container.call(this); // Properties self.radius = 0; // distance from player center self.maxHp = 3; self.hp = self.maxHp; self.index = 0; // 0=innermost, 2=outermost self.active = true; // Visual: use ellipse for shield self.shieldAsset = self.attachAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, alpha: 0.25 + 0.15 * self.index // more visible for outer shields }); // Health bar above shield self.hpBarBg = self.addChild(LK.getAsset('hpbar_bg', { anchorX: 0.5, anchorY: 0.5, y: -self.radius - 120 })); self.hpBar = self.addChild(LK.getAsset('hpbar_fg', { anchorX: 0.5, anchorY: 0.5, y: -self.radius - 120 })); // Defensive: track last position for possible future use self.lastX = self.x; self.lastY = self.y; // Update health bar width self.updateHpBar = function () { // Use asset width for scaling, so health bar always matches background self.hpBar.width = self.hpBarBg.width * (self.hp / self.maxHp); self.hpBar.x = self.hpBarBg.x - (self.hpBarBg.width - self.hpBar.width) / 2; self.hpBar.visible = self.active; self.hpBarBg.visible = self.active; }; // Take damage self.takeDamage = function (amount) { if (!self.active) return; self.hp -= amount; if (self.hp < 0) self.hp = 0; self.updateHpBar(); if (self.hp <= 0) { // Play shield explosion sound LK.getSound('shieldExplode').play(); self.active = false; self.visible = false; self.hpBar.visible = false; self.hpBarBg.visible = false; } }; // Reset shield self.reset = function () { self.hp = self.maxHp; self.active = true; self.visible = true; self.updateHpBar(); }; // Initialize self.updateHpBar(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // --- Background Image --- // Health bar assets for bg/fg var backgroundImg = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, scaleX: 2048 / 4096, scaleY: 2732 / 4096, x: 2048 / 2, y: 2732 / 2 }); game.addChild(backgroundImg); // --- Global Variables --- var player; var enemies = []; var bullets = []; var spawnTimer = 0; var fireCooldown = 0; var dragActive = false; var lastTouchAngle = 0; // --- Player Aim Dots & Helper Lines --- // We'll use 40 dots, spaced much closer, and more visible (higher alpha, larger size) var aimDots = []; var aimDotCount = 40; var aimDotSpacing = 32; // px between dots (closer together) for (var i = 1; i <= aimDotCount; i++) { // Fade out less, more visible, and slightly larger var alpha = 0.32 + 0.48 * (1 - i / aimDotCount); // 0.8 (near) to 0.32 (far) var dot = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.44, scaleY: 0.44, alpha: alpha }); dot.visible = true; aimDots.push(dot); } // --- Helper Lines for Aim Direction --- // Draw 3 visible helper lines for player aim direction, with a central highlight var aimLines = []; var aimLineCount = 3; var aimLineLength = 400; for (var i = 0; i < aimLineCount; i++) { // Center line is brighter and thinner, side lines are fainter and wider var isCenter = i === 1; var line = LK.getAsset('hpbar_fg', { anchorX: 0.0, anchorY: 0.5, scaleX: 1.0, scaleY: isCenter ? 0.12 : 0.18, alpha: isCenter ? 0.7 : 0.28, rotation: 0 }); line.width = aimLineLength; line.height = isCenter ? 7 : 10 + (i === 0 ? 0 : 4); line.visible = true; // For the center line, tint to a light blue for highlight if (isCenter) line.tint = 0x66ccff; aimLines.push(line); } // --- Score Display --- var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // --- Player Initialization --- player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Add player health bar to game (not as child of player, so it doesn't rotate) game.addChild(player.hpBarBg); game.addChild(player.hpBar); // Add aim dots to game (not as child of player, so they don't rotate with player asset) for (var i = 0; i < aimDots.length; i++) { game.addChild(aimDots[i]); } // Add aim helper lines to game (not as child of player, so they don't rotate with player asset) for (var i = 0; i < aimLines.length; i++) { game.addChild(aimLines[i]); } // Position health bar above player player.hpBarBg.x = player.x; player.hpBarBg.y = player.y - 160; player.hpBar.x = player.x; player.hpBar.y = player.y - 160; // --- Shield Layers Initialization --- var shieldLayers = []; var shieldRadii = [180 * 1.5, 260 * 1.5, 340 * 1.5]; // innermost to outermost, 1.5x larger for (var i = 0; i < 3; i++) { var shield = new ShieldLayer(); shield.index = i; shield.radius = shieldRadii[i]; // Scale shield asset to match radius var asset = shield.shieldAsset; var baseSize = asset.width; // asset is 100x100 var scale = shield.radius * 2 / baseSize; asset.scaleX = scale; asset.scaleY = scale; // Position shield at player center shield.x = player.x; shield.y = player.y; // Defensive: initialize lastX/lastY shield.lastX = shield.x; shield.lastY = shield.y; // Move health bar above shield shield.hpBarBg.y = -shield.radius - 120; shield.hpBar.y = -shield.radius - 120; game.addChild(shield); shieldLayers.push(shield); } // --- Helper: Get angle from center to (x, y) --- function getAngleToCenter(x, y) { var cx = 2048 / 2; var cy = 2732 / 2; return Math.atan2(y - cy, x - cx); } // --- Helper: Fire Bullet --- function fireBullet(angle) { if (fireCooldown > 0) return; var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; bullet.direction = angle; // Defensive: initialize lastX/lastY bullet.lastX = bullet.x; bullet.lastY = bullet.y; bullets.push(bullet); game.addChild(bullet); fireCooldown = 10; // frames // Play shoot sound LK.getSound('shoot').play(); } // --- Handle Touch/Drag to Rotate Player --- game.down = function (x, y, obj) { dragActive = true; var angle = getAngleToCenter(x, y); lastTouchAngle = angle; // Instantly rotate player to this angle player.rotation = angle; }; game.move = function (x, y, obj) { if (dragActive) { var angle = getAngleToCenter(x, y); player.rotation = angle; lastTouchAngle = angle; } }; game.up = function (x, y, obj) { dragActive = false; // Fire bullet in the direction player is facing fireBullet(player.rotation); // After firing, reset player rotation to upright (0 radians) player.rotation = 0; }; // --- Enemy Spawning --- function spawnEnemy() { var angle = Math.random() * Math.PI * 2; var distance = 1100 + Math.random() * 400; var ex = 2048 / 2 + Math.cos(angle) * distance; var ey = 2732 / 2 + Math.sin(angle) * distance; // 1 in 5 chance to spawn a health box instead of enemy (increased frequency) if (Math.random() < 0.2) { var healthBox = new HealthBox(); healthBox.x = ex; healthBox.y = ey; healthBox.direction = Math.atan2(2732 / 2 - ey, 2048 / 2 - ex); healthBox.lastX = healthBox.x; healthBox.lastY = healthBox.y; enemies.push(healthBox); game.addChild(healthBox); } else { var enemy = new Enemy(); enemy.x = ex; enemy.y = ey; // Set direction towards player center enemy.direction = Math.atan2(2732 / 2 - ey, 2048 / 2 - ex); // Scale enemy speed with score: base speed + (score * 0.08), capped at 7x base var score = LK.getScore(); var speedScale = 1 + Math.min(score * 0.08, 6); // up to 7x base speed enemy.speed *= speedScale; // Defensive: initialize lastX/lastY enemy.lastX = enemy.x; enemy.lastY = enemy.y; enemies.push(enemy); game.addChild(enemy); } } // --- Game Update Loop --- game.update = function () { // --- Fire cooldown --- if (fireCooldown > 0) fireCooldown--; // Keep player health bar above player (not rotating) player.hpBarBg.x = player.x; player.hpBarBg.y = player.y - 120; player.hpBar.x = player.x; player.hpBar.y = player.y - 120; // --- Update aim dots position --- // Dots start a bit away from player, spaced out in the direction player is aiming for (var i = 0; i < aimDots.length; i++) { if (dragActive) { var dist = 40 + i * 32; // start closer, match new aimDotSpacing var angle = player.rotation; aimDots[i].x = player.x + Math.cos(angle) * dist; aimDots[i].y = player.y + Math.sin(angle) * dist; aimDots[i].visible = true; } else { aimDots[i].visible = false; } } // --- Update aim helper lines position and rotation --- for (var i = 0; i < aimLines.length; i++) { if (dragActive) { var angle = player.rotation; // Slight spread for side lines, center line is straight var spread = 0.13; // radians, about 7.5 degrees var lineAngle = angle; if (i === 0) lineAngle = angle - spread; if (i === 2) lineAngle = angle + spread; var offset = 80 + i * 36; // Place the left edge of the line at the correct offset from player center aimLines[i].x = player.x + Math.cos(lineAngle) * offset; aimLines[i].y = player.y + Math.sin(lineAngle) * offset; aimLines[i].rotation = lineAngle; aimLines[i].visible = true; // Center line highlight if (i === 1) { aimLines[i].alpha = 0.7; aimLines[i].tint = 0x66ccff; } else { aimLines[i].alpha = 0.28; aimLines[i].tint = 0xffffff; } } else { aimLines[i].visible = false; } } // --- Enemy spawn timer --- spawnTimer--; if (spawnTimer <= 0) { spawnEnemy(); // Make enemies and health boxes spawn less frequently (every 2.5-3.5s) spawnTimer = 150 + Math.floor(Math.random() * 60); // spawn every 2.5-3.5s } // --- Update Bullets --- for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Defensive: initialize lastX/lastY if not set if (typeof bullet.lastX === "undefined") bullet.lastX = bullet.x; if (typeof bullet.lastY === "undefined") bullet.lastY = bullet.y; bullet.update(); // Remove if out of bounds if (bullet.x < -200 || bullet.x > 2048 + 200 || bullet.y < -200 || bullet.y > 2732 + 200) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check collision with enemies var hit = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; // Defensive: initialize lastX/lastY if not set if (typeof enemy.lastX === "undefined") enemy.lastX = enemy.x; if (typeof enemy.lastY === "undefined") enemy.lastY = enemy.y; if (bullet.intersects(enemy)) { enemy.takeDamage(bullet.damage); // HealthBox dies in 1 hit, Enemy dies at 0 hp var isHealthBox = typeof enemy.maxHp !== "undefined" && enemy.maxHp === 1; if (enemy.hp <= 0) { var isHealthBox = typeof enemy.maxHp !== "undefined" && enemy.maxHp === 1; if (isHealthBox) { // HealthBox: if any shield is missing (inactive), revive it (starting from innermost) var revived = false; for (var ss = 0; ss < shieldLayers.length; ss++) { if (!shieldLayers[ss].active) { shieldLayers[ss].reset(); revived = true; // Flash revived shield LK.effects.flashObject(shieldLayers[ss], 0x44ff44, 400); break; } } // If all shields are active, fully restore outermost shield if (!revived && shieldLayers.length > 0) { var outermost = shieldLayers[shieldLayers.length - 1]; outermost.hp = outermost.maxHp; outermost.updateHpBar(); LK.effects.flashObject(outermost, 0x44ff44, 400); } // Play a positive effect on shield LK.getSound('shieldHit').play(); } else { LK.getSound('enemyDie').play(); } enemy.die(); enemy.destroy(); enemies.splice(j, 1); LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); } bullet.destroy(); bullets.splice(i, 1); hit = true; break; } } if (hit) continue; } // --- Update Enemies --- for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Defensive: initialize lastX/lastY if not set if (typeof enemy.lastX === "undefined") enemy.lastX = enemy.x; if (typeof enemy.lastY === "undefined") enemy.lastY = enemy.y; enemy.update(); // Check collision with shields (outermost to innermost) var blocked = false; for (var s = shieldLayers.length - 1; s >= 0; s--) { var shield = shieldLayers[s]; if (shield.active) { // Defensive: initialize lastX/lastY if not set if (typeof shield.lastX === "undefined") shield.lastX = shield.x; if (typeof shield.lastY === "undefined") shield.lastY = shield.y; // Check distance from player center to enemy center var dx = enemy.x - player.x; var dy = enemy.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); // Enemy "radius" is ~50, shield is at shield.radius (already 1.5x larger) if (dist < shield.radius + 50) { // Collided with shield var isHealthBox = typeof enemy.maxHp !== "undefined" && enemy.maxHp === 1; if (isHealthBox) { // HealthBox: just disappears, does not affect shield, no revive or restore enemy.die(); enemy.destroy(); enemies.splice(i, 1); blocked = true; break; } else { // Regular enemy: damage shield shield.takeDamage(1); LK.getSound('shieldHit').play(); enemy.die(); enemy.destroy(); enemies.splice(i, 1); // Flash shield LK.effects.flashObject(shield, 0x44aaff, 200); blocked = true; break; } } } } if (blocked) continue; // If not blocked, check collision with player if (enemy.intersects(player)) { player.takeDamage(1); LK.getSound('enemyDie').play(); enemy.die(); enemy.destroy(); enemies.splice(i, 1); // Flash screen LK.effects.flashScreen(0xff0000, 400); // Game over if player dead if (player.hp <= 0) { player.die(); LK.showGameOver(); return; } } } ; // --- Update and cleanup enemy death particles --- if (game._enemyParticles) { for (var i = game._enemyParticles.length - 1; i >= 0; i--) { var p = game._enemyParticles[i]; // Defensive: initialize lastX/lastY if not set if (typeof p.lastX === "undefined") p.lastX = p.x; if (typeof p.lastY === "undefined") p.lastY = p.y; if (p.destroyed) { game._enemyParticles.splice(i, 1); continue; } if (typeof p.update === "function") p.update(); } } }; // --- Score Initialization --- LK.setScore(0); scoreTxt.setText(LK.getScore());
===================================================================
--- original.js
+++ change.js
@@ -365,26 +365,28 @@
dot.visible = true;
aimDots.push(dot);
}
// --- Helper Lines for Aim Direction ---
-// Draw 3 visible helper lines for player aim direction
+// Draw 3 visible helper lines for player aim direction, with a central highlight
var aimLines = [];
var aimLineCount = 3;
var aimLineLength = 400;
for (var i = 0; i < aimLineCount; i++) {
- // Use a white, semi-transparent box as a line segment
+ // Center line is brighter and thinner, side lines are fainter and wider
+ var isCenter = i === 1;
var line = LK.getAsset('hpbar_fg', {
anchorX: 0.0,
- // left edge
anchorY: 0.5,
scaleX: 1.0,
- scaleY: 0.18,
- alpha: 0.38,
+ scaleY: isCenter ? 0.12 : 0.18,
+ alpha: isCenter ? 0.7 : 0.28,
rotation: 0
});
line.width = aimLineLength;
- line.height = 10 + i * 4;
+ line.height = isCenter ? 7 : 10 + (i === 0 ? 0 : 4);
line.visible = true;
+ // For the center line, tint to a light blue for highlight
+ if (isCenter) line.tint = 0x66ccff;
aimLines.push(line);
}
// --- Score Display ---
var scoreTxt = new Text2('0', {
@@ -541,14 +543,27 @@
// --- Update aim helper lines position and rotation ---
for (var i = 0; i < aimLines.length; i++) {
if (dragActive) {
var angle = player.rotation;
+ // Slight spread for side lines, center line is straight
+ var spread = 0.13; // radians, about 7.5 degrees
+ var lineAngle = angle;
+ if (i === 0) lineAngle = angle - spread;
+ if (i === 2) lineAngle = angle + spread;
var offset = 80 + i * 36;
// Place the left edge of the line at the correct offset from player center
- aimLines[i].x = player.x + Math.cos(angle) * offset;
- aimLines[i].y = player.y + Math.sin(angle) * offset;
- aimLines[i].rotation = angle;
+ aimLines[i].x = player.x + Math.cos(lineAngle) * offset;
+ aimLines[i].y = player.y + Math.sin(lineAngle) * offset;
+ aimLines[i].rotation = lineAngle;
aimLines[i].visible = true;
+ // Center line highlight
+ if (i === 1) {
+ aimLines[i].alpha = 0.7;
+ aimLines[i].tint = 0x66ccff;
+ } else {
+ aimLines[i].alpha = 0.28;
+ aimLines[i].tint = 0xffffff;
+ }
} else {
aimLines[i].visible = false;
}
}