/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BurningCar = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('burningCar', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Gangster = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gangster', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.shootTimer = 0;
self.shootInterval = 90 + Math.random() * 60;
self.targetX = player.x;
self.targetY = player.y;
self.update = function () {
// Move toward player
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Shooting logic
self.shootTimer++;
if (self.shootTimer >= self.shootInterval) {
self.shootTimer = 0;
var bullet = new GangsterBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.lastY = bullet.y;
bullet.lastIntersecting = false;
gangsterBullets.push(bullet);
game.addChild(bullet);
LK.getSound('enemyShoot').play();
}
};
return self;
});
var GangsterBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gangsterBullet', {
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 graphics = self.attachAsset('policeOfficer', {
anchorX: 0.5,
anchorY: 0.5
});
self.isAlive = true;
return self;
});
var PoliceBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('policeBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var StreetLamp = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 1,
scaleX: 1,
scaleY: 1
});
return self;
});
var YellowBarrier = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('yellowBarrier', {
anchorX: 0.5,
anchorY: 0.5
});
// Add black stripes
for (var i = 0; i < 5; i++) {
var stripe = LK.getAsset('yellowBarrier', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
scaleY: 1,
x: -80 + i * 40,
y: 0
});
stripe.tint = 0x000000;
self.addChild(stripe);
}
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Add street background
var background = game.addChild(LK.getAsset('streetBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 - 200;
var policeBullets = [];
var gangsterBullets = [];
var gangsters = [];
var barriers = [];
var burningCars = [];
var streetLamps = [];
var waveTimer = 0;
var spawnTimer = 0;
var difficulty = 1;
var dragNode = null;
var currentWave = 1;
var gangstersToSpawn = 3;
var gangstersSpawned = 0;
var waveInProgress = false;
var waveCompleted = false;
var waveCompletionTimer = 0;
var gameState = 'menu'; // 'menu', 'playing', 'paused'
var menuContainer = null;
var titleText = null;
var playButton = null;
var instructionsText = null;
var playerLives = 3;
var maxLives = 3;
// Create barriers
for (var i = 0; i < 4; i++) {
var barrier = new YellowBarrier();
barrier.x = 400 + i * 400;
barrier.y = 1500;
barriers.push(barrier);
game.addChild(barrier);
}
// Create street lamps positioned on the road sides
var lampPositions = [];
// Left side of the road
for (var i = 0; i < 8; i++) {
lampPositions.push({
x: 200,
y: 300 + i * 300
});
}
// Right side of the road
for (var i = 0; i < 8; i++) {
lampPositions.push({
x: 1848,
y: 300 + i * 300
});
}
for (var i = 0; i < lampPositions.length; i++) {
var lamp = new StreetLamp();
lamp.x = lampPositions[i].x;
lamp.y = lampPositions[i].y;
streetLamps.push(lamp);
game.addChild(lamp);
}
// Create burning cars with distant random distribution
var carPositions = [];
for (var i = 0; i < 1; i++) {
var burningCar = new BurningCar();
var validPosition = false;
var attempts = 0;
// Keep trying until we find a position that's far enough from other cars
while (!validPosition && attempts < 50) {
burningCar.x = 200 + Math.random() * 1648; // Random X position across street width
burningCar.y = 400 + Math.random() * 1000; // Random Y position in middle area
// Ensure cars don't spawn too close to barriers (around y=1500)
if (burningCar.y > 1350 && burningCar.y < 1650) {
burningCar.y = burningCar.y < 1500 ? 1250 : 1750;
}
// Check distance from other cars (minimum 400 pixels apart)
validPosition = true;
for (var j = 0; j < carPositions.length; j++) {
var dx = burningCar.x - carPositions[j].x;
var dy = burningCar.y - carPositions[j].y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 400) {
validPosition = false;
break;
}
}
attempts++;
}
// Store position for distance checking
carPositions.push({
x: burningCar.x,
y: burningCar.y
});
burningCars.push(burningCar);
game.addChild(burningCar);
}
// Score display - pixel art style
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF,
font: "monospace"
});
scoreTxt.anchor.set(0.5, 0);
// Wave display - pixel art style
var waveTxt = new Text2('Wave: 1', {
size: 70,
fill: 0xFFFF00,
font: "monospace"
});
waveTxt.anchor.set(0.5, 0);
waveTxt.y = 120;
// Lives display with hearts
var heartsContainer = new Container();
var hearts = [];
var livesText = new Text2('Lives: 3', {
size: 60,
fill: 0xFFFFFF,
font: "monospace"
});
livesText.anchor.set(0.5, 0);
livesText.y = 250;
// Create main menu
createMainMenu();
function createHeartsDisplay() {
// Clear existing hearts
for (var i = 0; i < hearts.length; i++) {
hearts[i].destroy();
}
hearts = [];
// Create hearts based on current lives
for (var i = 0; i < playerLives; i++) {
var heart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: i * 100,
y: 0
});
hearts.push(heart);
heartsContainer.addChild(heart);
}
// Position hearts container
heartsContainer.x = 2048 / 2 - (playerLives - 1) * 100 / 2;
heartsContainer.y = 200;
// Update lives text
livesText.setText('Lives: ' + playerLives);
}
function createMainMenu() {
// Create menu container
menuContainer = new Container();
game.addChild(menuContainer);
// Create semi-transparent background overlay
var overlay = LK.getAsset('yellowBarrier', {
anchorX: 0,
anchorY: 0,
scaleX: 8,
scaleY: 26,
x: 0,
y: 0
});
overlay.tint = 0x000000;
overlay.alpha = 0.7;
menuContainer.addChild(overlay);
// Create title using streetbattle image
titleText = LK.getAsset('streetbattle', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 800,
scaleX: 7.5,
scaleY: 7.5
});
menuContainer.addChild(titleText);
// Create play button using image asset
playButton = game.addChild(LK.getAsset('play', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1200,
scaleX: 1,
scaleY: 1
}));
menuContainer.addChild(playButton);
// Create instructions text - pixel art style
instructionsText = new Text2('Drag to move and shoot\nDefeat all gangsters to advance waves', {
size: 70,
fill: 0xFFFFFF,
font: "monospace"
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 2048 / 2;
instructionsText.y = 1500;
menuContainer.addChild(instructionsText);
// Add click handler for play button
playButton.down = function (x, y, obj) {
startGame();
};
}
function startGame() {
// Remove menu
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
}
// Set game state to playing
gameState = 'playing';
// Reset player lives
playerLives = maxLives;
player.isAlive = true;
// Show UI elements - unified score display
scoreTxt.setText('Score: ' + LK.getScore());
createHeartsDisplay();
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(waveTxt);
LK.gui.top.addChild(heartsContainer);
LK.gui.top.addChild(livesText);
// Initialize wave system
startWave();
// Play background music
LK.playMusic('Background');
}
function startWave() {
waveInProgress = true;
waveCompleted = false;
waveCompletionTimer = 0;
gangstersSpawned = 0;
gangstersToSpawn = 2 + currentWave * 2; // More gangsters each wave
difficulty = Math.floor(currentWave / 2) + 1; // Difficulty increases every 2 waves
waveTxt.setText('Wave: ' + currentWave);
}
function spawnGangster() {
var gangster = new Gangster();
var validPosition = false;
var attempts = 0;
// Keep trying until we find a position that doesn't intersect with trees
while (!validPosition && attempts < 50) {
// Random spawn position from top and sides
var spawnSide = Math.random();
if (spawnSide < 0.5) {
// Spawn from top
gangster.x = Math.random() * 1800 + 124;
gangster.y = 100;
} else if (spawnSide < 0.75) {
// Spawn from left
gangster.x = 100;
gangster.y = Math.random() * 1000 + 200;
} else {
// Spawn from right
gangster.x = 1948;
gangster.y = Math.random() * 1000 + 200;
}
// Check if gangster intersects with any street lamps (trees)
validPosition = true;
for (var i = 0; i < streetLamps.length; i++) {
if (gangster.intersects(streetLamps[i])) {
validPosition = false;
break;
}
}
attempts++;
}
gangster.targetX = player.x;
gangster.targetY = player.y;
gangster.lastIntersecting = false;
gangsters.push(gangster);
game.addChild(gangster);
gangstersSpawned++;
}
function handleMove(x, y, obj) {
if (dragNode && dragNode.isAlive) {
// Store the current position
var oldX = dragNode.x;
var oldY = dragNode.y;
// Calculate the new position with bounds checking
var newX = Math.max(50, Math.min(1998, x));
var newY = Math.max(200, Math.min(2732 - 100, y));
// Temporarily move to new position to test for collisions
dragNode.x = newX;
dragNode.y = newY;
// Check collision with barriers
var hasCollision = false;
for (var i = 0; i < barriers.length; i++) {
if (dragNode.intersects(barriers[i])) {
hasCollision = true;
break;
}
}
// Check collision with burning cars
if (!hasCollision) {
for (var i = 0; i < burningCars.length; i++) {
if (dragNode.intersects(burningCars[i])) {
hasCollision = true;
break;
}
}
}
// Check collision with street lamps (trees)
if (!hasCollision) {
for (var i = 0; i < streetLamps.length; i++) {
if (dragNode.intersects(streetLamps[i])) {
hasCollision = true;
break;
}
}
}
// If there's a collision, revert to old position
if (hasCollision) {
dragNode.x = oldX;
dragNode.y = oldY;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'playing' && player.isAlive) {
// Set drag node to player
dragNode = player;
handleMove(x, y, obj);
// Shoot bullet
var bullet = new PoliceBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
bullet.lastY = bullet.y;
bullet.lastIntersecting = false;
policeBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameState !== 'playing' || !player.isAlive) return;
// Wave logic
if (waveInProgress) {
// Spawn gangsters for current wave
spawnTimer++;
var spawnRate = Math.max(120 - difficulty * 10, 30);
if (spawnTimer >= spawnRate && gangstersSpawned < gangstersToSpawn) {
spawnTimer = 0;
spawnGangster();
}
// Check if wave is completed (all gangsters spawned and defeated)
if (gangstersSpawned >= gangstersToSpawn && gangsters.length === 0) {
waveInProgress = false;
waveCompleted = true;
waveCompletionTimer = 0;
}
} else if (waveCompleted) {
// Wave completion pause
waveCompletionTimer++;
if (waveCompletionTimer >= 180) {
// 3 second pause
currentWave++;
startWave();
}
}
// Update police bullets
for (var i = policeBullets.length - 1; i >= 0; i--) {
var bullet = policeBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= 0 && bullet.y < 0) {
bullet.destroy();
policeBullets.splice(i, 1);
continue;
}
// Check collision with barriers
var hitBarrier = false;
for (var k = barriers.length - 1; k >= 0; k--) {
var barrier = barriers[k];
if (bullet.intersects(barrier)) {
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
// Check collision with burning cars
if (!hitBarrier) {
for (var k = burningCars.length - 1; k >= 0; k--) {
var burningCar = burningCars[k];
if (bullet.intersects(burningCar)) {
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
}
if (!hitBarrier) {
// Check collision with gangsters
var hitGangster = false;
for (var j = gangsters.length - 1; j >= 0; j--) {
var gangster = gangsters[j];
if (bullet.intersects(gangster)) {
// Hit gangster
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Animate score with red pulsing effect
tween.stop(scoreTxt, {
scaleX: true,
scaleY: true,
tint: true
});
tween(scoreTxt, {
scaleX: 1.3,
scaleY: 1.3,
tint: 0xFF3333
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(scoreTxt, {
scaleX: 1,
scaleY: 1,
tint: 0xFF0000
}, {
duration: 200,
easing: tween.easeIn
});
}
});
LK.getSound('hit').play();
// Remove gangster
gangster.destroy();
gangsters.splice(j, 1);
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitGangster = true;
break;
}
}
}
if (!hitGangster) {
bullet.lastY = bullet.y;
}
}
// Update gangster bullets
for (var i = gangsterBullets.length - 1; i >= 0; i--) {
var bullet = gangsterBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2732 && bullet.y > 2732) {
bullet.destroy();
gangsterBullets.splice(i, 1);
continue;
}
// Check collision with barriers
var hitBarrier = false;
for (var k = barriers.length - 1; k >= 0; k--) {
var barrier = barriers[k];
if (bullet.intersects(barrier)) {
// Remove bullet
bullet.destroy();
gangsterBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
// Check collision with burning cars
if (!hitBarrier) {
for (var k = burningCars.length - 1; k >= 0; k--) {
var burningCar = burningCars[k];
if (bullet.intersects(burningCar)) {
// Remove bullet
bullet.destroy();
gangsterBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
}
if (!hitBarrier) {
// Check collision with player
if (bullet.intersects(player) && player.isAlive) {
playerLives--;
createHeartsDisplay();
// Flash screen red
LK.effects.flashScreen(0xff0000, 500);
// Remove the bullet that hit the player
bullet.destroy();
gangsterBullets.splice(i, 1);
// Check if game over (no lives left)
if (playerLives <= 0) {
player.isAlive = false;
LK.showGameOver();
return;
} else {
// Reset player position to safe area
player.x = 2048 / 2;
player.y = 2732 - 200;
// Brief invincibility period
player.alpha = 0.5;
tween(player, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
}
bullet.lastY = bullet.y;
}
// Update gangsters
for (var i = gangsters.length - 1; i >= 0; i--) {
var gangster = gangsters[i];
// Check if gangster reached player
if (gangster.intersects(player) && player.isAlive) {
playerLives--;
createHeartsDisplay();
// Flash screen red
LK.effects.flashScreen(0xff0000, 500);
// Remove the gangster that hit the player
gangster.destroy();
gangsters.splice(i, 1);
// Check if game over (no lives left)
if (playerLives <= 0) {
player.isAlive = false;
LK.showGameOver();
return;
} else {
// Reset player position to safe area
player.x = 2048 / 2;
player.y = 2732 - 200;
// Brief invincibility period
player.alpha = 0.5;
tween(player, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
// Update gangster target occasionally
if (LK.ticks % 30 === 0) {
gangster.targetX = player.x;
gangster.targetY = player.y;
}
// Increase gangster speed with difficulty
gangster.speed = 2 + difficulty * 0.5;
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BurningCar = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('burningCar', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Gangster = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gangster', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.shootTimer = 0;
self.shootInterval = 90 + Math.random() * 60;
self.targetX = player.x;
self.targetY = player.y;
self.update = function () {
// Move toward player
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Shooting logic
self.shootTimer++;
if (self.shootTimer >= self.shootInterval) {
self.shootTimer = 0;
var bullet = new GangsterBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.lastY = bullet.y;
bullet.lastIntersecting = false;
gangsterBullets.push(bullet);
game.addChild(bullet);
LK.getSound('enemyShoot').play();
}
};
return self;
});
var GangsterBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gangsterBullet', {
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 graphics = self.attachAsset('policeOfficer', {
anchorX: 0.5,
anchorY: 0.5
});
self.isAlive = true;
return self;
});
var PoliceBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('policeBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var StreetLamp = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 1,
scaleX: 1,
scaleY: 1
});
return self;
});
var YellowBarrier = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('yellowBarrier', {
anchorX: 0.5,
anchorY: 0.5
});
// Add black stripes
for (var i = 0; i < 5; i++) {
var stripe = LK.getAsset('yellowBarrier', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
scaleY: 1,
x: -80 + i * 40,
y: 0
});
stripe.tint = 0x000000;
self.addChild(stripe);
}
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Add street background
var background = game.addChild(LK.getAsset('streetBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 - 200;
var policeBullets = [];
var gangsterBullets = [];
var gangsters = [];
var barriers = [];
var burningCars = [];
var streetLamps = [];
var waveTimer = 0;
var spawnTimer = 0;
var difficulty = 1;
var dragNode = null;
var currentWave = 1;
var gangstersToSpawn = 3;
var gangstersSpawned = 0;
var waveInProgress = false;
var waveCompleted = false;
var waveCompletionTimer = 0;
var gameState = 'menu'; // 'menu', 'playing', 'paused'
var menuContainer = null;
var titleText = null;
var playButton = null;
var instructionsText = null;
var playerLives = 3;
var maxLives = 3;
// Create barriers
for (var i = 0; i < 4; i++) {
var barrier = new YellowBarrier();
barrier.x = 400 + i * 400;
barrier.y = 1500;
barriers.push(barrier);
game.addChild(barrier);
}
// Create street lamps positioned on the road sides
var lampPositions = [];
// Left side of the road
for (var i = 0; i < 8; i++) {
lampPositions.push({
x: 200,
y: 300 + i * 300
});
}
// Right side of the road
for (var i = 0; i < 8; i++) {
lampPositions.push({
x: 1848,
y: 300 + i * 300
});
}
for (var i = 0; i < lampPositions.length; i++) {
var lamp = new StreetLamp();
lamp.x = lampPositions[i].x;
lamp.y = lampPositions[i].y;
streetLamps.push(lamp);
game.addChild(lamp);
}
// Create burning cars with distant random distribution
var carPositions = [];
for (var i = 0; i < 1; i++) {
var burningCar = new BurningCar();
var validPosition = false;
var attempts = 0;
// Keep trying until we find a position that's far enough from other cars
while (!validPosition && attempts < 50) {
burningCar.x = 200 + Math.random() * 1648; // Random X position across street width
burningCar.y = 400 + Math.random() * 1000; // Random Y position in middle area
// Ensure cars don't spawn too close to barriers (around y=1500)
if (burningCar.y > 1350 && burningCar.y < 1650) {
burningCar.y = burningCar.y < 1500 ? 1250 : 1750;
}
// Check distance from other cars (minimum 400 pixels apart)
validPosition = true;
for (var j = 0; j < carPositions.length; j++) {
var dx = burningCar.x - carPositions[j].x;
var dy = burningCar.y - carPositions[j].y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 400) {
validPosition = false;
break;
}
}
attempts++;
}
// Store position for distance checking
carPositions.push({
x: burningCar.x,
y: burningCar.y
});
burningCars.push(burningCar);
game.addChild(burningCar);
}
// Score display - pixel art style
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF,
font: "monospace"
});
scoreTxt.anchor.set(0.5, 0);
// Wave display - pixel art style
var waveTxt = new Text2('Wave: 1', {
size: 70,
fill: 0xFFFF00,
font: "monospace"
});
waveTxt.anchor.set(0.5, 0);
waveTxt.y = 120;
// Lives display with hearts
var heartsContainer = new Container();
var hearts = [];
var livesText = new Text2('Lives: 3', {
size: 60,
fill: 0xFFFFFF,
font: "monospace"
});
livesText.anchor.set(0.5, 0);
livesText.y = 250;
// Create main menu
createMainMenu();
function createHeartsDisplay() {
// Clear existing hearts
for (var i = 0; i < hearts.length; i++) {
hearts[i].destroy();
}
hearts = [];
// Create hearts based on current lives
for (var i = 0; i < playerLives; i++) {
var heart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: i * 100,
y: 0
});
hearts.push(heart);
heartsContainer.addChild(heart);
}
// Position hearts container
heartsContainer.x = 2048 / 2 - (playerLives - 1) * 100 / 2;
heartsContainer.y = 200;
// Update lives text
livesText.setText('Lives: ' + playerLives);
}
function createMainMenu() {
// Create menu container
menuContainer = new Container();
game.addChild(menuContainer);
// Create semi-transparent background overlay
var overlay = LK.getAsset('yellowBarrier', {
anchorX: 0,
anchorY: 0,
scaleX: 8,
scaleY: 26,
x: 0,
y: 0
});
overlay.tint = 0x000000;
overlay.alpha = 0.7;
menuContainer.addChild(overlay);
// Create title using streetbattle image
titleText = LK.getAsset('streetbattle', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 800,
scaleX: 7.5,
scaleY: 7.5
});
menuContainer.addChild(titleText);
// Create play button using image asset
playButton = game.addChild(LK.getAsset('play', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1200,
scaleX: 1,
scaleY: 1
}));
menuContainer.addChild(playButton);
// Create instructions text - pixel art style
instructionsText = new Text2('Drag to move and shoot\nDefeat all gangsters to advance waves', {
size: 70,
fill: 0xFFFFFF,
font: "monospace"
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 2048 / 2;
instructionsText.y = 1500;
menuContainer.addChild(instructionsText);
// Add click handler for play button
playButton.down = function (x, y, obj) {
startGame();
};
}
function startGame() {
// Remove menu
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
}
// Set game state to playing
gameState = 'playing';
// Reset player lives
playerLives = maxLives;
player.isAlive = true;
// Show UI elements - unified score display
scoreTxt.setText('Score: ' + LK.getScore());
createHeartsDisplay();
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(waveTxt);
LK.gui.top.addChild(heartsContainer);
LK.gui.top.addChild(livesText);
// Initialize wave system
startWave();
// Play background music
LK.playMusic('Background');
}
function startWave() {
waveInProgress = true;
waveCompleted = false;
waveCompletionTimer = 0;
gangstersSpawned = 0;
gangstersToSpawn = 2 + currentWave * 2; // More gangsters each wave
difficulty = Math.floor(currentWave / 2) + 1; // Difficulty increases every 2 waves
waveTxt.setText('Wave: ' + currentWave);
}
function spawnGangster() {
var gangster = new Gangster();
var validPosition = false;
var attempts = 0;
// Keep trying until we find a position that doesn't intersect with trees
while (!validPosition && attempts < 50) {
// Random spawn position from top and sides
var spawnSide = Math.random();
if (spawnSide < 0.5) {
// Spawn from top
gangster.x = Math.random() * 1800 + 124;
gangster.y = 100;
} else if (spawnSide < 0.75) {
// Spawn from left
gangster.x = 100;
gangster.y = Math.random() * 1000 + 200;
} else {
// Spawn from right
gangster.x = 1948;
gangster.y = Math.random() * 1000 + 200;
}
// Check if gangster intersects with any street lamps (trees)
validPosition = true;
for (var i = 0; i < streetLamps.length; i++) {
if (gangster.intersects(streetLamps[i])) {
validPosition = false;
break;
}
}
attempts++;
}
gangster.targetX = player.x;
gangster.targetY = player.y;
gangster.lastIntersecting = false;
gangsters.push(gangster);
game.addChild(gangster);
gangstersSpawned++;
}
function handleMove(x, y, obj) {
if (dragNode && dragNode.isAlive) {
// Store the current position
var oldX = dragNode.x;
var oldY = dragNode.y;
// Calculate the new position with bounds checking
var newX = Math.max(50, Math.min(1998, x));
var newY = Math.max(200, Math.min(2732 - 100, y));
// Temporarily move to new position to test for collisions
dragNode.x = newX;
dragNode.y = newY;
// Check collision with barriers
var hasCollision = false;
for (var i = 0; i < barriers.length; i++) {
if (dragNode.intersects(barriers[i])) {
hasCollision = true;
break;
}
}
// Check collision with burning cars
if (!hasCollision) {
for (var i = 0; i < burningCars.length; i++) {
if (dragNode.intersects(burningCars[i])) {
hasCollision = true;
break;
}
}
}
// Check collision with street lamps (trees)
if (!hasCollision) {
for (var i = 0; i < streetLamps.length; i++) {
if (dragNode.intersects(streetLamps[i])) {
hasCollision = true;
break;
}
}
}
// If there's a collision, revert to old position
if (hasCollision) {
dragNode.x = oldX;
dragNode.y = oldY;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'playing' && player.isAlive) {
// Set drag node to player
dragNode = player;
handleMove(x, y, obj);
// Shoot bullet
var bullet = new PoliceBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
bullet.lastY = bullet.y;
bullet.lastIntersecting = false;
policeBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameState !== 'playing' || !player.isAlive) return;
// Wave logic
if (waveInProgress) {
// Spawn gangsters for current wave
spawnTimer++;
var spawnRate = Math.max(120 - difficulty * 10, 30);
if (spawnTimer >= spawnRate && gangstersSpawned < gangstersToSpawn) {
spawnTimer = 0;
spawnGangster();
}
// Check if wave is completed (all gangsters spawned and defeated)
if (gangstersSpawned >= gangstersToSpawn && gangsters.length === 0) {
waveInProgress = false;
waveCompleted = true;
waveCompletionTimer = 0;
}
} else if (waveCompleted) {
// Wave completion pause
waveCompletionTimer++;
if (waveCompletionTimer >= 180) {
// 3 second pause
currentWave++;
startWave();
}
}
// Update police bullets
for (var i = policeBullets.length - 1; i >= 0; i--) {
var bullet = policeBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= 0 && bullet.y < 0) {
bullet.destroy();
policeBullets.splice(i, 1);
continue;
}
// Check collision with barriers
var hitBarrier = false;
for (var k = barriers.length - 1; k >= 0; k--) {
var barrier = barriers[k];
if (bullet.intersects(barrier)) {
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
// Check collision with burning cars
if (!hitBarrier) {
for (var k = burningCars.length - 1; k >= 0; k--) {
var burningCar = burningCars[k];
if (bullet.intersects(burningCar)) {
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
}
if (!hitBarrier) {
// Check collision with gangsters
var hitGangster = false;
for (var j = gangsters.length - 1; j >= 0; j--) {
var gangster = gangsters[j];
if (bullet.intersects(gangster)) {
// Hit gangster
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Animate score with red pulsing effect
tween.stop(scoreTxt, {
scaleX: true,
scaleY: true,
tint: true
});
tween(scoreTxt, {
scaleX: 1.3,
scaleY: 1.3,
tint: 0xFF3333
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(scoreTxt, {
scaleX: 1,
scaleY: 1,
tint: 0xFF0000
}, {
duration: 200,
easing: tween.easeIn
});
}
});
LK.getSound('hit').play();
// Remove gangster
gangster.destroy();
gangsters.splice(j, 1);
// Remove bullet
bullet.destroy();
policeBullets.splice(i, 1);
hitGangster = true;
break;
}
}
}
if (!hitGangster) {
bullet.lastY = bullet.y;
}
}
// Update gangster bullets
for (var i = gangsterBullets.length - 1; i >= 0; i--) {
var bullet = gangsterBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2732 && bullet.y > 2732) {
bullet.destroy();
gangsterBullets.splice(i, 1);
continue;
}
// Check collision with barriers
var hitBarrier = false;
for (var k = barriers.length - 1; k >= 0; k--) {
var barrier = barriers[k];
if (bullet.intersects(barrier)) {
// Remove bullet
bullet.destroy();
gangsterBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
// Check collision with burning cars
if (!hitBarrier) {
for (var k = burningCars.length - 1; k >= 0; k--) {
var burningCar = burningCars[k];
if (bullet.intersects(burningCar)) {
// Remove bullet
bullet.destroy();
gangsterBullets.splice(i, 1);
hitBarrier = true;
break;
}
}
}
if (!hitBarrier) {
// Check collision with player
if (bullet.intersects(player) && player.isAlive) {
playerLives--;
createHeartsDisplay();
// Flash screen red
LK.effects.flashScreen(0xff0000, 500);
// Remove the bullet that hit the player
bullet.destroy();
gangsterBullets.splice(i, 1);
// Check if game over (no lives left)
if (playerLives <= 0) {
player.isAlive = false;
LK.showGameOver();
return;
} else {
// Reset player position to safe area
player.x = 2048 / 2;
player.y = 2732 - 200;
// Brief invincibility period
player.alpha = 0.5;
tween(player, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
}
bullet.lastY = bullet.y;
}
// Update gangsters
for (var i = gangsters.length - 1; i >= 0; i--) {
var gangster = gangsters[i];
// Check if gangster reached player
if (gangster.intersects(player) && player.isAlive) {
playerLives--;
createHeartsDisplay();
// Flash screen red
LK.effects.flashScreen(0xff0000, 500);
// Remove the gangster that hit the player
gangster.destroy();
gangsters.splice(i, 1);
// Check if game over (no lives left)
if (playerLives <= 0) {
player.isAlive = false;
LK.showGameOver();
return;
} else {
// Reset player position to safe area
player.x = 2048 / 2;
player.y = 2732 - 200;
// Brief invincibility period
player.alpha = 0.5;
tween(player, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
// Update gangster target occasionally
if (LK.ticks % 30 === 0) {
gangster.targetX = player.x;
gangster.targetY = player.y;
}
// Increase gangster speed with difficulty
gangster.speed = 2 + difficulty * 0.5;
}
};
This is a score text . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
2d pixel art style orange bullet. In-Game asset. 2d. High contrast. No shadows
2d pixel art style blue bullet. In-Game asset. 2d. High contrast. No shadows
a black barricade with yellow lines on it but pixel art style . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
A wrecked grey car with broken windows and smoke coming from the hood but pixel art style . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
this is a tree but pixel art style. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
This is a play button. No background. Writing the Play But pixel art style Transparent background. Blank background. No shadows. 2d. In-Game asset. flat make it more animation style
this is the street wars article in the main menu but pixel art style . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Draw a Man He Have Baclava mask wearin brown shirt and blue pants He Using Gun with 2 hands in 2D Pixel Art Style and Do It from an Above Perspective.In-Game asset. 2d. High contrast. No shadows
road with yellow lines Let there be a large land area on both sides of the road but pixel art style . Bacground is green. No shadows. 2d. In-Game asset. flat