User prompt
Zırha düşman çarpma sesi ekle
User prompt
Kurşun sesi ve düsman ölme sesi asset ekle
User prompt
Düşman yuvarlak asset ekle ve onu kullan.
User prompt
Canbarı hep yukarda olsun oyuncu dönse bile.
User prompt
Düşman daha yavaş gelsin.
User prompt
Zırhlar daire olsun
User prompt
3 katman cember zirh ekle
User prompt
Oyuncunun etrafinda 3 katman daire zırh var. Düşmanlar geçemez ama çarptıkça zarar verirler.
Code edit (1 edits merged)
Please save this source code
User prompt
360 Savunma: Merkezde Adam
Initial prompt
Tam merkez de bir adamımız var. Etraftan yaklaşan düşmanlara her dokunmada ateş edecek. Oyuncumuzun ve düşmanin can barı üzerinde olacak. Adamımiz sadece 360 dere e donebilir ve ateş edenilir. Düşman 360 derece her yerden gelebilir.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// --- Bullet Class ---
var Bullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet asset (yellow box)
var bulletAsset = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Bullet speed (pixels per frame)
self.speed = 40;
// Direction in radians (set on creation)
self.direction = 0;
// Damage dealt by this bullet
self.damage = 1;
// Update method called every tick
self.update = function () {
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 (blue ellipse)
var enemyAsset = self.attachAsset('enemyCircle', {
anchorX: 0.5,
anchorY: 0.5
});
// Enemy properties
self.radius = 60 + Math.random() * 40; // for spawn distance
self.speed = 1.2 + Math.random() * 1.2; // pixels per frame (reduced for slower approach)
self.maxHp = 3 + Math.floor(Math.random() * 3); // 3-5 HP
self.hp = self.maxHp;
// Direction towards center (set on spawn)
self.direction = 0;
// Health bar (red background, green foreground)
self.hpBarBg = self.addChild(LK.getAsset('character', {
width: 80,
height: 12,
color: 0x880000,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -70
}));
self.hpBar = self.addChild(LK.getAsset('centerCircle', {
width: 76,
height: 8,
color: 0x44de44,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -70
}));
// Update health bar width
self.updateHpBar = function () {
self.hpBar.width = 76 * (self.hp / self.maxHp);
};
// Update method called every tick
self.update = function () {
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);
};
// Initialize health bar
self.updateHpBar();
return self;
});
// --- Player Class ---
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach player asset (red box)
var playerAsset = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 0.5
});
// 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('character', {
width: 120,
height: 18,
color: 0x880000,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -90
});
self.hpBar = LK.getAsset('centerCircle', {
width: 116,
height: 12,
color: 0x44de44,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -90
});
// Update health bar width
self.updateHpBar = function () {
self.hpBar.width = 116 * (self.hp / self.maxHp);
};
// 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,
scaleY: 1,
alpha: 0.25 + 0.15 * self.index // more visible for outer shields
});
// Health bar above shield
self.hpBarBg = self.addChild(LK.getAsset('character', {
width: 120,
height: 12,
color: 0x222288,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -self.radius - 80
}));
self.hpBar = self.addChild(LK.getAsset('centerCircle', {
width: 116,
height: 8,
color: 0x44aaff,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
y: -self.radius - 80
}));
// Update health bar width
self.updateHpBar = function () {
self.hpBar.width = 116 * (self.hp / self.maxHp);
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) {
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
****/
// --- Global Variables ---
var player;
var enemies = [];
var bullets = [];
var spawnTimer = 0;
var fireCooldown = 0;
var dragActive = false;
var lastTouchAngle = 0;
// --- 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);
// Position health bar above player
player.hpBarBg.x = player.x;
player.hpBarBg.y = player.y - 120;
player.hpBar.x = player.x;
player.hpBar.y = player.y - 120;
// --- Shield Layers Initialization ---
var shieldLayers = [];
var shieldRadii = [180, 260, 340]; // innermost to outermost
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;
// Move health bar above shield
shield.hpBarBg.y = -shield.radius - 80;
shield.hpBar.y = -shield.radius - 80;
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;
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);
};
// --- 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;
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);
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;
// --- Enemy spawn timer ---
spawnTimer--;
if (spawnTimer <= 0) {
spawnEnemy();
spawnTimer = 60 + Math.floor(Math.random() * 40); // spawn every 1-1.5s
}
// --- Update Bullets ---
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
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];
if (bullet.intersects(enemy)) {
enemy.takeDamage(bullet.damage);
if (enemy.hp <= 0) {
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];
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) {
// 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
if (dist < shield.radius + 50) {
// Collided with shield
shield.takeDamage(1);
LK.getSound('enemyDie').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;
}
}
}
};
// --- Score Initialization ---
LK.setScore(0);
scoreTxt.setText(LK.getScore()); ===================================================================
--- original.js
+++ change.js
@@ -277,10 +277,10 @@
bullet.direction = angle;
bullets.push(bullet);
game.addChild(bullet);
fireCooldown = 10; // frames
- // Optionally: play sound
- // LK.getSound('shoot').play();
+ // Play shoot sound
+ LK.getSound('shoot').play();
}
// --- Handle Touch/Drag to Rotate Player ---
game.down = function (x, y, obj) {
dragActive = true;
@@ -346,8 +346,9 @@
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
enemy.takeDamage(bullet.damage);
if (enemy.hp <= 0) {
+ LK.getSound('enemyDie').play();
enemy.die();
enemy.destroy();
enemies.splice(j, 1);
LK.setScore(LK.getScore() + 1);
@@ -377,8 +378,9 @@
// Enemy "radius" is ~50, shield is at shield.radius
if (dist < shield.radius + 50) {
// Collided with shield
shield.takeDamage(1);
+ LK.getSound('enemyDie').play();
enemy.die();
enemy.destroy();
enemies.splice(i, 1);
// Flash shield
@@ -391,8 +393,9 @@
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