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.x += self.speed * self.direction;
// Random shooting
if (Math.random() < self.shootChance && LK.ticks - self.lastShoot > 60) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
self.lastShoot = LK.ticks;
}
};
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.update = function () {
self.y += self.speed;
};
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;
}
// Auto-shoot
self.shoot();
};
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 currentWave = 1;
var enemiesKilled = 0;
var waveEnemyCount = 0;
var dragNode = null;
var rapidFireEndTime = 0;
// 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);
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(3 + Math.floor(currentWave / 3), 6);
var cols = Math.min(6 + Math.floor(currentWave / 2), 10);
waveEnemyCount = rows * cols;
enemiesKilled = 0;
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);
}
}
waveText.setText('Wave: ' + currentWave);
}
function checkWaveComplete() {
if (enemiesKilled >= waveEnemyCount) {
currentWave++;
LK.setTimeout(function () {
spawnWave();
}, 2000);
}
}
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
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;
}
// 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);
enemiesKilled++;
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;
}
// Update enemies
var shouldMoveDown = false;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
if (enemy.x <= 60 || enemy.x >= 1988) {
shouldMoveDown = true;
break;
}
}
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)) {
player.takeDamage();
}
}
// 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;
}
checkWaveComplete();
};
// Start first wave
spawnWave(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,320 @@
-/****
+/****
+* 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.x += self.speed * self.direction;
+ // Random shooting
+ if (Math.random() < self.shootChance && LK.ticks - self.lastShoot > 60) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ self.lastShoot = LK.ticks;
+ }
+ };
+ 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.update = function () {
+ self.y += self.speed;
+ };
+ 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;
+ }
+ // Auto-shoot
+ self.shoot();
+ };
+ 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: 0x000000
-});
\ No newline at end of file
+ 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 currentWave = 1;
+var enemiesKilled = 0;
+var waveEnemyCount = 0;
+var dragNode = null;
+var rapidFireEndTime = 0;
+// 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);
+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(3 + Math.floor(currentWave / 3), 6);
+ var cols = Math.min(6 + Math.floor(currentWave / 2), 10);
+ waveEnemyCount = rows * cols;
+ enemiesKilled = 0;
+ 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);
+ }
+ }
+ waveText.setText('Wave: ' + currentWave);
+}
+function checkWaveComplete() {
+ if (enemiesKilled >= waveEnemyCount) {
+ currentWave++;
+ LK.setTimeout(function () {
+ spawnWave();
+ }, 2000);
+ }
+}
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = Math.max(40, Math.min(2008, x));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = player;
+ handleMove(x, y, obj);
+};
+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;
+ }
+ // 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);
+ enemiesKilled++;
+ 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;
+ }
+ // Update enemies
+ var shouldMoveDown = false;
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ if (enemy.x <= 60 || enemy.x >= 1988) {
+ shouldMoveDown = true;
+ break;
+ }
+ }
+ 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)) {
+ player.takeDamage();
+ }
+ }
+ // 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;
+ }
+ checkWaveComplete();
+};
+// Start first wave
+spawnWave();
\ No newline at end of file