User prompt
düşman sayısı 15 saniye de bir tane artsın
User prompt
oyunda mermi atıldığında 086553_bullet_hit_39853.mp3 sesi kullanılsın,
User prompt
dosyalar güncellendi
User prompt
bullet göründüğünde 086553_bullet_hit_39853.mp3 bu ses çalsın
User prompt
ateş etmek için ekrana tıklanıldığında 086553_bullet_hit_39853.mp3 bu ses çıksın
User prompt
ateş etmek için ekrana tıklanıldığında 086553_bullet_hit_39853.mp3
User prompt
ateş edildiğinde 086553_bullet_hit_39853.mp3 bu ses çıksın
User prompt
mermi sesi 086553_bullet_hit_39853.mp3
User prompt
086553_bullet_hit_39853.mp3 iptal
User prompt
ateş edildiğinde 086553_bullet_hit_39853.mp3 sesi çıksın
User prompt
can artması sınırsız
User prompt
ateş edildiğinde 086553_bullet_hit_39853.mp3 sesi çıksın
User prompt
kalbe ateş edildiğinde Hp artsın
User prompt
ateş etme süresi 0 snaiye
User prompt
ateş etme süresi olmasın
User prompt
tıklanan yere ateş edilsin
User prompt
Score yazmasın sadece hayatta kalınan süre yazsın
User prompt
Score yazısının karşısında süre yazsın
User prompt
Score hayatta kalınan süre olsun
User prompt
Play butonu ekran ortasında olsun ve beyaz çerçeveli olsun. Basılmadan play yazısına oyun başlamasın
User prompt
Powerup alınmadığında 5 saniye de kaybolsun
User prompt
Playbg yi oyun ekranına ortala
User prompt
Sadece play butonuna basıldığında oyun başlasın
User prompt
Merminin ucu düşmana baksın
User prompt
Ateş etme hızı 1,5 saniye bir tane
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletSprite = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = bulletSprite.width * 0.5; self.speed = 32; self.dx = 0; self.dy = 0; self.update = function () { self.x += self.dx * self.speed; self.y += self.dy * self.speed; }; return self; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemySprite = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.radius = enemySprite.width * 0.5; self.speed = 2 + Math.random() * 1.2; self.hp = 2; self.target = null; // set to player self.update = function () { if (!self.target) return; var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } }; self.hit = function () { self.hp--; LK.getSound('enemyhit').play(); LK.effects.flashObject(self, 0xffffff, 120); if (self.hp <= 0) { self.destroyed = true; } }; return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerSprite = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.radius = playerSprite.width * 0.5; self.speed = 18; self.hp = 5; self.invuln = 0; // frames of invulnerability after hit // For upgrades self.fireRate = 60; // frames between shots (1 saniye) self.bulletSpeed = 32; self.bulletSpread = 0; // degrees self.lastShot = 0; self.update = function () { if (self.invuln > 0) { self.invuln--; playerSprite.alpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.4); } else { playerSprite.alpha = 1; } }; // Called when player is hit self.hit = function () { if (self.invuln > 0) return; self.hp--; self.invuln = 60; LK.effects.flashObject(self, 0xff0000, 400); LK.getSound('playerhit').play(); updateHpText(); if (self.hp <= 0) { LK.effects.flashScreen(0xff0000, 1200); LK.showGameOver(); } }; // Called when player picks up a powerup self.applyPowerup = function (type) { if (type === 'firerate') { self.fireRate = Math.max(8, self.fireRate - 4); } else if (type === 'spread') { self.bulletSpread = Math.min(30, self.bulletSpread + 10); } else if (type === 'hp') { self.hp = Math.min(8, self.hp + 1); updateHpText(); } else if (type === 'bulletspeed') { self.bulletSpeed = Math.min(48, self.bulletSpeed + 4); } }; return self; }); // Powerup class var Powerup = Container.expand(function () { var self = Container.call(this); var powerupSprite = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.radius = powerupSprite.width * 0.5; self.type = 'firerate'; // default, can be changed self.update = function () {}; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x7c3f1c }); /**** * Game Code ****/ // Add background // Play button and cover logic var coverBg = LK.getAsset('Playbg', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(coverBg); // Create Play button as a container with Playbg as background var playBtn = new Container(); var playBgSprite = LK.getAsset('Playbg', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); playBtn.addChild(playBgSprite); var playText = new Text2('PLAY', { size: 200, fill: "#fff", font: "Impact, Arial Black, Tahoma" }); playText.anchor.set(0.5, 0.5); playText.x = 0; playText.y = 0; playBtn.addChild(playText); playBtn.x = 2048 / 2; playBtn.y = 2732 / 2 + 300; playBtn.interactive = true; playBtn.buttonMode = true; game.addChild(playBtn); // Hide game UI and logic until play is pressed var gameStarted = false; // GUI var scoreTxt = new Text2('Score: 0', { size: 90, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var timerTxt = new Text2('20:00', { size: 90, fill: "#fff" }); timerTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timerTxt); var hpTxt = new Text2('HP: 5', { size: 90, fill: "#fff" }); hpTxt.anchor.set(1, 0); LK.gui.topRight.addChild(hpTxt); // Hide GUI elements until game starts scoreTxt.visible = false; timerTxt.visible = false; hpTxt.visible = false; // Play button event playBtn.down = function (x, y, obj) { // Remove cover and play button coverBg.visible = false; playBtn.visible = false; gameStarted = true; // Show GUI scoreTxt.visible = true; timerTxt.visible = true; hpTxt.visible = true; // Add main background var marsbg = LK.getAsset('marsbg', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(marsbg); // Spawn player in center player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Start music LK.playMusic('marsmusic'); // Initial GUI update updateScoreText(); updateTimerText(); updateHpText(); // Oyun başında ilk düşmanı doğur spawnEnemy(); lastEnemySpawn = LK.ticks; }; // Game variables var player; var enemies = []; var bullets = []; var powerups = []; var dragNode = null; var lastMoveX = 0, lastMoveY = 0; var score = 0; var timeLeft = 20 * 60; // 20 minutes in seconds, but we use frames (20*60*60) var timerFrames = 20 * 60 * 60; // 20 minutes * 60 seconds * 60 frames var lastEnemySpawn = 0; var enemySpawnInterval = 120; // 2 saniye * 60 fps = 120 frame (daha hızlı başlasın) var lastPowerupSpawn = 0; var powerupInterval = 600; // every 10 seconds (10*60) // GUI var scoreTxt = new Text2('Score: 0', { size: 90, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var timerTxt = new Text2('20:00', { size: 90, fill: "#fff" }); timerTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timerTxt); var hpTxt = new Text2('HP: 5', { size: 90, fill: "#fff" }); hpTxt.anchor.set(1, 0); LK.gui.topRight.addChild(hpTxt); function updateScoreText() { scoreTxt.setText('Score: ' + score); } function updateTimerText() { var seconds = Math.floor(timerFrames / 60); var min = Math.floor(seconds / 60); var sec = seconds % 60; var t = (min < 10 ? '0' : '') + min + ':' + (sec < 10 ? '0' : '') + sec; timerTxt.setText(t); } function updateHpText() { if (player) hpTxt.setText('HP: ' + player.hp); } // (Player, music, and first enemy spawn are now handled in playBtn.down) // Move handler (drag to move player) function handleMove(x, y, obj) { if (!gameStarted) return; if (dragNode) { // Clamp to game area var px = Math.max(player.radius, Math.min(2048 - player.radius, x)); var py = Math.max(player.radius, Math.min(2732 - player.radius, y)); dragNode.x = px; dragNode.y = py; lastMoveX = px; lastMoveY = py; // Ateş yönünü güncelle (basılı tutarken) if (isFiring) { var dx = x - player.x; var dy = y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { fireDirection.dx = dx / dist; fireDirection.dy = dy / dist; } } } } game.move = handleMove; var isFiring = false; var fireDirection = { dx: 0, dy: -1 }; // Varsayılan yukarı game.down = function (x, y, obj) { if (!gameStarted) return; // Sadece karakterin üstüne basılı tutulduğunda karakteri hareket ettir var dx = x - player.x; var dy = y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); // Eğer dokunulan nokta karakterin üstündeyse (yarıçap dahil) if (dist <= player.radius) { dragNode = player; handleMove(x, y, obj); isFiring = false; // karakteri hareket ettirirken ateş etme } else if (x > 100 || y > 100) { // Karakterin dışında bir yere basıldıysa ateş et isFiring = true; // Ateş yönünü belirle if (dist > 0) { fireDirection.dx = dx / dist; fireDirection.dy = dy / dist; } else { fireDirection.dx = 0; fireDirection.dy = -1; } // Hemen ateş et fireBullets(); } }; game.up = function (x, y, obj) { if (!gameStarted) return; dragNode = null; isFiring = false; }; // Fire bullets when called (manual fire) function fireBullets() { if (LK.ticks - player.lastShot < player.fireRate) return; player.lastShot = LK.ticks; var spread = player.bulletSpread; var angles = [0]; if (spread > 0) { angles = [-spread, 0, spread]; } for (var i = 0; i < angles.length; i++) { var baseAngle = Math.atan2(fireDirection.dy, fireDirection.dx); var angle = baseAngle + angles[i] * Math.PI / 180; var b = new Bullet(); b.x = player.x; b.y = player.y; b.speed = player.bulletSpeed; b.dx = Math.cos(angle); b.dy = Math.sin(angle); bullets.push(b); game.addChild(b); } LK.getSound('shoot').play(); } // Spawn enemies at random edge function spawnEnemy() { var e = new Enemy(); // Pick random edge var edge = Math.floor(Math.random() * 4); var ex, ey; if (edge === 0) { // top ex = Math.random() * 2048; ey = -e.radius - 10; } else if (edge === 1) { // right ex = 2048 + e.radius + 10; ey = Math.random() * 2732; } else if (edge === 2) { // bottom ex = Math.random() * 2048; ey = 2732 + e.radius + 10; } else { // left ex = -e.radius - 10; ey = Math.random() * 2732; } e.x = ex; e.y = ey; e.target = player; enemies.push(e); game.addChild(e); } // Spawn powerup at random location function spawnPowerup() { var p = new Powerup(); p.type = 'hp'; // Sadece hp powerup p.x = 200 + Math.random() * (2048 - 400); p.y = 200 + Math.random() * (2732 - 400); powerups.push(p); game.addChild(p); } // Main update loop game.update = function () { if (!gameStarted) return; // Timer if (timerFrames > 0) { timerFrames--; updateTimerText(); } if (timerFrames === 0) { LK.effects.flashScreen(0x00ff00, 1200); LK.showYouWin(); return; } // Player update player.update(); // Fire bullets only every 3 seconds (180 frames) if (typeof lastAllowedFire === "undefined") { lastAllowedFire = 0; } // Fire bullets only if player is pressing (isFiring) // If there is at least one enemy, auto-fire at the nearest enemy if (enemies.length > 0) { // Find nearest enemy var nearest = null; var minDist = Infinity; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; var dx = e.x - player.x; var dy = e.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; nearest = e; } } if (nearest) { // Set fire direction toward nearest enemy var dx = nearest.x - player.x; var dy = nearest.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { fireDirection.dx = dx / dist; fireDirection.dy = dy / dist; } else { fireDirection.dx = 0; fireDirection.dy = -1; } if (LK.ticks - lastAllowedFire >= 90) { fireBullets(); lastAllowedFire = LK.ticks; } } } else if (isFiring) { if (LK.ticks - lastAllowedFire >= 90) { fireBullets(); lastAllowedFire = LK.ticks; } } // Bullets update for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Remove if off screen if (b.x < -60 || b.x > 2048 + 60 || b.y < -60 || b.y > 2732 + 60) { b.destroy(); bullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; var dx = b.x - e.x; var dy = b.y - e.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < b.radius + e.radius) { e.hp = 1; // 1 mermi 1 düşman öldürsün e.hit(); if (e.hp <= 0) { e.destroy(); enemies.splice(j, 1); score += 10; updateScoreText(); } b.destroy(); bullets.splice(i, 1); break; } } } // Enemies update for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); // Check collision with player var dx = e.x - player.x; var dy = e.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < e.radius + player.radius) { player.hit(); e.destroy(); enemies.splice(i, 1); continue; } // Remove if off screen (shouldn't happen, but just in case) if (e.x < -200 || e.x > 2048 + 200 || e.y < -200 || e.y > 2732 + 200) { e.destroy(); enemies.splice(i, 1); } } // Powerups update for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; // Check collision with player var dx = p.x - player.x; var dy = p.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < p.radius + player.radius) { player.applyPowerup(p.type); LK.getSound('powerup').play(); p.destroy(); powerups.splice(i, 1); continue; } } // Enemy spawn logic (increase spawn rate over time) // Düşman sadece 5 saniyede bir tane doğsun ve sayısı 10 saniyede bir artsın if (typeof enemyPerSpawn === "undefined") { enemyPerSpawn = 1; lastEnemyPerSpawnIncrease = LK.ticks; } if (LK.ticks - lastEnemyPerSpawnIncrease >= 600) { // 10 saniye = 10*60 = 600 frame enemyPerSpawn += 1; lastEnemyPerSpawnIncrease += 600; // Artışı tam 10 saniyede bir yap } // Her 5 saniyede bir (300 frame) sadece enemyPerSpawn kadar düşman doğur if (LK.ticks - lastEnemySpawn >= 300) { for (var i = 0; i < enemyPerSpawn; i++) { spawnEnemy(); } lastEnemySpawn = LK.ticks; } // Powerup spawn logic if (LK.ticks - lastPowerupSpawn > powerupInterval) { spawnPowerup(); lastPowerupSpawn = LK.ticks; } }; // (Initial GUI update and enemy spawn are now handled in playBtn.down)
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = bulletSprite.width * 0.5;
self.speed = 32;
self.dx = 0;
self.dy = 0;
self.update = function () {
self.x += self.dx * self.speed;
self.y += self.dy * self.speed;
};
return self;
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemySprite.width * 0.5;
self.speed = 2 + Math.random() * 1.2;
self.hp = 2;
self.target = null; // set to player
self.update = function () {
if (!self.target) return;
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
};
self.hit = function () {
self.hp--;
LK.getSound('enemyhit').play();
LK.effects.flashObject(self, 0xffffff, 120);
if (self.hp <= 0) {
self.destroyed = true;
}
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerSprite.width * 0.5;
self.speed = 18;
self.hp = 5;
self.invuln = 0; // frames of invulnerability after hit
// For upgrades
self.fireRate = 60; // frames between shots (1 saniye)
self.bulletSpeed = 32;
self.bulletSpread = 0; // degrees
self.lastShot = 0;
self.update = function () {
if (self.invuln > 0) {
self.invuln--;
playerSprite.alpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.4);
} else {
playerSprite.alpha = 1;
}
};
// Called when player is hit
self.hit = function () {
if (self.invuln > 0) return;
self.hp--;
self.invuln = 60;
LK.effects.flashObject(self, 0xff0000, 400);
LK.getSound('playerhit').play();
updateHpText();
if (self.hp <= 0) {
LK.effects.flashScreen(0xff0000, 1200);
LK.showGameOver();
}
};
// Called when player picks up a powerup
self.applyPowerup = function (type) {
if (type === 'firerate') {
self.fireRate = Math.max(8, self.fireRate - 4);
} else if (type === 'spread') {
self.bulletSpread = Math.min(30, self.bulletSpread + 10);
} else if (type === 'hp') {
self.hp = Math.min(8, self.hp + 1);
updateHpText();
} else if (type === 'bulletspeed') {
self.bulletSpeed = Math.min(48, self.bulletSpeed + 4);
}
};
return self;
});
// Powerup class
var Powerup = Container.expand(function () {
var self = Container.call(this);
var powerupSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = powerupSprite.width * 0.5;
self.type = 'firerate'; // default, can be changed
self.update = function () {};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x7c3f1c
});
/****
* Game Code
****/
// Add background
// Play button and cover logic
var coverBg = LK.getAsset('Playbg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(coverBg);
// Create Play button as a container with Playbg as background
var playBtn = new Container();
var playBgSprite = LK.getAsset('Playbg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
playBtn.addChild(playBgSprite);
var playText = new Text2('PLAY', {
size: 200,
fill: "#fff",
font: "Impact, Arial Black, Tahoma"
});
playText.anchor.set(0.5, 0.5);
playText.x = 0;
playText.y = 0;
playBtn.addChild(playText);
playBtn.x = 2048 / 2;
playBtn.y = 2732 / 2 + 300;
playBtn.interactive = true;
playBtn.buttonMode = true;
game.addChild(playBtn);
// Hide game UI and logic until play is pressed
var gameStarted = false;
// GUI
var scoreTxt = new Text2('Score: 0', {
size: 90,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var timerTxt = new Text2('20:00', {
size: 90,
fill: "#fff"
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
var hpTxt = new Text2('HP: 5', {
size: 90,
fill: "#fff"
});
hpTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(hpTxt);
// Hide GUI elements until game starts
scoreTxt.visible = false;
timerTxt.visible = false;
hpTxt.visible = false;
// Play button event
playBtn.down = function (x, y, obj) {
// Remove cover and play button
coverBg.visible = false;
playBtn.visible = false;
gameStarted = true;
// Show GUI
scoreTxt.visible = true;
timerTxt.visible = true;
hpTxt.visible = true;
// Add main background
var marsbg = LK.getAsset('marsbg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(marsbg);
// Spawn player in center
player = new Player();
player.x = 2048 / 2;
player.y = 2732 / 2;
game.addChild(player);
// Start music
LK.playMusic('marsmusic');
// Initial GUI update
updateScoreText();
updateTimerText();
updateHpText();
// Oyun başında ilk düşmanı doğur
spawnEnemy();
lastEnemySpawn = LK.ticks;
};
// Game variables
var player;
var enemies = [];
var bullets = [];
var powerups = [];
var dragNode = null;
var lastMoveX = 0,
lastMoveY = 0;
var score = 0;
var timeLeft = 20 * 60; // 20 minutes in seconds, but we use frames (20*60*60)
var timerFrames = 20 * 60 * 60; // 20 minutes * 60 seconds * 60 frames
var lastEnemySpawn = 0;
var enemySpawnInterval = 120; // 2 saniye * 60 fps = 120 frame (daha hızlı başlasın)
var lastPowerupSpawn = 0;
var powerupInterval = 600; // every 10 seconds (10*60)
// GUI
var scoreTxt = new Text2('Score: 0', {
size: 90,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var timerTxt = new Text2('20:00', {
size: 90,
fill: "#fff"
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
var hpTxt = new Text2('HP: 5', {
size: 90,
fill: "#fff"
});
hpTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(hpTxt);
function updateScoreText() {
scoreTxt.setText('Score: ' + score);
}
function updateTimerText() {
var seconds = Math.floor(timerFrames / 60);
var min = Math.floor(seconds / 60);
var sec = seconds % 60;
var t = (min < 10 ? '0' : '') + min + ':' + (sec < 10 ? '0' : '') + sec;
timerTxt.setText(t);
}
function updateHpText() {
if (player) hpTxt.setText('HP: ' + player.hp);
}
// (Player, music, and first enemy spawn are now handled in playBtn.down)
// Move handler (drag to move player)
function handleMove(x, y, obj) {
if (!gameStarted) return;
if (dragNode) {
// Clamp to game area
var px = Math.max(player.radius, Math.min(2048 - player.radius, x));
var py = Math.max(player.radius, Math.min(2732 - player.radius, y));
dragNode.x = px;
dragNode.y = py;
lastMoveX = px;
lastMoveY = py;
// Ateş yönünü güncelle (basılı tutarken)
if (isFiring) {
var dx = x - player.x;
var dy = y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
fireDirection.dx = dx / dist;
fireDirection.dy = dy / dist;
}
}
}
}
game.move = handleMove;
var isFiring = false;
var fireDirection = {
dx: 0,
dy: -1
}; // Varsayılan yukarı
game.down = function (x, y, obj) {
if (!gameStarted) return;
// Sadece karakterin üstüne basılı tutulduğunda karakteri hareket ettir
var dx = x - player.x;
var dy = y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
// Eğer dokunulan nokta karakterin üstündeyse (yarıçap dahil)
if (dist <= player.radius) {
dragNode = player;
handleMove(x, y, obj);
isFiring = false; // karakteri hareket ettirirken ateş etme
} else if (x > 100 || y > 100) {
// Karakterin dışında bir yere basıldıysa ateş et
isFiring = true;
// Ateş yönünü belirle
if (dist > 0) {
fireDirection.dx = dx / dist;
fireDirection.dy = dy / dist;
} else {
fireDirection.dx = 0;
fireDirection.dy = -1;
}
// Hemen ateş et
fireBullets();
}
};
game.up = function (x, y, obj) {
if (!gameStarted) return;
dragNode = null;
isFiring = false;
};
// Fire bullets when called (manual fire)
function fireBullets() {
if (LK.ticks - player.lastShot < player.fireRate) return;
player.lastShot = LK.ticks;
var spread = player.bulletSpread;
var angles = [0];
if (spread > 0) {
angles = [-spread, 0, spread];
}
for (var i = 0; i < angles.length; i++) {
var baseAngle = Math.atan2(fireDirection.dy, fireDirection.dx);
var angle = baseAngle + angles[i] * Math.PI / 180;
var b = new Bullet();
b.x = player.x;
b.y = player.y;
b.speed = player.bulletSpeed;
b.dx = Math.cos(angle);
b.dy = Math.sin(angle);
bullets.push(b);
game.addChild(b);
}
LK.getSound('shoot').play();
}
// Spawn enemies at random edge
function spawnEnemy() {
var e = new Enemy();
// Pick random edge
var edge = Math.floor(Math.random() * 4);
var ex, ey;
if (edge === 0) {
// top
ex = Math.random() * 2048;
ey = -e.radius - 10;
} else if (edge === 1) {
// right
ex = 2048 + e.radius + 10;
ey = Math.random() * 2732;
} else if (edge === 2) {
// bottom
ex = Math.random() * 2048;
ey = 2732 + e.radius + 10;
} else {
// left
ex = -e.radius - 10;
ey = Math.random() * 2732;
}
e.x = ex;
e.y = ey;
e.target = player;
enemies.push(e);
game.addChild(e);
}
// Spawn powerup at random location
function spawnPowerup() {
var p = new Powerup();
p.type = 'hp'; // Sadece hp powerup
p.x = 200 + Math.random() * (2048 - 400);
p.y = 200 + Math.random() * (2732 - 400);
powerups.push(p);
game.addChild(p);
}
// Main update loop
game.update = function () {
if (!gameStarted) return;
// Timer
if (timerFrames > 0) {
timerFrames--;
updateTimerText();
}
if (timerFrames === 0) {
LK.effects.flashScreen(0x00ff00, 1200);
LK.showYouWin();
return;
}
// Player update
player.update();
// Fire bullets only every 3 seconds (180 frames)
if (typeof lastAllowedFire === "undefined") {
lastAllowedFire = 0;
}
// Fire bullets only if player is pressing (isFiring)
// If there is at least one enemy, auto-fire at the nearest enemy
if (enemies.length > 0) {
// Find nearest enemy
var nearest = null;
var minDist = Infinity;
for (var i = 0; i < enemies.length; i++) {
var e = enemies[i];
var dx = e.x - player.x;
var dy = e.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < minDist) {
minDist = dist;
nearest = e;
}
}
if (nearest) {
// Set fire direction toward nearest enemy
var dx = nearest.x - player.x;
var dy = nearest.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
fireDirection.dx = dx / dist;
fireDirection.dy = dy / dist;
} else {
fireDirection.dx = 0;
fireDirection.dy = -1;
}
if (LK.ticks - lastAllowedFire >= 90) {
fireBullets();
lastAllowedFire = LK.ticks;
}
}
} else if (isFiring) {
if (LK.ticks - lastAllowedFire >= 90) {
fireBullets();
lastAllowedFire = LK.ticks;
}
}
// Bullets update
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
b.update();
// Remove if off screen
if (b.x < -60 || b.x > 2048 + 60 || b.y < -60 || b.y > 2732 + 60) {
b.destroy();
bullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
var dx = b.x - e.x;
var dy = b.y - e.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < b.radius + e.radius) {
e.hp = 1; // 1 mermi 1 düşman öldürsün
e.hit();
if (e.hp <= 0) {
e.destroy();
enemies.splice(j, 1);
score += 10;
updateScoreText();
}
b.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Enemies update
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
e.update();
// Check collision with player
var dx = e.x - player.x;
var dy = e.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < e.radius + player.radius) {
player.hit();
e.destroy();
enemies.splice(i, 1);
continue;
}
// Remove if off screen (shouldn't happen, but just in case)
if (e.x < -200 || e.x > 2048 + 200 || e.y < -200 || e.y > 2732 + 200) {
e.destroy();
enemies.splice(i, 1);
}
}
// Powerups update
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
// Check collision with player
var dx = p.x - player.x;
var dy = p.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < p.radius + player.radius) {
player.applyPowerup(p.type);
LK.getSound('powerup').play();
p.destroy();
powerups.splice(i, 1);
continue;
}
}
// Enemy spawn logic (increase spawn rate over time)
// Düşman sadece 5 saniyede bir tane doğsun ve sayısı 10 saniyede bir artsın
if (typeof enemyPerSpawn === "undefined") {
enemyPerSpawn = 1;
lastEnemyPerSpawnIncrease = LK.ticks;
}
if (LK.ticks - lastEnemyPerSpawnIncrease >= 600) {
// 10 saniye = 10*60 = 600 frame
enemyPerSpawn += 1;
lastEnemyPerSpawnIncrease += 600; // Artışı tam 10 saniyede bir yap
}
// Her 5 saniyede bir (300 frame) sadece enemyPerSpawn kadar düşman doğur
if (LK.ticks - lastEnemySpawn >= 300) {
for (var i = 0; i < enemyPerSpawn; i++) {
spawnEnemy();
}
lastEnemySpawn = LK.ticks;
}
// Powerup spawn logic
if (LK.ticks - lastPowerupSpawn > powerupInterval) {
spawnPowerup();
lastPowerupSpawn = LK.ticks;
}
};
// (Initial GUI update and enemy spawn are now handled in playBtn.down)
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Mars: 20 Minutes Till Dawn" and with the description "A 2D top-down shooter on Mars where you survive waves of alien enemies for 20 minutes, collecting power-ups and upgrading weapons to last as long as possible.". No text on banner!
Sarı mermi olsun. In-Game asset. 2d. High contrast. No shadows
Pixel astronot olsun. Elbisesi turıncu olsun. In-Game asset. 2d. High contrast. No shadows
Pixel uzaylı olsun. In-Game asset. 2d. High contrast. No shadows
Pixel Mars zemini olsun. Top down olsun. In-Game asset. 2d. High contrast. No shadows
Pixel kalp. In-Game asset. 2d. High contrast. No shadows
pixel ufo. In-Game asset. 2d. High contrast. No shadows