User prompt
Tıkladığımda sadece oyuncu arabası hızlansın Bosscar hızlanmasın
User prompt
Süre sayacının boyutunu 0.1 arttır
User prompt
Skor sayacı, level sayacı ve süre sayacı aynı düzlemde yan yana dursun
User prompt
Seviye 1 yerine Level 1 yazsın
User prompt
Skor Sayacının boyutunu 0.10 düşür
User prompt
Skor sayacının boyutunu 0.5 düşür
User prompt
Skor Sayacının boyutunu 0.10 düşür
User prompt
Skor: yerine Score: yap
User prompt
Süre, Kill ve Seviye sayaçlarının aralarındaki mesafeyi biraz arttır. Kill Sayacının Yanına Skor: ekle ve Skor sayılsın
User prompt
Süre ve Kill sayaçlarının ortasına bir Seviye Sayacı ekle Seviye 1 den başlasında Bosscar öldükten sonra Seviye 2 ye çıksın
User prompt
Bosscarın hareket hızını arttır.
User prompt
Bosscar, oyuncu arabasının yakınındayken oyuncu arabası Bosscara atış yapabiliyor olsun. Diğer arabalardaki mesafe kullanılsın
User prompt
Oyuncu arabasının menzili Bosscar dahil olduğunda da diğer araçlarda olduğu gibi olsun
User prompt
Oyuncu arabası diğer arabalara vurduğu saldırı hızıyla BossCara vursun
User prompt
Oyuncu arabası tek tek 0.5 saniyede bir ateş atsın.
User prompt
10 kill aldıktan sonra Bosscar gelsin.
User prompt
Bosscara da diğer araçlara vurduğu hızda vursun.
User prompt
Bosscara da oyuncu arabası ateş etsin ve hasar versin.
User prompt
20 kill aldıktan sonra Bosscar gelsin. Bosscar geldikten sonra diğer araçlar doğmasın.
User prompt
10 öldürme sonunda alt kenarından can barımız çıksın tam dolu şekilde ekranın sol altında belirsin onunla birlikte 1 adet büyük final stage boss gelsin ve onunda canı full olsun ekranın sol üstünde de onun canı gözüksün her vuruş yaptığımızda canı gitsin ve üstümüze doğru gelerek bizi öldürmeye çalışsın
User prompt
Mouse hareket etmediğinde oyuncu arabası da dursun
User prompt
Mouse hareket etmediğinde oyuncu arbası da dursun
User prompt
Mouse hareket etmediğinde oyuncu arabası da hareket etmesin
User prompt
Mouse durduğunda oyuncu arabası da dursun
User prompt
mouse sabit kaldığında oyuncu arabası da dursun,
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet Class var Bullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); // Direction vector self.dirX = 0; self.dirY = -1; // Speed self.speed = 38; // For collision self.radius = 30; // Update self.update = function () { self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; }; // Set direction self.setDirection = function (dx, dy) { var len = Math.sqrt(dx * dx + dy * dy); if (len > 0.01) { self.dirX = dx / len; self.dirY = dy / len; } }; return self; }); // Enemy Car Class var EnemyCar = Container.expand(function () { var self = Container.call(this); var car = self.attachAsset('enemyCar', { anchorX: 0.5, anchorY: 0.5 }); // Target position (player car) self.targetX = 2048 / 2; self.targetY = 2732 / 2; // Speed (pixels per tick) self.speed = 7; // Direction vector self.dirX = 0; self.dirY = 1; // For collision self.radius = 90; // Update method self.update = function () { // Move toward target (player car) var dx = self.targetX - self.x; var dy = self.targetY - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0.01) { self.dirX = dx / len; self.dirY = dy / len; // Enemy car speed is always self.speed, never boosted self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; // Rotate car to face movement car.rotation = Math.atan2(self.dirY, self.dirX) + Math.PI / 2; } }; // Set target (player car position) self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; }; return self; }); // Player Car Class var PlayerCar = Container.expand(function () { var self = Container.call(this); // Attach car asset, anchor center var car = self.attachAsset('playerCar', { anchorX: 0.5, anchorY: 0.5 }); // For visual orientation, add a "gun" at the top (optional) // Not required for MVP // Movement speed (pixels per tick) self.baseSpeed = 12; self.boostSpeed = 24; self.currentSpeed = self.baseSpeed; // Direction vector (normalized) self.dirX = 0; self.dirY = -1; // Set initial position to center self.x = 2048 / 2; self.y = 2732 / 2; // For auto-shoot cooldown self.shootCooldown = 0; // Update method: called every tick self.update = function () { // Move in direction of pointer self.x += self.dirX * self.currentSpeed; self.y += self.dirY * self.currentSpeed; // Clamp to game area (keep inside bounds) if (self.x < 90) self.x = 90; if (self.x > 2048 - 90) self.x = 2048 - 90; if (self.y < 160) self.y = 160; if (self.y > 2732 - 160) self.y = 2732 - 160; // Cooldown for shooting if (self.shootCooldown > 0) self.shootCooldown--; }; // Set direction toward pointer self.setDirection = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0.01) { self.dirX = dx / len; self.dirY = dy / len; // Rotate car to face direction car.rotation = Math.atan2(self.dirY, self.dirX) + Math.PI / 2; } }; // Boost on press self.setBoost = function (boosting) { self.currentSpeed = boosting ? self.boostSpeed : self.baseSpeed; }; return self; }); // SkillBox Class var SkillBox = Container.expand(function () { var self = Container.call(this); // Use a yellow box for skill box var box = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2 }); self.radius = 40; self.type = "multiShot"; // Animate (optional): pulse if (typeof tween === "function" && typeof box !== "undefined" && box !== null) { var tw = tween(box); if (tw && typeof tw.to === "function") { tw.to({ scaleX: 1.5, scaleY: 1.5 }, 400).yoyo(true).repeat(Infinity).start(); } } // Update: can float up a bit self.floatDir = 1; self.floatTicks = 0; self.update = function () { self.floatTicks++; if (self.floatTicks % 30 === 0) self.floatDir *= -1; self.y += self.floatDir * 0.7; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // --- Global variables --- // Player car: blue box // Enemy car: red box // Bullet: yellow ellipse var player = new PlayerCar(); game.addChild(player); var enemies = []; var bullets = []; var skillBoxes = []; // Skill state var multiShotActive = false; var multiShotTicks = 0; var MULTISHOT_DURATION = 600; // 10 seconds at 60fps // Score var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); // right align score // Timer text (elapsed time in seconds, right of score) var timerTxt = new Text2('0:00', { size: 90, fill: 0xFFFFFF }); timerTxt.anchor.set(0, 0); // left align timer // Position score and timer with more space between them scoreTxt.x = LK.gui.top.width / 2 - 120; // move score further left of center for more space scoreTxt.y = 0; timerTxt.x = LK.gui.top.width / 2 + 120; // move timer further right of center for more space timerTxt.y = 20; LK.gui.top.addChild(scoreTxt); LK.gui.top.addChild(timerTxt); // For pointer tracking var pointerX = 2048 / 2; var pointerY = 2732 / 2; // Track last pointer position and idle ticks var lastPointerX = pointerX; var lastPointerY = pointerY; var pointerIdleTicks = 0; // For boost var boosting = false; // For enemy spawn timer var enemySpawnTicks = 0; // Dynamic spawn interval variables var ENEMY_SPAWN_INTERVAL_START = 180; // 3 seconds at 60fps var ENEMY_SPAWN_INTERVAL_END = 60; // 1 second at 60fps var ENEMY_SPAWN_INTERVAL = ENEMY_SPAWN_INTERVAL_START; // Timer for game progression (in ticks) var gameTimerTicks = 0; var GAME_TIMER_MAX = 60 * 60; // 60 seconds to reach max difficulty // --- Event Handlers --- // Move: update pointer position and direction function handleMove(x, y, obj) { // Clamp pointer to game area (avoid top left 100x100) if (x < 100) x = 100; if (y < 100) y = 100; if (x > 2048 - 100) x = 2048 - 100; if (y > 2732 - 100) y = 2732 - 100; pointerX = x; pointerY = y; player.setDirection(pointerX, pointerY); } game.move = handleMove; // Down: boost on press game.down = function (x, y, obj) { boosting = true; // Only boost the player's car, not enemy cars player.setBoost(true); handleMove(x, y, obj); }; // Up: stop boost game.up = function (x, y, obj) { boosting = false; // Only stop boost for the player's car, not enemy cars player.setBoost(false); }; // --- Main Game Loop --- game.update = function () { // Update pointer idle ticks if (pointerX === lastPointerX && pointerY === lastPointerY) { pointerIdleTicks++; } else { pointerIdleTicks = 0; lastPointerX = pointerX; lastPointerY = pointerY; } // If pointer hasn't moved for 6 frames (~0.1s), stop player car if (pointerIdleTicks > 5) { player.dirX = 0; player.dirY = 0; } // Update player player.update(); // --- Timer and Dynamic Enemy Spawning --- gameTimerTicks++; // Update timer text (show mm:ss) var elapsedSec = Math.floor(gameTimerTicks / 60); var min = Math.floor(elapsedSec / 60); var sec = elapsedSec % 60; timerTxt.setText(min + ':' + (sec < 10 ? '0' : '') + sec); // Calculate progression (0 to 1) var progress = Math.min(gameTimerTicks / GAME_TIMER_MAX, 1); // Linearly interpolate spawn interval from start to end ENEMY_SPAWN_INTERVAL = Math.round(ENEMY_SPAWN_INTERVAL_START + (ENEMY_SPAWN_INTERVAL_END - ENEMY_SPAWN_INTERVAL_START) * progress); enemySpawnTicks++; // Determine how many enemies to spawn this cycle (1 + extra for every 10 kills) var spawnCount = 1 + Math.floor(score / 10); if (enemySpawnTicks >= ENEMY_SPAWN_INTERVAL) { enemySpawnTicks = 0; for (var spawnIdx = 0; spawnIdx < spawnCount; spawnIdx++) { // Spawn enemy at random edge var edge = Math.floor(Math.random() * 4); // 0:top, 1:right, 2:bottom, 3:left var ex, ey; if (edge === 0) { // top ex = 200 + Math.random() * (2048 - 400); ey = -160; } else if (edge === 1) { // right ex = 2048 + 160; ey = 200 + Math.random() * (2732 - 400); } else if (edge === 2) { // bottom ex = 200 + Math.random() * (2048 - 400); ey = 2732 + 160; } else { // left ex = -160; ey = 200 + Math.random() * (2732 - 400); } var enemy = new EnemyCar(); enemy.x = ex; enemy.y = ey; enemy.setTarget(player.x, player.y); enemies.push(enemy); game.addChild(enemy); } } // --- Update Enemies --- for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.setTarget(player.x, player.y); enemy.update(); // Check collision with player (circle collision) var dx = enemy.x - player.x; var dy = enemy.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 160) { // Game over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // --- Auto-shoot at nearest enemy --- // Only if there are enemies and cooldown is 0 if (enemies.length > 0 && player.shootCooldown === 0) { // Find nearest enemy var minDist = 999999; var nearest = null; for (var i = 0; i < enemies.length; i++) { var dx = enemies[i].x - player.x; var dy = enemies[i].y - player.y; var d = dx * dx + dy * dy; if (d < minDist) { minDist = d; nearest = enemies[i]; } } if (nearest) { // Multi-shot: fire 3 bullets in a spread if skill is active var numBullets = multiShotActive ? 3 : 1; var spread = multiShotActive ? Math.PI / 8 : 0; // 22.5 deg spread var carDir = Math.atan2(player.dirY, player.dirX); for (var b = 0; b < numBullets; b++) { var bullet = new Bullet(); // Place bullet at top of car (offset in direction of car) var offsetX = Math.cos(carDir) * 180; var offsetY = Math.sin(carDir) * 180; bullet.x = player.x + offsetX; bullet.y = player.y + offsetY; // Direction: from bullet to enemy, with spread var angle = Math.atan2(nearest.y - bullet.y, nearest.x - bullet.x); if (numBullets > 1) { angle += spread * (b - (numBullets - 1) / 2); } var bdx = Math.cos(angle); var bdy = Math.sin(angle); bullet.setDirection(bdx, bdy); bullets.push(bullet); game.addChild(bullet); } player.shootCooldown = 30; // 0.5s cooldown } } // --- Update Skill Boxes --- for (var s = skillBoxes.length - 1; s >= 0; s--) { var box = skillBoxes[s]; box.update && box.update(); // Collect if player overlaps var dx = box.x - player.x; var dy = box.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 120) { // Activate multi-shot multiShotActive = true; multiShotTicks = MULTISHOT_DURATION; box.destroy(); skillBoxes.splice(s, 1); continue; } // Remove if out of bounds if (box.x < -200 || box.x > 2048 + 200 || box.y < -200 || box.y > 2732 + 200) { box.destroy(); skillBoxes.splice(s, 1); continue; } } // --- 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 < -100 || bullet.x > 2048 + 100 || bullet.y < -100 || bullet.y > 2732 + 100) { 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]; var dx = bullet.x - enemy.x; var dy = bullet.y - enemy.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 100) { // Hit! hit = true; // Remove enemy // --- Skill box spawn logic --- var spawnSkill = false; if (score >= 10 && Math.random() < 0.5) { // 50% chance after 10 kills spawnSkill = true; } var skillBoxSpawned = false; if (spawnSkill) { var skillBox = new SkillBox(); skillBox.x = enemy.x; skillBox.y = enemy.y; skillBoxes.push(skillBox); game.addChild(skillBox); skillBoxSpawned = true; } // Remove enemy enemy.destroy(); enemies.splice(j, 1); // Remove bullet bullet.destroy(); bullets.splice(i, 1); // Score score++; scoreTxt.setText(score); break; } } if (hit) continue; } // --- Camera: keep player centered --- // (In LK, the game area is fixed, so we simulate by keeping player in center and moving everything else if needed) // For MVP, player always stays in center, so no need to move camera. // --- Decrement player shoot cooldown --- if (player.shootCooldown > 0) player.shootCooldown--; // --- Decrement multi-shot skill duration --- if (multiShotActive) { multiShotTicks--; if (multiShotTicks <= 0) { multiShotActive = false; } } }; // --- Initial pointer direction --- player.setDirection(pointerX, pointerY);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Bullet Class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bullet = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Direction vector
self.dirX = 0;
self.dirY = -1;
// Speed
self.speed = 38;
// For collision
self.radius = 30;
// Update
self.update = function () {
self.x += self.dirX * self.speed;
self.y += self.dirY * self.speed;
};
// Set direction
self.setDirection = function (dx, dy) {
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0.01) {
self.dirX = dx / len;
self.dirY = dy / len;
}
};
return self;
});
// Enemy Car Class
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('enemyCar', {
anchorX: 0.5,
anchorY: 0.5
});
// Target position (player car)
self.targetX = 2048 / 2;
self.targetY = 2732 / 2;
// Speed (pixels per tick)
self.speed = 7;
// Direction vector
self.dirX = 0;
self.dirY = 1;
// For collision
self.radius = 90;
// Update method
self.update = function () {
// Move toward target (player car)
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0.01) {
self.dirX = dx / len;
self.dirY = dy / len;
// Enemy car speed is always self.speed, never boosted
self.x += self.dirX * self.speed;
self.y += self.dirY * self.speed;
// Rotate car to face movement
car.rotation = Math.atan2(self.dirY, self.dirX) + Math.PI / 2;
}
};
// Set target (player car position)
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
};
return self;
});
// Player Car Class
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
// Attach car asset, anchor center
var car = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
// For visual orientation, add a "gun" at the top (optional)
// Not required for MVP
// Movement speed (pixels per tick)
self.baseSpeed = 12;
self.boostSpeed = 24;
self.currentSpeed = self.baseSpeed;
// Direction vector (normalized)
self.dirX = 0;
self.dirY = -1;
// Set initial position to center
self.x = 2048 / 2;
self.y = 2732 / 2;
// For auto-shoot cooldown
self.shootCooldown = 0;
// Update method: called every tick
self.update = function () {
// Move in direction of pointer
self.x += self.dirX * self.currentSpeed;
self.y += self.dirY * self.currentSpeed;
// Clamp to game area (keep inside bounds)
if (self.x < 90) self.x = 90;
if (self.x > 2048 - 90) self.x = 2048 - 90;
if (self.y < 160) self.y = 160;
if (self.y > 2732 - 160) self.y = 2732 - 160;
// Cooldown for shooting
if (self.shootCooldown > 0) self.shootCooldown--;
};
// Set direction toward pointer
self.setDirection = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0.01) {
self.dirX = dx / len;
self.dirY = dy / len;
// Rotate car to face direction
car.rotation = Math.atan2(self.dirY, self.dirX) + Math.PI / 2;
}
};
// Boost on press
self.setBoost = function (boosting) {
self.currentSpeed = boosting ? self.boostSpeed : self.baseSpeed;
};
return self;
});
// SkillBox Class
var SkillBox = Container.expand(function () {
var self = Container.call(this);
// Use a yellow box for skill box
var box = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
self.radius = 40;
self.type = "multiShot";
// Animate (optional): pulse
if (typeof tween === "function" && typeof box !== "undefined" && box !== null) {
var tw = tween(box);
if (tw && typeof tw.to === "function") {
tw.to({
scaleX: 1.5,
scaleY: 1.5
}, 400).yoyo(true).repeat(Infinity).start();
}
}
// Update: can float up a bit
self.floatDir = 1;
self.floatTicks = 0;
self.update = function () {
self.floatTicks++;
if (self.floatTicks % 30 === 0) self.floatDir *= -1;
self.y += self.floatDir * 0.7;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// --- Global variables ---
// Player car: blue box
// Enemy car: red box
// Bullet: yellow ellipse
var player = new PlayerCar();
game.addChild(player);
var enemies = [];
var bullets = [];
var skillBoxes = [];
// Skill state
var multiShotActive = false;
var multiShotTicks = 0;
var MULTISHOT_DURATION = 600; // 10 seconds at 60fps
// Score
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0); // right align score
// Timer text (elapsed time in seconds, right of score)
var timerTxt = new Text2('0:00', {
size: 90,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0, 0); // left align timer
// Position score and timer with more space between them
scoreTxt.x = LK.gui.top.width / 2 - 120; // move score further left of center for more space
scoreTxt.y = 0;
timerTxt.x = LK.gui.top.width / 2 + 120; // move timer further right of center for more space
timerTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(timerTxt);
// For pointer tracking
var pointerX = 2048 / 2;
var pointerY = 2732 / 2;
// Track last pointer position and idle ticks
var lastPointerX = pointerX;
var lastPointerY = pointerY;
var pointerIdleTicks = 0;
// For boost
var boosting = false;
// For enemy spawn timer
var enemySpawnTicks = 0;
// Dynamic spawn interval variables
var ENEMY_SPAWN_INTERVAL_START = 180; // 3 seconds at 60fps
var ENEMY_SPAWN_INTERVAL_END = 60; // 1 second at 60fps
var ENEMY_SPAWN_INTERVAL = ENEMY_SPAWN_INTERVAL_START;
// Timer for game progression (in ticks)
var gameTimerTicks = 0;
var GAME_TIMER_MAX = 60 * 60; // 60 seconds to reach max difficulty
// --- Event Handlers ---
// Move: update pointer position and direction
function handleMove(x, y, obj) {
// Clamp pointer to game area (avoid top left 100x100)
if (x < 100) x = 100;
if (y < 100) y = 100;
if (x > 2048 - 100) x = 2048 - 100;
if (y > 2732 - 100) y = 2732 - 100;
pointerX = x;
pointerY = y;
player.setDirection(pointerX, pointerY);
}
game.move = handleMove;
// Down: boost on press
game.down = function (x, y, obj) {
boosting = true;
// Only boost the player's car, not enemy cars
player.setBoost(true);
handleMove(x, y, obj);
};
// Up: stop boost
game.up = function (x, y, obj) {
boosting = false;
// Only stop boost for the player's car, not enemy cars
player.setBoost(false);
};
// --- Main Game Loop ---
game.update = function () {
// Update pointer idle ticks
if (pointerX === lastPointerX && pointerY === lastPointerY) {
pointerIdleTicks++;
} else {
pointerIdleTicks = 0;
lastPointerX = pointerX;
lastPointerY = pointerY;
}
// If pointer hasn't moved for 6 frames (~0.1s), stop player car
if (pointerIdleTicks > 5) {
player.dirX = 0;
player.dirY = 0;
}
// Update player
player.update();
// --- Timer and Dynamic Enemy Spawning ---
gameTimerTicks++;
// Update timer text (show mm:ss)
var elapsedSec = Math.floor(gameTimerTicks / 60);
var min = Math.floor(elapsedSec / 60);
var sec = elapsedSec % 60;
timerTxt.setText(min + ':' + (sec < 10 ? '0' : '') + sec);
// Calculate progression (0 to 1)
var progress = Math.min(gameTimerTicks / GAME_TIMER_MAX, 1);
// Linearly interpolate spawn interval from start to end
ENEMY_SPAWN_INTERVAL = Math.round(ENEMY_SPAWN_INTERVAL_START + (ENEMY_SPAWN_INTERVAL_END - ENEMY_SPAWN_INTERVAL_START) * progress);
enemySpawnTicks++;
// Determine how many enemies to spawn this cycle (1 + extra for every 10 kills)
var spawnCount = 1 + Math.floor(score / 10);
if (enemySpawnTicks >= ENEMY_SPAWN_INTERVAL) {
enemySpawnTicks = 0;
for (var spawnIdx = 0; spawnIdx < spawnCount; spawnIdx++) {
// Spawn enemy at random edge
var edge = Math.floor(Math.random() * 4); // 0:top, 1:right, 2:bottom, 3:left
var ex, ey;
if (edge === 0) {
// top
ex = 200 + Math.random() * (2048 - 400);
ey = -160;
} else if (edge === 1) {
// right
ex = 2048 + 160;
ey = 200 + Math.random() * (2732 - 400);
} else if (edge === 2) {
// bottom
ex = 200 + Math.random() * (2048 - 400);
ey = 2732 + 160;
} else {
// left
ex = -160;
ey = 200 + Math.random() * (2732 - 400);
}
var enemy = new EnemyCar();
enemy.x = ex;
enemy.y = ey;
enemy.setTarget(player.x, player.y);
enemies.push(enemy);
game.addChild(enemy);
}
}
// --- Update Enemies ---
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.setTarget(player.x, player.y);
enemy.update();
// Check collision with player (circle collision)
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 160) {
// Game over
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// --- Auto-shoot at nearest enemy ---
// Only if there are enemies and cooldown is 0
if (enemies.length > 0 && player.shootCooldown === 0) {
// Find nearest enemy
var minDist = 999999;
var nearest = null;
for (var i = 0; i < enemies.length; i++) {
var dx = enemies[i].x - player.x;
var dy = enemies[i].y - player.y;
var d = dx * dx + dy * dy;
if (d < minDist) {
minDist = d;
nearest = enemies[i];
}
}
if (nearest) {
// Multi-shot: fire 3 bullets in a spread if skill is active
var numBullets = multiShotActive ? 3 : 1;
var spread = multiShotActive ? Math.PI / 8 : 0; // 22.5 deg spread
var carDir = Math.atan2(player.dirY, player.dirX);
for (var b = 0; b < numBullets; b++) {
var bullet = new Bullet();
// Place bullet at top of car (offset in direction of car)
var offsetX = Math.cos(carDir) * 180;
var offsetY = Math.sin(carDir) * 180;
bullet.x = player.x + offsetX;
bullet.y = player.y + offsetY;
// Direction: from bullet to enemy, with spread
var angle = Math.atan2(nearest.y - bullet.y, nearest.x - bullet.x);
if (numBullets > 1) {
angle += spread * (b - (numBullets - 1) / 2);
}
var bdx = Math.cos(angle);
var bdy = Math.sin(angle);
bullet.setDirection(bdx, bdy);
bullets.push(bullet);
game.addChild(bullet);
}
player.shootCooldown = 30; // 0.5s cooldown
}
}
// --- Update Skill Boxes ---
for (var s = skillBoxes.length - 1; s >= 0; s--) {
var box = skillBoxes[s];
box.update && box.update();
// Collect if player overlaps
var dx = box.x - player.x;
var dy = box.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
// Activate multi-shot
multiShotActive = true;
multiShotTicks = MULTISHOT_DURATION;
box.destroy();
skillBoxes.splice(s, 1);
continue;
}
// Remove if out of bounds
if (box.x < -200 || box.x > 2048 + 200 || box.y < -200 || box.y > 2732 + 200) {
box.destroy();
skillBoxes.splice(s, 1);
continue;
}
}
// --- 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 < -100 || bullet.x > 2048 + 100 || bullet.y < -100 || bullet.y > 2732 + 100) {
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];
var dx = bullet.x - enemy.x;
var dy = bullet.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 100) {
// Hit!
hit = true;
// Remove enemy
// --- Skill box spawn logic ---
var spawnSkill = false;
if (score >= 10 && Math.random() < 0.5) {
// 50% chance after 10 kills
spawnSkill = true;
}
var skillBoxSpawned = false;
if (spawnSkill) {
var skillBox = new SkillBox();
skillBox.x = enemy.x;
skillBox.y = enemy.y;
skillBoxes.push(skillBox);
game.addChild(skillBox);
skillBoxSpawned = true;
}
// Remove enemy
enemy.destroy();
enemies.splice(j, 1);
// Remove bullet
bullet.destroy();
bullets.splice(i, 1);
// Score
score++;
scoreTxt.setText(score);
break;
}
}
if (hit) continue;
}
// --- Camera: keep player centered ---
// (In LK, the game area is fixed, so we simulate by keeping player in center and moving everything else if needed)
// For MVP, player always stays in center, so no need to move camera.
// --- Decrement player shoot cooldown ---
if (player.shootCooldown > 0) player.shootCooldown--;
// --- Decrement multi-shot skill duration ---
if (multiShotActive) {
multiShotTicks--;
if (multiShotTicks <= 0) {
multiShotActive = false;
}
}
};
// --- Initial pointer direction ---
player.setDirection(pointerX, pointerY);
Kalitesini arttır
kalitesini arttır
kalitesini arttır yuvarlak olsun
remove the holes and get a flat land
mavi ve kırmızı renklerinde siyah çizgileri olan bir airdrop kutusu yap, kuş bakışı olsun üstten gözüksün. In-Game asset. 2d. High contrast. No shadows. bird eye
Bir tank savaşı temalı arkaplan görseli hazırla görselde 2 tank olsun ve bu 2 tankın önündeki 1 tankı yakalamaya çalışsın.. In-Game asset. 2d. High contrast. No shadows
daha kaliteli yap
War dropbox a bird view blue and red. In-Game asset. 2d. High contrast. No shadows. In-Game asset. 2d. High contrast. No shadows
real explosion. In-Game asset. 2d. High contrast. No shadows
Arka Planını temizle
clear background
Erase background