User prompt
rubah kontrol player bisa bebas ke arah mana saja.
User prompt
hapus wave ganti endless game
User prompt
player auto menembak setiap 1 detik
User prompt
musuh bisa menembak kearah player
User prompt
enemy menembak secara bergantian
User prompt
kurangi jumlah musuh
User prompt
kurangi kecepatan gerakan player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
buat kontrol player lebih halus dan tidak terlalu cepat ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
reduce bullet appear
Code edit (1 edits merged)
Please save this source code
User prompt
Space Defender
Initial prompt
buat game mirip galaga atau space invander
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.direction = 1; self.moveDownDistance = 60; self.shootChance = 0.001; self.points = 10; self.lastShoot = 0; self.update = function () { self.y += self.speed; }; self.moveDown = function () { self.y += self.moveDownDistance; self.direction *= -1; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.directionX = 0; self.directionY = self.speed; self.update = function () { self.x += self.directionX; self.y += self.directionY; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.lastShoot = 0; self.shootDelay = 15; self.lives = 3; self.invulnerable = false; self.invulnerableTime = 0; self.shoot = function () { if (LK.ticks - self.lastShoot > self.shootDelay) { var bullet = new PlayerBullet(); bullet.x = self.x; bullet.y = self.y - 40; playerBullets.push(bullet); game.addChild(bullet); self.lastShoot = LK.ticks; LK.getSound('shoot').play(); } }; self.takeDamage = function () { if (!self.invulnerable) { self.lives--; self.invulnerable = true; self.invulnerableTime = LK.ticks + 120; // 2 seconds of invulnerability LK.effects.flashObject(self, 0xff0000, 500); LK.getSound('playerHit').play(); livesText.setText('Lives: ' + self.lives); if (self.lives <= 0) { LK.showGameOver(); } } }; self.update = function () { if (self.invulnerable && LK.ticks > self.invulnerableTime) { self.invulnerable = false; } }; return self; }); var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -12; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerupGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.type = 'rapidfire'; // Default type self.update = function () { self.y += self.speed; self.rotation += 0.1; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000033 }); /**** * Game Code ****/ var player = new Player(); player.x = 1024; player.y = 2500; game.addChild(player); var playerBullets = []; var enemyBullets = []; var enemies = []; var powerups = []; var enemySpawnTimer = 0; var enemySpawnInterval = 120; // Spawn enemy every 2 seconds (120 ticks at 60fps) var maxEnemies = 12; // Maximum enemies on screen at once var dragNode = null; var rapidFireEndTime = 0; var currentShootingEnemyIndex = 0; var enemyShootTimer = 0; var enemyShootInterval = 90; // Shoot every 1.5 seconds (90 ticks at 60fps) var playerAutoShootTimer = 0; var playerAutoShootInterval = 60; // Auto shoot every 1 second (60 ticks at 60fps) // UI Elements var scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 50; scoreText.y = 50; LK.gui.topLeft.addChild(scoreText); var livesText = new Text2('Lives: 3', { size: 80, fill: 0xFFFFFF }); livesText.anchor.set(1, 0); LK.gui.topRight.addChild(livesText); function spawnEnemy() { if (enemies.length < maxEnemies) { var enemy = new Enemy(); enemy.x = Math.random() * (2048 - 120) + 60; // Random X position enemy.y = -60; // Start above screen enemy.speed = 2 + Math.random() * 3; // Random speed between 2-5 enemy.shootChance = 0.001; enemies.push(enemy); game.addChild(enemy); } } function handleMove(x, y, obj) { if (dragNode) { var targetX = Math.max(40, Math.min(2008, x)); tween.stop(dragNode, { x: true }); tween(dragNode, { x: targetX }, { duration: 500, easing: tween.easeOut }); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = player; handleMove(x, y, obj); player.shoot(); }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { // Check if rapid fire is active var isRapidFire = LK.ticks < rapidFireEndTime; if (isRapidFire) { player.shootDelay = 5; } else { player.shootDelay = 15; } // Auto shoot every 1 second playerAutoShootTimer++; if (playerAutoShootTimer >= playerAutoShootInterval) { playerAutoShootTimer = 0; player.shoot(); } // Update player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove bullets that go off screen if (bullet.lastY >= -10 && bullet.y < -10) { bullet.destroy(); playerBullets.splice(i, 1); continue; } // Check collision with enemies var hitEnemy = false; for (var j = enemies.length - 1; j >= 0; j--) { if (bullet.intersects(enemies[j])) { LK.setScore(LK.getScore() + enemies[j].points); scoreText.setText('Score: ' + LK.getScore()); LK.getSound('enemyHit').play(); // Chance to drop power-up if (Math.random() < 0.1) { var powerup = new PowerUp(); powerup.x = enemies[j].x; powerup.y = enemies[j].y; powerups.push(powerup); game.addChild(powerup); } enemies[j].destroy(); enemies.splice(j, 1); hitEnemy = true; break; } } if (hitEnemy) { bullet.destroy(); playerBullets.splice(i, 1); continue; } bullet.lastY = bullet.y; } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove bullets that go off screen if (bullet.lastY <= 2742 && bullet.y > 2742) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with player if (bullet.intersects(player)) { player.takeDamage(); bullet.destroy(); enemyBullets.splice(i, 1); continue; } bullet.lastY = bullet.y; } // Handle alternating enemy shooting enemyShootTimer++; if (enemyShootTimer >= enemyShootInterval && enemies.length > 0) { // Reset timer enemyShootTimer = 0; // Find next valid enemy to shoot var attempts = 0; var maxAttempts = enemies.length; while (attempts < maxAttempts) { // Make sure index is within bounds if (currentShootingEnemyIndex >= enemies.length) { currentShootingEnemyIndex = 0; } var shootingEnemy = enemies[currentShootingEnemyIndex]; if (shootingEnemy && shootingEnemy.y < 2000) { // Only shoot if enemy is not too low // Create bullet from this enemy var bullet = new EnemyBullet(); bullet.x = shootingEnemy.x; bullet.y = shootingEnemy.y + 30; // Calculate direction towards player var deltaX = player.x - shootingEnemy.x; var deltaY = player.y - shootingEnemy.y; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); // Normalize direction and apply speed bullet.directionX = deltaX / distance * bullet.speed; bullet.directionY = deltaY / distance * bullet.speed; enemyBullets.push(bullet); game.addChild(bullet); break; } // Move to next enemy currentShootingEnemyIndex = (currentShootingEnemyIndex + 1) % enemies.length; attempts++; } // Move to next enemy for next turn currentShootingEnemyIndex = (currentShootingEnemyIndex + 1) % enemies.length; } // Spawn new enemies continuously enemySpawnTimer++; if (enemySpawnTimer >= enemySpawnInterval) { enemySpawnTimer = 0; spawnEnemy(); } // Update enemies and remove off-screen ones for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.lastY === undefined) enemy.lastY = enemy.y; // Remove enemies that go off bottom of screen if (enemy.lastY <= 2800 && enemy.y > 2800) { enemy.destroy(); enemies.splice(i, 1); continue; } // Check if enemies reached player if (enemy.y > 2300 && enemy.intersects(player)) { player.takeDamage(); } enemy.lastY = enemy.y; } // Update power-ups for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; if (powerup.lastY === undefined) powerup.lastY = powerup.y; // Remove power-ups that go off screen if (powerup.lastY <= 2742 && powerup.y > 2742) { powerup.destroy(); powerups.splice(i, 1); continue; } // Check collision with player if (powerup.intersects(player)) { if (powerup.type === 'rapidfire') { rapidFireEndTime = LK.ticks + 300; // 5 seconds of rapid fire } LK.getSound('powerupCollect').play(); powerup.destroy(); powerups.splice(i, 1); continue; } powerup.lastY = powerup.y; } };
===================================================================
--- original.js
+++ change.js
@@ -18,9 +18,9 @@
self.shootChance = 0.001;
self.points = 10;
self.lastShoot = 0;
self.update = function () {
- self.x += self.speed * self.direction;
+ self.y += self.speed;
};
self.moveDown = function () {
self.y += self.moveDownDistance;
self.direction *= -1;
@@ -129,11 +129,11 @@
var playerBullets = [];
var enemyBullets = [];
var enemies = [];
var powerups = [];
-var currentWave = 1;
-var enemiesKilled = 0;
-var waveEnemyCount = 0;
+var enemySpawnTimer = 0;
+var enemySpawnInterval = 120; // Spawn enemy every 2 seconds (120 ticks at 60fps)
+var maxEnemies = 12; // Maximum enemies on screen at once
var dragNode = null;
var rapidFireEndTime = 0;
var currentShootingEnemyIndex = 0;
var enemyShootTimer = 0;
@@ -154,45 +154,19 @@
fill: 0xFFFFFF
});
livesText.anchor.set(1, 0);
LK.gui.topRight.addChild(livesText);
-var waveText = new Text2('Wave: 1', {
- size: 80,
- fill: 0xFFFFFF
-});
-waveText.anchor.set(0.5, 0);
-LK.gui.top.addChild(waveText);
-function spawnWave() {
- enemies = [];
- var rows = Math.min(2 + Math.floor(currentWave / 4), 4);
- var cols = Math.min(4 + Math.floor(currentWave / 3), 6);
- waveEnemyCount = rows * cols;
- enemiesKilled = 0;
- currentShootingEnemyIndex = 0; // Reset shooting order for new wave
- enemyShootTimer = 0; // Reset shoot timer
- var startX = (2048 - (cols - 1) * 120) / 2;
- var startY = 200;
- for (var row = 0; row < rows; row++) {
- for (var col = 0; col < cols; col++) {
- var enemy = new Enemy();
- enemy.x = startX + col * 120;
- enemy.y = startY + row * 80;
- enemy.speed = 1 + currentWave * 0.3;
- enemy.shootChance = 0.0005 + currentWave * 0.0002;
- enemies.push(enemy);
- game.addChild(enemy);
- }
+function spawnEnemy() {
+ if (enemies.length < maxEnemies) {
+ var enemy = new Enemy();
+ enemy.x = Math.random() * (2048 - 120) + 60; // Random X position
+ enemy.y = -60; // Start above screen
+ enemy.speed = 2 + Math.random() * 3; // Random speed between 2-5
+ enemy.shootChance = 0.001;
+ enemies.push(enemy);
+ game.addChild(enemy);
}
- waveText.setText('Wave: ' + currentWave);
}
-function checkWaveComplete() {
- if (enemiesKilled >= waveEnemyCount) {
- currentWave++;
- LK.setTimeout(function () {
- spawnWave();
- }, 2000);
- }
-}
function handleMove(x, y, obj) {
if (dragNode) {
var targetX = Math.max(40, Math.min(2008, x));
tween.stop(dragNode, {
@@ -255,9 +229,8 @@
game.addChild(powerup);
}
enemies[j].destroy();
enemies.splice(j, 1);
- enemiesKilled++;
hitEnemy = true;
break;
}
}
@@ -324,27 +297,29 @@
}
// Move to next enemy for next turn
currentShootingEnemyIndex = (currentShootingEnemyIndex + 1) % enemies.length;
}
- // Update enemies
- var shouldMoveDown = false;
- for (var i = 0; i < enemies.length; i++) {
+ // Spawn new enemies continuously
+ enemySpawnTimer++;
+ if (enemySpawnTimer >= enemySpawnInterval) {
+ enemySpawnTimer = 0;
+ spawnEnemy();
+ }
+ // Update enemies and remove off-screen ones
+ for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
- if (enemy.x <= 60 || enemy.x >= 1988) {
- shouldMoveDown = true;
- break;
+ if (enemy.lastY === undefined) enemy.lastY = enemy.y;
+ // Remove enemies that go off bottom of screen
+ if (enemy.lastY <= 2800 && enemy.y > 2800) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
}
- }
- if (shouldMoveDown) {
- for (var i = 0; i < enemies.length; i++) {
- enemies[i].moveDown();
- }
- }
- // Check if enemies reached player
- for (var i = 0; i < enemies.length; i++) {
- if (enemies[i].y > 2300 && enemies[i].intersects(player)) {
+ // Check if enemies reached player
+ if (enemy.y > 2300 && enemy.intersects(player)) {
player.takeDamage();
}
+ enemy.lastY = enemy.y;
}
// Update power-ups
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
@@ -366,8 +341,5 @@
continue;
}
powerup.lastY = powerup.y;
}
- checkWaveComplete();
-};
-// Start first wave
-spawnWave();
\ No newline at end of file
+};
\ No newline at end of file