var enemies = [];
var MiniMap = Container.expand(function () {
var self = Container.call(this);
var mapGraphics = self.createAsset('miniMap', 'Mini Map Graphics', 0, 0);
self.updateMap = function (playerPosition, enemyPositions) {};
});
var WeaponIcon = Container.expand(function (iconAssetId) {
var self = Container.call(this);
var icon = self.createAsset(iconAssetId, 'Weapon Icon', 0.5, 0.5);
self.changeWeapon = function (newIconAssetId) {
self.removeChild(icon);
icon = self.createAsset(newIconAssetId, 'Weapon Icon', 0.5, 0.5);
};
});
var AmmoCounter = Container.expand(function () {
var self = Container.call(this);
var ammoText = new Text2('Ammo: 0', {
size: 50,
fill: '#ffffff'
});
self.addChild(ammoText);
self.updateAmmo = function (ammo) {
ammoText.setText('Ammo: ' + ammo);
};
});
var HealthBar = Container.expand(function (maxHealth) {
var self = Container.call(this);
self.maxHealth = maxHealth;
self.currentHealth = maxHealth;
var background = self.createAsset('healthBarBg', 'Health Bar Background', 0, 0.5);
var foreground = self.createAsset('healthBarFg', 'Health Bar Foreground', 0, 0.5);
self.updateHealth = function (health) {
self.currentHealth = health;
foreground.scale.x = health / self.maxHealth;
if (self.currentHealth < self.maxHealth * 0.3) {
foreground.tint = 0xFF0000;
} else if (self.currentHealth < self.maxHealth * 0.6) {
foreground.tint = 0xFFFF00;
} else {
foreground.tint = 0x00FF00;
}
};
self.reset = function () {
self.updateHealth(self.maxHealth);
};
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet Graphics', .5, .5);
self.initialX = self.x;
self.initialY = self.y;
self.speed = 100;
self.move = function () {
var closestEnemy = null;
var closestDistance = Number.MAX_VALUE;
self.parent.children.forEach(function (obj) {
if (obj instanceof Enemy) {
var distance = Math.sqrt(Math.pow(self.x - obj.x, 2) + Math.pow(self.y - obj.y, 2));
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = obj;
}
}
});
if (closestEnemy) {} else {
self.destroy();
if (self.parent && self.parent.heroBullets) {
self.parent.heroBullets.splice(self.parent.heroBullets.indexOf(self), 1);
}
}
};
self.checkCollision = function () {
var allObjects = self.parent ? self.parent.children : [];
for (var i = 0; i < allObjects.length; i++) {
var obj = allObjects[i];
if (obj !== self && !(obj instanceof HeroBullet) && !(obj instanceof EnemyBullet) && self.intersects(obj)) {
if (obj instanceof Enemy) {
obj.takeDamage(1);
if (obj.health <= 0) {
enemies.splice(enemies.indexOf(obj), 1);
}
self.destroy();
if (self.parent && self.parent.heroBullets) {
self.parent.heroBullets.splice(self.parent.heroBullets.indexOf(self), 1);
}
return;
}
}
}
};
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet Graphics', .5, .5);
self.speed = 5;
self.move = function () {
self.y += self.speed;
if (self.parent && self.parent.hero && self.intersects(self.parent.hero)) {
self.parent.hero.takeDamage(1);
self.destroy();
}
};
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.takeDamage = function () {
self.health -= 1;
if (self.health <= 0) {
enemies.splice(enemies.indexOf(self), 1);
self.destroy();
}
};
self.health = 3;
self.shootCooldown = 180 / 60 * 3;
var enemyGraphics = self.createAsset('stormTrooper', 'Stormtrooper Graphics', .5, .5);
self.speed = 2;
self.move = function () {
self.x += self.speed * Math.cos(self.angle);
self.y += self.speed * Math.sin(self.angle);
};
self.shoot = function (enemyBullets, gameContainer, hero) {
if (!self.bullet && self.shootCooldown <= 0) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + self.height / 2;
bullet.angle = Math.atan2(hero.y - bullet.y, hero.x - bullet.x);
bullet.move = function () {
bullet.x += bullet.speed * Math.cos(bullet.angle);
bullet.y += bullet.speed * Math.sin(bullet.angle);
};
enemyBullets.push(bullet);
gameContainer.addChild(bullet);
self.bullet = bullet;
self.shootCooldown = 180 / 60 * 3;
}
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero Graphics', .5, .5);
self.shootCooldown = 180 / 60 * 3;
self.health = 10;
self.targetX = self.x;
self.targetY = self.y;
self.moveSpeed = 6.75;
self.updatePosition = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > self.moveSpeed) {
self.x += dx / distance * self.moveSpeed;
self.y += dy / distance * self.moveSpeed;
} else {
self.x = self.targetX;
self.y = self.targetY;
}
self.rotation = 0;
};
self.shoot = function (heroBullets, gameContainer, allObjects) {
if (self.shootCooldown <= 0) {
var bullet = new HeroBullet();
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
bullet.angle = Math.atan2(self.targetY - self.y, self.targetX - self.x);
bullet.move = function () {
bullet.x += bullet.speed * Math.cos(bullet.angle);
bullet.y += bullet.speed * Math.sin(bullet.angle);
};
self.shootCooldown = 180 / 60 * 3;
self.parent.heroBullets.push(bullet);
self.parent.addChild(bullet);
}
};
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
};
self.update = function (heroBullets, gameContainer) {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
self.updatePosition();
if (self.targetX !== self.x || self.targetY !== self.y) {
self.shoot(heroBullets, gameContainer);
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var hero = new Hero();
self.addChild(hero);
hero.x = 2048 / 2;
hero.y = 2732 - 200;
var enemies = [];
var enemySpawnTicker = 0;
var enemySpawnRate = 120;
self.heroBullets = [];
var enemyBullets = [];
var healthBar = new HealthBar(100);
healthBar.x = 100;
healthBar.y = 50;
self.addChild(healthBar);
var ammoCounter = new AmmoCounter();
ammoCounter.x = 2048 - 200;
ammoCounter.y = 50;
LK.gui.topRight.addChild(ammoCounter);
var weaponIcon = new WeaponIcon('defaultWeapon');
weaponIcon.x = 2048 - 400;
weaponIcon.y = 50;
LK.gui.topRight.addChild(weaponIcon);
var miniMap = new MiniMap();
miniMap.x = 2048 - 200;
miniMap.y = 2732 - 200;
LK.gui.bottomRight.addChild(miniMap);
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(.5, 0);
self.addChild(scoreTxt);
var dragNode = null;
hero.on('down', function (obj) {
dragNode = hero;
});
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(self);
hero.targetX = pos.x;
hero.targetY = pos.y;
}
stage.on('move', handleMove);
stage.on('up', function (obj) {
dragNode = null;
});
LK.on('tick', function () {
for (var a = self.heroBullets.length - 1; a >= 0; a--) {
self.heroBullets[a].move();
self.heroBullets[a].checkCollision();
if (self.heroBullets[a].y < -50 || self.heroBullets[a].y > 2732 + 50 || self.heroBullets[a].x < -50 || self.heroBullets[a].x > 2048 + 50) {
self.heroBullets[a].destroy();
self.heroBullets.splice(a, 1);
}
}
for (var a = enemyBullets.length - 1; a >= 0; a--) {
enemyBullets[a].move();
if (enemyBullets[a].y > 2732 + 50) {
enemyBullets[a].destroy();
enemyBullets.splice(a, 1);
enemies.forEach(function (enemy) {
if (enemy.bullet === enemyBullets[a]) {
enemy.bullet = null;
}
});
} else if (hero.intersects(enemyBullets[a])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
enemyBullets[a].destroy();
enemyBullets.splice(a, 1);
enemies.forEach(function (enemy) {
if (enemy.bullet === enemyBullets[a]) {
enemy.bullet = null;
}
});
}
}
hero.update();
if (enemySpawnTicker++ % enemySpawnRate === 0) {
var newEnemy = new Enemy();
var spawnEdge = Math.floor(Math.random() * 4);
switch (spawnEdge) {
case 0:
newEnemy.x = Math.random() * 2048;
newEnemy.y = -newEnemy.height / 2;
break;
case 1:
newEnemy.x = 2048 + newEnemy.width / 2;
newEnemy.y = Math.random() * 2732;
break;
case 2:
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732 + newEnemy.height / 2;
break;
case 3:
newEnemy.x = -newEnemy.width / 2;
newEnemy.y = Math.random() * 2732;
break;
}
newEnemy.angle = Math.atan2(hero.y - newEnemy.y, hero.x - newEnemy.x);
enemies.push(newEnemy);
self.addChild(newEnemy);
}
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].move();
if (enemies[i].shootCooldown > 0) {
enemies[i].shootCooldown--;
}
if (enemies[i].y > 2732 + 50) {
enemies[i].destroy();
enemies.splice(i, 1);
} else if (Math.random() < 0.01) {
enemies[i].shoot(enemyBullets, self, hero);
}
}
});
});
var enemies = [];
var MiniMap = Container.expand(function () {
var self = Container.call(this);
var mapGraphics = self.createAsset('miniMap', 'Mini Map Graphics', 0, 0);
self.updateMap = function (playerPosition, enemyPositions) {};
});
var WeaponIcon = Container.expand(function (iconAssetId) {
var self = Container.call(this);
var icon = self.createAsset(iconAssetId, 'Weapon Icon', 0.5, 0.5);
self.changeWeapon = function (newIconAssetId) {
self.removeChild(icon);
icon = self.createAsset(newIconAssetId, 'Weapon Icon', 0.5, 0.5);
};
});
var AmmoCounter = Container.expand(function () {
var self = Container.call(this);
var ammoText = new Text2('Ammo: 0', {
size: 50,
fill: '#ffffff'
});
self.addChild(ammoText);
self.updateAmmo = function (ammo) {
ammoText.setText('Ammo: ' + ammo);
};
});
var HealthBar = Container.expand(function (maxHealth) {
var self = Container.call(this);
self.maxHealth = maxHealth;
self.currentHealth = maxHealth;
var background = self.createAsset('healthBarBg', 'Health Bar Background', 0, 0.5);
var foreground = self.createAsset('healthBarFg', 'Health Bar Foreground', 0, 0.5);
self.updateHealth = function (health) {
self.currentHealth = health;
foreground.scale.x = health / self.maxHealth;
if (self.currentHealth < self.maxHealth * 0.3) {
foreground.tint = 0xFF0000;
} else if (self.currentHealth < self.maxHealth * 0.6) {
foreground.tint = 0xFFFF00;
} else {
foreground.tint = 0x00FF00;
}
};
self.reset = function () {
self.updateHealth(self.maxHealth);
};
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet Graphics', .5, .5);
self.initialX = self.x;
self.initialY = self.y;
self.speed = 100;
self.move = function () {
var closestEnemy = null;
var closestDistance = Number.MAX_VALUE;
self.parent.children.forEach(function (obj) {
if (obj instanceof Enemy) {
var distance = Math.sqrt(Math.pow(self.x - obj.x, 2) + Math.pow(self.y - obj.y, 2));
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = obj;
}
}
});
if (closestEnemy) {} else {
self.destroy();
if (self.parent && self.parent.heroBullets) {
self.parent.heroBullets.splice(self.parent.heroBullets.indexOf(self), 1);
}
}
};
self.checkCollision = function () {
var allObjects = self.parent ? self.parent.children : [];
for (var i = 0; i < allObjects.length; i++) {
var obj = allObjects[i];
if (obj !== self && !(obj instanceof HeroBullet) && !(obj instanceof EnemyBullet) && self.intersects(obj)) {
if (obj instanceof Enemy) {
obj.takeDamage(1);
if (obj.health <= 0) {
enemies.splice(enemies.indexOf(obj), 1);
}
self.destroy();
if (self.parent && self.parent.heroBullets) {
self.parent.heroBullets.splice(self.parent.heroBullets.indexOf(self), 1);
}
return;
}
}
}
};
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet Graphics', .5, .5);
self.speed = 5;
self.move = function () {
self.y += self.speed;
if (self.parent && self.parent.hero && self.intersects(self.parent.hero)) {
self.parent.hero.takeDamage(1);
self.destroy();
}
};
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.takeDamage = function () {
self.health -= 1;
if (self.health <= 0) {
enemies.splice(enemies.indexOf(self), 1);
self.destroy();
}
};
self.health = 3;
self.shootCooldown = 180 / 60 * 3;
var enemyGraphics = self.createAsset('stormTrooper', 'Stormtrooper Graphics', .5, .5);
self.speed = 2;
self.move = function () {
self.x += self.speed * Math.cos(self.angle);
self.y += self.speed * Math.sin(self.angle);
};
self.shoot = function (enemyBullets, gameContainer, hero) {
if (!self.bullet && self.shootCooldown <= 0) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + self.height / 2;
bullet.angle = Math.atan2(hero.y - bullet.y, hero.x - bullet.x);
bullet.move = function () {
bullet.x += bullet.speed * Math.cos(bullet.angle);
bullet.y += bullet.speed * Math.sin(bullet.angle);
};
enemyBullets.push(bullet);
gameContainer.addChild(bullet);
self.bullet = bullet;
self.shootCooldown = 180 / 60 * 3;
}
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero Graphics', .5, .5);
self.shootCooldown = 180 / 60 * 3;
self.health = 10;
self.targetX = self.x;
self.targetY = self.y;
self.moveSpeed = 6.75;
self.updatePosition = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > self.moveSpeed) {
self.x += dx / distance * self.moveSpeed;
self.y += dy / distance * self.moveSpeed;
} else {
self.x = self.targetX;
self.y = self.targetY;
}
self.rotation = 0;
};
self.shoot = function (heroBullets, gameContainer, allObjects) {
if (self.shootCooldown <= 0) {
var bullet = new HeroBullet();
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
bullet.angle = Math.atan2(self.targetY - self.y, self.targetX - self.x);
bullet.move = function () {
bullet.x += bullet.speed * Math.cos(bullet.angle);
bullet.y += bullet.speed * Math.sin(bullet.angle);
};
self.shootCooldown = 180 / 60 * 3;
self.parent.heroBullets.push(bullet);
self.parent.addChild(bullet);
}
};
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
};
self.update = function (heroBullets, gameContainer) {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
self.updatePosition();
if (self.targetX !== self.x || self.targetY !== self.y) {
self.shoot(heroBullets, gameContainer);
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var hero = new Hero();
self.addChild(hero);
hero.x = 2048 / 2;
hero.y = 2732 - 200;
var enemies = [];
var enemySpawnTicker = 0;
var enemySpawnRate = 120;
self.heroBullets = [];
var enemyBullets = [];
var healthBar = new HealthBar(100);
healthBar.x = 100;
healthBar.y = 50;
self.addChild(healthBar);
var ammoCounter = new AmmoCounter();
ammoCounter.x = 2048 - 200;
ammoCounter.y = 50;
LK.gui.topRight.addChild(ammoCounter);
var weaponIcon = new WeaponIcon('defaultWeapon');
weaponIcon.x = 2048 - 400;
weaponIcon.y = 50;
LK.gui.topRight.addChild(weaponIcon);
var miniMap = new MiniMap();
miniMap.x = 2048 - 200;
miniMap.y = 2732 - 200;
LK.gui.bottomRight.addChild(miniMap);
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(.5, 0);
self.addChild(scoreTxt);
var dragNode = null;
hero.on('down', function (obj) {
dragNode = hero;
});
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(self);
hero.targetX = pos.x;
hero.targetY = pos.y;
}
stage.on('move', handleMove);
stage.on('up', function (obj) {
dragNode = null;
});
LK.on('tick', function () {
for (var a = self.heroBullets.length - 1; a >= 0; a--) {
self.heroBullets[a].move();
self.heroBullets[a].checkCollision();
if (self.heroBullets[a].y < -50 || self.heroBullets[a].y > 2732 + 50 || self.heroBullets[a].x < -50 || self.heroBullets[a].x > 2048 + 50) {
self.heroBullets[a].destroy();
self.heroBullets.splice(a, 1);
}
}
for (var a = enemyBullets.length - 1; a >= 0; a--) {
enemyBullets[a].move();
if (enemyBullets[a].y > 2732 + 50) {
enemyBullets[a].destroy();
enemyBullets.splice(a, 1);
enemies.forEach(function (enemy) {
if (enemy.bullet === enemyBullets[a]) {
enemy.bullet = null;
}
});
} else if (hero.intersects(enemyBullets[a])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
enemyBullets[a].destroy();
enemyBullets.splice(a, 1);
enemies.forEach(function (enemy) {
if (enemy.bullet === enemyBullets[a]) {
enemy.bullet = null;
}
});
}
}
hero.update();
if (enemySpawnTicker++ % enemySpawnRate === 0) {
var newEnemy = new Enemy();
var spawnEdge = Math.floor(Math.random() * 4);
switch (spawnEdge) {
case 0:
newEnemy.x = Math.random() * 2048;
newEnemy.y = -newEnemy.height / 2;
break;
case 1:
newEnemy.x = 2048 + newEnemy.width / 2;
newEnemy.y = Math.random() * 2732;
break;
case 2:
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732 + newEnemy.height / 2;
break;
case 3:
newEnemy.x = -newEnemy.width / 2;
newEnemy.y = Math.random() * 2732;
break;
}
newEnemy.angle = Math.atan2(hero.y - newEnemy.y, hero.x - newEnemy.x);
enemies.push(newEnemy);
self.addChild(newEnemy);
}
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].move();
if (enemies[i].shootCooldown > 0) {
enemies[i].shootCooldown--;
}
if (enemies[i].y > 2732 + 50) {
enemies[i].destroy();
enemies.splice(i, 1);
} else if (Math.random() < 0.01) {
enemies[i].shoot(enemyBullets, self, hero);
}
}
});
});
pixel art image of a stormtrooper from the Star Wars universe. The stormtrooper should be standing in a defensive pose, with their blaster raised. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a series of pixel art images depicting a blaster shot. The blaster shot should be represented by a small, glowing projectile with a trail of smoke or sparks. The animation should consist of eight frames and loop continuously. Use a limited color palette of 16 colors or less, simple shapes and lines, and transparency for a seamless background. Employ standard pixel art techniques like dithering and anti-aliasing. Bright flash, sizzling sound, swift arc, fading glow.
Create a pixel art sprite of the Mandalorian from the Star Wars universe. The Mandalorian should be standing in a determined pose, with his beskar armor and blaster raised. The sprite should be detailed and recognizable, but also stylized to fit within the pixel art aesthetic. The Mandalorian is a skilled bounty hunter known for his unwavering determination and formidable combat skills. Clad in his signature beskar armor, he wields an array of deadly weapons, including his trusty blaster and a jetpack that allows him to maneuver with incredible agility. Despite his gruff exterior, the Mandalorian possesses a strong sense of honor and a deep-seated loyalty to those he protects.
• Position: The health bar should be positioned at the top of the screen, centered or slightly to the left side, to ensure it remains visible throughout gameplay. • Appearance: The health bar should be a simple horizontal bar with a clear color gradient, typically from green to red, indicating the player's remaining health. The bar should be easily distinguishable from the background and should have a smooth and consistent shape. • Size: The health bar should be large enough to be easily visible without taking up too much screen space. A height of 5-10 pixels is generally sufficient. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.