/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Monster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.shootCooldown = 0;
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
};
self.shoot = function (targetX, targetY) {
if (self.shootCooldown <= 0 && ammo > 0 && reloadTime <= 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.velocityX = dx / distance * 12;
bullet.velocityY = dy / distance * 12;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
self.shootCooldown = 10;
ammo--;
ammoText.setText('Ammo: ' + ammo + '/' + maxAmmo);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2d5a2d
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
var monsters = [];
var bullets = [];
var spawnTimer = 0;
var spawnRate = 120; // frames between spawns
var gameRunning = true;
var ammo = 10;
var maxAmmo = 10;
var reloadTime = 0;
var reloadDuration = 180; // 3 seconds at 60fps
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 50,
fill: 0xFF4444
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 50;
LK.gui.topLeft.addChild(healthText);
var ammoText = new Text2('Ammo: 10/10', {
size: 50,
fill: 0x44FF44
});
ammoText.anchor.set(0, 0);
ammoText.x = 150;
ammoText.y = 120;
LK.gui.topLeft.addChild(ammoText);
function spawnMonster() {
var monster = new Monster();
// Spawn from random edge
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
// Top
monster.x = Math.random() * 2048;
monster.y = -30;
break;
case 1:
// Right
monster.x = 2048 + 30;
monster.y = Math.random() * 2732;
break;
case 2:
// Bottom
monster.x = Math.random() * 2048;
monster.y = 2732 + 30;
break;
case 3:
// Left
monster.x = -30;
monster.y = Math.random() * 2732;
break;
}
// Calculate direction toward player
var dx = player.x - monster.x;
var dy = player.y - monster.y;
var distance = Math.sqrt(dx * dx + dy * dy);
monster.velocityX = dx / distance * monster.speed;
monster.velocityY = dy / distance * monster.speed;
monsters.push(monster);
game.addChild(monster);
}
game.down = function (x, y, obj) {
if (gameRunning) {
player.shoot(x, y);
}
};
game.update = function () {
if (!gameRunning) return;
// Handle reloading
if (ammo <= 0 && reloadTime <= 0) {
reloadTime = reloadDuration;
}
if (reloadTime > 0) {
reloadTime--;
if (reloadTime <= 0) {
ammo = maxAmmo;
ammoText.setText('Ammo: ' + ammo + '/' + maxAmmo);
} else {
var reloadProgress = Math.ceil((reloadDuration - reloadTime) / reloadDuration * 100);
ammoText.setText('Reloading... ' + reloadProgress + '%');
}
}
// Spawn monsters
spawnTimer++;
if (spawnTimer >= spawnRate) {
spawnMonster();
spawnTimer = 0;
// Increase difficulty over time
if (spawnRate > 30) {
spawnRate -= 0.5;
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-monster collisions
for (var j = monsters.length - 1; j >= 0; j--) {
var monster = monsters[j];
if (bullet.intersects(monster)) {
// Hit monster
LK.getSound('hit').play();
LK.setScore(LK.getScore() + 10);
scoreText.setText('Score: ' + LK.getScore());
// Create explosion effect before destroying monster
var explosionX = monster.x;
var explosionY = monster.y;
// Scale up and fade out the monster as explosion
tween(monster, {
scaleX: 2.5,
scaleY: 2.5,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
monster.destroy();
}
});
// Remove bullet and monster from arrays
bullet.destroy();
bullets.splice(i, 1);
monsters.splice(j, 1);
break;
}
}
}
// Update monsters and check player collision
for (var k = monsters.length - 1; k >= 0; k--) {
var monster = monsters[k];
if (monster.intersects(player)) {
player.health -= 5;
healthText.setText('Health: ' + player.health);
// Flash player red
LK.effects.flashObject(player, 0xff0000, 200);
// Remove monster
monster.destroy();
monsters.splice(k, 1);
// Check game over
if (player.health <= 0) {
gameRunning = false;
LK.showGameOver();
}
}
}
};
// Start background music
LK.playMusic('battle'); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Monster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.shootCooldown = 0;
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
};
self.shoot = function (targetX, targetY) {
if (self.shootCooldown <= 0 && ammo > 0 && reloadTime <= 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.velocityX = dx / distance * 12;
bullet.velocityY = dy / distance * 12;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
self.shootCooldown = 10;
ammo--;
ammoText.setText('Ammo: ' + ammo + '/' + maxAmmo);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2d5a2d
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
var monsters = [];
var bullets = [];
var spawnTimer = 0;
var spawnRate = 120; // frames between spawns
var gameRunning = true;
var ammo = 10;
var maxAmmo = 10;
var reloadTime = 0;
var reloadDuration = 180; // 3 seconds at 60fps
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 50,
fill: 0xFF4444
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 50;
LK.gui.topLeft.addChild(healthText);
var ammoText = new Text2('Ammo: 10/10', {
size: 50,
fill: 0x44FF44
});
ammoText.anchor.set(0, 0);
ammoText.x = 150;
ammoText.y = 120;
LK.gui.topLeft.addChild(ammoText);
function spawnMonster() {
var monster = new Monster();
// Spawn from random edge
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
// Top
monster.x = Math.random() * 2048;
monster.y = -30;
break;
case 1:
// Right
monster.x = 2048 + 30;
monster.y = Math.random() * 2732;
break;
case 2:
// Bottom
monster.x = Math.random() * 2048;
monster.y = 2732 + 30;
break;
case 3:
// Left
monster.x = -30;
monster.y = Math.random() * 2732;
break;
}
// Calculate direction toward player
var dx = player.x - monster.x;
var dy = player.y - monster.y;
var distance = Math.sqrt(dx * dx + dy * dy);
monster.velocityX = dx / distance * monster.speed;
monster.velocityY = dy / distance * monster.speed;
monsters.push(monster);
game.addChild(monster);
}
game.down = function (x, y, obj) {
if (gameRunning) {
player.shoot(x, y);
}
};
game.update = function () {
if (!gameRunning) return;
// Handle reloading
if (ammo <= 0 && reloadTime <= 0) {
reloadTime = reloadDuration;
}
if (reloadTime > 0) {
reloadTime--;
if (reloadTime <= 0) {
ammo = maxAmmo;
ammoText.setText('Ammo: ' + ammo + '/' + maxAmmo);
} else {
var reloadProgress = Math.ceil((reloadDuration - reloadTime) / reloadDuration * 100);
ammoText.setText('Reloading... ' + reloadProgress + '%');
}
}
// Spawn monsters
spawnTimer++;
if (spawnTimer >= spawnRate) {
spawnMonster();
spawnTimer = 0;
// Increase difficulty over time
if (spawnRate > 30) {
spawnRate -= 0.5;
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-monster collisions
for (var j = monsters.length - 1; j >= 0; j--) {
var monster = monsters[j];
if (bullet.intersects(monster)) {
// Hit monster
LK.getSound('hit').play();
LK.setScore(LK.getScore() + 10);
scoreText.setText('Score: ' + LK.getScore());
// Create explosion effect before destroying monster
var explosionX = monster.x;
var explosionY = monster.y;
// Scale up and fade out the monster as explosion
tween(monster, {
scaleX: 2.5,
scaleY: 2.5,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
monster.destroy();
}
});
// Remove bullet and monster from arrays
bullet.destroy();
bullets.splice(i, 1);
monsters.splice(j, 1);
break;
}
}
}
// Update monsters and check player collision
for (var k = monsters.length - 1; k >= 0; k--) {
var monster = monsters[k];
if (monster.intersects(player)) {
player.health -= 5;
healthText.setText('Health: ' + player.health);
// Flash player red
LK.effects.flashObject(player, 0xff0000, 200);
// Remove monster
monster.destroy();
monsters.splice(k, 1);
// Check game over
if (player.health <= 0) {
gameRunning = false;
LK.showGameOver();
}
}
}
};
// Start background music
LK.playMusic('battle');
Silah mermisi. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Player. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Monster. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat