User prompt
tamam bunları ekle oyuna
User prompt
kontroller de kullanıcı dostu olsun
User prompt
Please fix the bug: 'tween.to is not a function' in or related to this line: 'tween.to(instructionTxt, {' Line Number: 470 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
daha profesyonel bir oyun yap kullanıcı dostu olsun
Code edit (1 edits merged)
Please save this source code
User prompt
Endless Sky Shooter
Initial prompt
Make a professional endless shooting game with all the features that the game should have.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGfx = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.radius = enemyGfx.width * 0.5; self.speed = 8 + Math.random() * 8; self.moveType = Math.random() < 0.5 ? 'straight' : 'sine'; self.sinePhase = Math.random() * Math.PI * 2; self.sineAmp = 120 + Math.random() * 120; self.shootCooldown = 60 + Math.floor(Math.random() * 60); self.update = function () { if (self.moveType === 'straight') { self.y += self.speed; } else { self.y += self.speed * 0.85; self.x += Math.sin(self.y / 120 + self.sinePhase) * 6; } self.shootCooldown--; }; return self; }); // Enemy Bullet var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGfx = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 20; self.dirX = 0; self.dirY = 1; self.update = function () { self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; }; return self; }); // Player Bullet var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bulletGfx = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -32; self.update = function () { self.y += self.speed; }; return self; }); // Powerup var Powerup = Container.expand(function () { var self = Container.call(this); var powerupGfx = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.type = Math.random() < 0.5 ? 'rapid' : 'shield'; powerupGfx.tint = self.type === 'rapid' ? 0xffe100 : 0x00ffff; self.speed = 10; self.update = function () { self.y += self.speed; }; return self; }); // Player Ship var Ship = Container.expand(function () { var self = Container.call(this); var shipGfx = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); self.radius = shipGfx.width * 0.5; self.shootCooldown = 0; self.rapidFire = false; self.rapidFireTimer = 0; self.shield = false; self.shieldTimer = 0; // Visual shield indicator var shieldGfx = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 1.3, tint: 0x00ffff }); shieldGfx.alpha = 0.25; shieldGfx.visible = false; self.update = function () { // Handle powerup timers if (self.rapidFire) { self.rapidFireTimer--; if (self.rapidFireTimer <= 0) { self.rapidFire = false; } } if (self.shield) { self.shieldTimer--; if (self.shieldTimer <= 0) { self.shield = false; shieldGfx.visible = false; } } }; self.activateRapidFire = function (duration) { self.rapidFire = true; self.rapidFireTimer = duration; }; self.activateShield = function (duration) { self.shield = true; self.shieldTimer = duration; shieldGfx.visible = true; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000010 }); /**** * Game Code ****/ // Music // Sound effects // Powerup // Enemy bullet // Enemy // Player bullet // Spaceship (player) // Game area var GAME_W = 2048, GAME_H = 2732; // Score var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Player ship var ship = new Ship(); game.addChild(ship); ship.x = GAME_W / 2; ship.y = GAME_H - 350; // Arrays for game objects var playerBullets = []; var enemies = []; var enemyBullets = []; var powerups = []; // Dragging var dragNode = null; // Difficulty var enemySpawnTimer = 0; var enemySpawnInterval = 60; var minEnemyInterval = 18; var enemySpeedInc = 0; // Powerup spawn var powerupTimer = 0; var powerupInterval = 600; // Last intersect states var lastShipEnemyIntersect = false; var lastShipEnemyBulletIntersect = false; var lastShipPowerupIntersect = false; // Music LK.playMusic('bgmusic'); // Move handler (drag ship) function handleMove(x, y, obj) { if (dragNode === ship) { // Clamp ship inside game area (with margin) var margin = 80; var nx = Math.max(margin, Math.min(GAME_W - margin, x)); var ny = Math.max(margin, Math.min(GAME_H - margin, y)); ship.x = nx; ship.y = ny; } } game.move = handleMove; game.down = function (x, y, obj) { // Only drag if touch is on ship var dx = x - ship.x, dy = y - ship.y; if (dx * dx + dy * dy < ship.radius * ship.radius * 1.2) { dragNode = ship; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Main update loop game.update = function () { // Update ship ship.update(); // --- Player shooting --- ship.shootCooldown--; var shootRate = ship.rapidFire ? 6 : 18; if (ship.shootCooldown <= 0) { // Auto-fire var pb = new PlayerBullet(); pb.x = ship.x; pb.y = ship.y - ship.radius - 30; playerBullets.push(pb); game.addChild(pb); ship.shootCooldown = shootRate; LK.getSound('shoot').play(); } // --- Update player bullets --- for (var i = playerBullets.length - 1; i >= 0; i--) { var b = playerBullets[i]; b.update(); // Remove if off screen if (b.y < -80) { b.destroy(); playerBullets.splice(i, 1); } } // --- Update enemies --- for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); // Remove if off screen if (e.y > GAME_H + 120) { e.destroy(); enemies.splice(i, 1); continue; } // Enemy shooting if (e.shootCooldown <= 0) { var eb = new EnemyBullet(); eb.x = e.x; eb.y = e.y + e.radius + 10; // Aim at ship var dx = ship.x - e.x, dy = ship.y - e.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { eb.dirX = dx / len; eb.dirY = dy / len; } enemyBullets.push(eb); game.addChild(eb); e.shootCooldown = 90 + Math.floor(Math.random() * 60); } } // --- Update enemy bullets --- for (var i = enemyBullets.length - 1; i >= 0; i--) { var eb = enemyBullets[i]; eb.update(); if (eb.x < -100 || eb.x > GAME_W + 100 || eb.y < -100 || eb.y > GAME_H + 100) { eb.destroy(); enemyBullets.splice(i, 1); } } // --- Update powerups --- for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; p.update(); if (p.y > GAME_H + 100) { p.destroy(); powerups.splice(i, 1); } } // --- Collision: Player bullets vs Enemies --- for (var i = playerBullets.length - 1; i >= 0; i--) { var b = playerBullets[i]; for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (b.intersects(e)) { // Enemy down LK.getSound('enemyDown').play(); score += 10; scoreTxt.setText(score); e.destroy(); enemies.splice(j, 1); b.destroy(); playerBullets.splice(i, 1); break; } } } // --- Collision: Ship vs Enemies --- var shipEnemyIntersect = false; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; if (ship.intersects(e)) { shipEnemyIntersect = true; break; } } if (!lastShipEnemyIntersect && shipEnemyIntersect) { if (ship.shield) { // Absorb hit, destroy enemy LK.effects.flashObject(ship, 0x00ffff, 400); for (var i = 0; i < enemies.length; i++) { if (ship.intersects(enemies[i])) { enemies[i].destroy(); enemies.splice(i, 1); break; } } ship.shield = false; ship.shieldTimer = 0; ship.children[1].visible = false; } else { // Game over LK.effects.flashScreen(0xff0000, 1000); LK.getSound('hit').play(); LK.showGameOver(); return; } } lastShipEnemyIntersect = shipEnemyIntersect; // --- Collision: Ship vs Enemy Bullets --- var shipEnemyBulletIntersect = false; for (var i = 0; i < enemyBullets.length; i++) { var eb = enemyBullets[i]; if (ship.intersects(eb)) { shipEnemyBulletIntersect = true; break; } } if (!lastShipEnemyBulletIntersect && shipEnemyBulletIntersect) { if (ship.shield) { LK.effects.flashObject(ship, 0x00ffff, 400); // Remove bullet for (var i = 0; i < enemyBullets.length; i++) { if (ship.intersects(enemyBullets[i])) { enemyBullets[i].destroy(); enemyBullets.splice(i, 1); break; } } ship.shield = false; ship.shieldTimer = 0; ship.children[1].visible = false; } else { LK.effects.flashScreen(0xff0000, 1000); LK.getSound('hit').play(); LK.showGameOver(); return; } } lastShipEnemyBulletIntersect = shipEnemyBulletIntersect; // --- Collision: Ship vs Powerups --- var shipPowerupIntersect = false; for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; if (ship.intersects(p)) { shipPowerupIntersect = true; // Apply powerup LK.getSound('powerup').play(); if (p.type === 'rapid') { ship.activateRapidFire(360); } else if (p.type === 'shield') { ship.activateShield(480); } p.destroy(); powerups.splice(i, 1); } } lastShipPowerupIntersect = shipPowerupIntersect; // --- Enemy spawn --- enemySpawnTimer--; if (enemySpawnTimer <= 0) { // Spawn enemy at random x var e = new Enemy(); e.x = 180 + Math.random() * (GAME_W - 360); e.y = -100; // Increase speed as score increases e.speed += Math.floor(score / 200) * 2; enemies.push(e); game.addChild(e); // Decrease interval as score increases enemySpawnInterval = Math.max(minEnemyInterval, 60 - Math.floor(score / 100) * 4); enemySpawnTimer = enemySpawnInterval; } // --- Powerup spawn --- powerupTimer--; if (powerupTimer <= 0) { var p = new Powerup(); p.x = 180 + Math.random() * (GAME_W - 360); p.y = -80; powerups.push(p); game.addChild(p); powerupInterval = 600 + Math.floor(Math.random() * 600); powerupTimer = powerupInterval; } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,404 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Enemy
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGfx = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = enemyGfx.width * 0.5;
+ self.speed = 8 + Math.random() * 8;
+ self.moveType = Math.random() < 0.5 ? 'straight' : 'sine';
+ self.sinePhase = Math.random() * Math.PI * 2;
+ self.sineAmp = 120 + Math.random() * 120;
+ self.shootCooldown = 60 + Math.floor(Math.random() * 60);
+ self.update = function () {
+ if (self.moveType === 'straight') {
+ self.y += self.speed;
+ } else {
+ self.y += self.speed * 0.85;
+ self.x += Math.sin(self.y / 120 + self.sinePhase) * 6;
+ }
+ self.shootCooldown--;
+ };
+ return self;
+});
+// Enemy Bullet
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGfx = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 20;
+ self.dirX = 0;
+ self.dirY = 1;
+ self.update = function () {
+ self.x += self.dirX * self.speed;
+ self.y += self.dirY * self.speed;
+ };
+ return self;
+});
+// Player Bullet
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGfx = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -32;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Powerup
+var Powerup = Container.expand(function () {
+ var self = Container.call(this);
+ var powerupGfx = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = Math.random() < 0.5 ? 'rapid' : 'shield';
+ powerupGfx.tint = self.type === 'rapid' ? 0xffe100 : 0x00ffff;
+ self.speed = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Ship
+var Ship = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGfx = self.attachAsset('ship', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = shipGfx.width * 0.5;
+ self.shootCooldown = 0;
+ self.rapidFire = false;
+ self.rapidFireTimer = 0;
+ self.shield = false;
+ self.shieldTimer = 0;
+ // Visual shield indicator
+ var shieldGfx = self.attachAsset('ship', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.3,
+ scaleY: 1.3,
+ tint: 0x00ffff
+ });
+ shieldGfx.alpha = 0.25;
+ shieldGfx.visible = false;
+ self.update = function () {
+ // Handle powerup timers
+ if (self.rapidFire) {
+ self.rapidFireTimer--;
+ if (self.rapidFireTimer <= 0) {
+ self.rapidFire = false;
+ }
+ }
+ if (self.shield) {
+ self.shieldTimer--;
+ if (self.shieldTimer <= 0) {
+ self.shield = false;
+ shieldGfx.visible = false;
+ }
+ }
+ };
+ self.activateRapidFire = function (duration) {
+ self.rapidFire = true;
+ self.rapidFireTimer = duration;
+ };
+ self.activateShield = function (duration) {
+ self.shield = true;
+ self.shieldTimer = duration;
+ shieldGfx.visible = true;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000010
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sound effects
+// Powerup
+// Enemy bullet
+// Enemy
+// Player bullet
+// Spaceship (player)
+// Game area
+var GAME_W = 2048,
+ GAME_H = 2732;
+// Score
+var score = 0;
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Player ship
+var ship = new Ship();
+game.addChild(ship);
+ship.x = GAME_W / 2;
+ship.y = GAME_H - 350;
+// Arrays for game objects
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerups = [];
+// Dragging
+var dragNode = null;
+// Difficulty
+var enemySpawnTimer = 0;
+var enemySpawnInterval = 60;
+var minEnemyInterval = 18;
+var enemySpeedInc = 0;
+// Powerup spawn
+var powerupTimer = 0;
+var powerupInterval = 600;
+// Last intersect states
+var lastShipEnemyIntersect = false;
+var lastShipEnemyBulletIntersect = false;
+var lastShipPowerupIntersect = false;
+// Music
+LK.playMusic('bgmusic');
+// Move handler (drag ship)
+function handleMove(x, y, obj) {
+ if (dragNode === ship) {
+ // Clamp ship inside game area (with margin)
+ var margin = 80;
+ var nx = Math.max(margin, Math.min(GAME_W - margin, x));
+ var ny = Math.max(margin, Math.min(GAME_H - margin, y));
+ ship.x = nx;
+ ship.y = ny;
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only drag if touch is on ship
+ var dx = x - ship.x,
+ dy = y - ship.y;
+ if (dx * dx + dy * dy < ship.radius * ship.radius * 1.2) {
+ dragNode = ship;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main update loop
+game.update = function () {
+ // Update ship
+ ship.update();
+ // --- Player shooting ---
+ ship.shootCooldown--;
+ var shootRate = ship.rapidFire ? 6 : 18;
+ if (ship.shootCooldown <= 0) {
+ // Auto-fire
+ var pb = new PlayerBullet();
+ pb.x = ship.x;
+ pb.y = ship.y - ship.radius - 30;
+ playerBullets.push(pb);
+ game.addChild(pb);
+ ship.shootCooldown = shootRate;
+ LK.getSound('shoot').play();
+ }
+ // --- Update player bullets ---
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var b = playerBullets[i];
+ b.update();
+ // Remove if off screen
+ if (b.y < -80) {
+ b.destroy();
+ playerBullets.splice(i, 1);
+ }
+ }
+ // --- Update enemies ---
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var e = enemies[i];
+ e.update();
+ // Remove if off screen
+ if (e.y > GAME_H + 120) {
+ e.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Enemy shooting
+ if (e.shootCooldown <= 0) {
+ var eb = new EnemyBullet();
+ eb.x = e.x;
+ eb.y = e.y + e.radius + 10;
+ // Aim at ship
+ var dx = ship.x - e.x,
+ dy = ship.y - e.y;
+ var len = Math.sqrt(dx * dx + dy * dy);
+ if (len > 0) {
+ eb.dirX = dx / len;
+ eb.dirY = dy / len;
+ }
+ enemyBullets.push(eb);
+ game.addChild(eb);
+ e.shootCooldown = 90 + Math.floor(Math.random() * 60);
+ }
+ }
+ // --- Update enemy bullets ---
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var eb = enemyBullets[i];
+ eb.update();
+ if (eb.x < -100 || eb.x > GAME_W + 100 || eb.y < -100 || eb.y > GAME_H + 100) {
+ eb.destroy();
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // --- Update powerups ---
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var p = powerups[i];
+ p.update();
+ if (p.y > GAME_H + 100) {
+ p.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // --- Collision: Player bullets vs Enemies ---
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var b = playerBullets[i];
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var e = enemies[j];
+ if (b.intersects(e)) {
+ // Enemy down
+ LK.getSound('enemyDown').play();
+ score += 10;
+ scoreTxt.setText(score);
+ e.destroy();
+ enemies.splice(j, 1);
+ b.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // --- Collision: Ship vs Enemies ---
+ var shipEnemyIntersect = false;
+ for (var i = 0; i < enemies.length; i++) {
+ var e = enemies[i];
+ if (ship.intersects(e)) {
+ shipEnemyIntersect = true;
+ break;
+ }
+ }
+ if (!lastShipEnemyIntersect && shipEnemyIntersect) {
+ if (ship.shield) {
+ // Absorb hit, destroy enemy
+ LK.effects.flashObject(ship, 0x00ffff, 400);
+ for (var i = 0; i < enemies.length; i++) {
+ if (ship.intersects(enemies[i])) {
+ enemies[i].destroy();
+ enemies.splice(i, 1);
+ break;
+ }
+ }
+ ship.shield = false;
+ ship.shieldTimer = 0;
+ ship.children[1].visible = false;
+ } else {
+ // Game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('hit').play();
+ LK.showGameOver();
+ return;
+ }
+ }
+ lastShipEnemyIntersect = shipEnemyIntersect;
+ // --- Collision: Ship vs Enemy Bullets ---
+ var shipEnemyBulletIntersect = false;
+ for (var i = 0; i < enemyBullets.length; i++) {
+ var eb = enemyBullets[i];
+ if (ship.intersects(eb)) {
+ shipEnemyBulletIntersect = true;
+ break;
+ }
+ }
+ if (!lastShipEnemyBulletIntersect && shipEnemyBulletIntersect) {
+ if (ship.shield) {
+ LK.effects.flashObject(ship, 0x00ffff, 400);
+ // Remove bullet
+ for (var i = 0; i < enemyBullets.length; i++) {
+ if (ship.intersects(enemyBullets[i])) {
+ enemyBullets[i].destroy();
+ enemyBullets.splice(i, 1);
+ break;
+ }
+ }
+ ship.shield = false;
+ ship.shieldTimer = 0;
+ ship.children[1].visible = false;
+ } else {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('hit').play();
+ LK.showGameOver();
+ return;
+ }
+ }
+ lastShipEnemyBulletIntersect = shipEnemyBulletIntersect;
+ // --- Collision: Ship vs Powerups ---
+ var shipPowerupIntersect = false;
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var p = powerups[i];
+ if (ship.intersects(p)) {
+ shipPowerupIntersect = true;
+ // Apply powerup
+ LK.getSound('powerup').play();
+ if (p.type === 'rapid') {
+ ship.activateRapidFire(360);
+ } else if (p.type === 'shield') {
+ ship.activateShield(480);
+ }
+ p.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ lastShipPowerupIntersect = shipPowerupIntersect;
+ // --- Enemy spawn ---
+ enemySpawnTimer--;
+ if (enemySpawnTimer <= 0) {
+ // Spawn enemy at random x
+ var e = new Enemy();
+ e.x = 180 + Math.random() * (GAME_W - 360);
+ e.y = -100;
+ // Increase speed as score increases
+ e.speed += Math.floor(score / 200) * 2;
+ enemies.push(e);
+ game.addChild(e);
+ // Decrease interval as score increases
+ enemySpawnInterval = Math.max(minEnemyInterval, 60 - Math.floor(score / 100) * 4);
+ enemySpawnTimer = enemySpawnInterval;
+ }
+ // --- Powerup spawn ---
+ powerupTimer--;
+ if (powerupTimer <= 0) {
+ var p = new Powerup();
+ p.x = 180 + Math.random() * (GAME_W - 360);
+ p.y = -80;
+ powerups.push(p);
+ game.addChild(p);
+ powerupInterval = 600 + Math.floor(Math.random() * 600);
+ powerupTimer = powerupInterval;
+ }
+};
\ No newline at end of file