var TargetIndicator = Container.expand(function () { var self = Container.call(this); var indicatorGraphics = XS.getAsset('indicator', 'Target Indicator', .5, .5); self.addChild(indicatorGraphics); }); var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = XS.getAsset('hero', 'Hero character', .5, .5); heroGraphics.rotation = -Math.PI / 2; self.addChild(heroGraphics); self.target = { x: 2048 / 2, y: 2732 / 2 }; self.isMoving = false; self.move = function () { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += 5 * (dx / distance); self.y += 5 * (dy / distance); self.rotation = Math.atan2(dy, dx); self.isMoving = true; } else { self.isMoving = false; } }; self.shoot = function (target) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); bullet.direction.x = dx / distance; bullet.direction.y = dy / distance; return bullet; }; self.findNearestEnemy = function (enemies) { var nearestDistance = Infinity; var nearestEnemy = null; for (var i = 0; i < enemies.length; i++) { var dx = enemies[i].x - self.x; var dy = enemies[i].y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestEnemy = enemies[i]; } } return nearestEnemy; }; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = XS.getAsset('enemy', 'Enemy character', .5, .5); enemyGraphics.rotation = -Math.PI / 2; self.addChild(enemyGraphics); self.speed = 2; self.move = function (hero) { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); self.x += self.speed * (dx / distance); self.y += self.speed * (dy / distance); self.rotation = Math.atan2(dy, dx); }; self.shoot = function () {}; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = XS.getAsset('bullet', 'Bullet Graphics', .5, .5); self.addChild(bulletGraphics); self.speed = 10; self.direction = { x: 0, y: 0 }; self.move = function () { self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; }; }); var Game = Container.expand(function () { var self = Container.call(this); XS.stageContainer.setBackgroundColor(0x004000); var score = 0; var heroAliveTime = 0; var targetIndicator = self.addChild(new TargetIndicator()); var hero = self.addChild(new Hero()); hero.x = 2048 / 2; hero.y = 2732 / 2; var scoreTxt = new Text2('0', { size: 150, fill: '#ffffff' }); scoreTxt.anchor.set(.5, 0); XS.gui.topCenter.addChild(scoreTxt); stage.on('down', function (obj) { var pos = obj.event.getLocalPosition(self); hero.target.x = pos.x; hero.target.y = pos.y; }); stage.on('move', function (obj) { var pos = obj.event.getLocalPosition(self); hero.target.x = pos.x; hero.target.y = pos.y; }); var enemies = []; var enemyCount = 0; function spawnEnemy() { var enemy = self.addChild(new Enemy()); var side = Math.floor(Math.random() * 4); switch (side) { case 0: enemy.x = Math.random() * 2048; enemy.y = -100; break; case 1: enemy.x = 2048 + 100; enemy.y = Math.random() * 2732; break; case 2: enemy.x = Math.random() * 2048; enemy.y = 2732 + 100; break; case 3: enemy.x = -100; enemy.y = Math.random() * 2732; break; } enemies.push(enemy); enemyCount++; } for (var i = 0; i < 10; i++) { spawnEnemy(); } var bullets = []; XS.on('tick', function () { heroAliveTime++; if (XS.ticks % Math.max(10, 100 - Math.floor(heroAliveTime / 1000)) === 0) { spawnEnemy(); } hero.move(); var dx = hero.target.x - hero.x; var dy = hero.target.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (hero.isMoving) { targetIndicator.visible = true; targetIndicator.x = hero.target.x; targetIndicator.y = hero.target.y; } else { targetIndicator.visible = false; } if (XS.ticks % 40 === 0 && !hero.isMoving) { var nearestEnemy = hero.findNearestEnemy(enemies); if (nearestEnemy) { var bullet = hero.shoot(nearestEnemy); bullets.push(bullet); self.addChild(bullet); hero.rotation = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x); } } for (var i = 0; i < enemies.length; i++) { enemies[i].move(hero); enemies[i].shoot(); if (hero.intersects(enemies[i])) { XS.showGameOver(); return; } } for (var i = 0; i < bullets.length; i++) { bullets[i].move(); for (var j = 0; j < enemies.length; j++) { if (bullets[i].intersects(enemies[j])) { enemies[j].destroy(); enemies.splice(j, 1); bullets[i].destroy(); bullets.splice(i, 1); score++; scoreTxt.setText(score); break; } } } }); });
var TargetIndicator = Container.expand(function () {
var self = Container.call(this);
var indicatorGraphics = XS.getAsset('indicator', 'Target Indicator', .5, .5);
self.addChild(indicatorGraphics);
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = XS.getAsset('hero', 'Hero character', .5, .5);
heroGraphics.rotation = -Math.PI / 2;
self.addChild(heroGraphics);
self.target = {
x: 2048 / 2,
y: 2732 / 2
};
self.isMoving = false;
self.move = function () {
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += 5 * (dx / distance);
self.y += 5 * (dy / distance);
self.rotation = Math.atan2(dy, dx);
self.isMoving = true;
} else {
self.isMoving = false;
}
};
self.shoot = function (target) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
var dx = target.x - self.x;
var dy = target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
return bullet;
};
self.findNearestEnemy = function (enemies) {
var nearestDistance = Infinity;
var nearestEnemy = null;
for (var i = 0; i < enemies.length; i++) {
var dx = enemies[i].x - self.x;
var dy = enemies[i].y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemies[i];
}
}
return nearestEnemy;
};
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = XS.getAsset('enemy', 'Enemy character', .5, .5);
enemyGraphics.rotation = -Math.PI / 2;
self.addChild(enemyGraphics);
self.speed = 2;
self.move = function (hero) {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
self.x += self.speed * (dx / distance);
self.y += self.speed * (dy / distance);
self.rotation = Math.atan2(dy, dx);
};
self.shoot = function () {};
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = XS.getAsset('bullet', 'Bullet Graphics', .5, .5);
self.addChild(bulletGraphics);
self.speed = 10;
self.direction = {
x: 0,
y: 0
};
self.move = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
XS.stageContainer.setBackgroundColor(0x004000);
var score = 0;
var heroAliveTime = 0;
var targetIndicator = self.addChild(new TargetIndicator());
var hero = self.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
var scoreTxt = new Text2('0', {
size: 150,
fill: '#ffffff'
});
scoreTxt.anchor.set(.5, 0);
XS.gui.topCenter.addChild(scoreTxt);
stage.on('down', function (obj) {
var pos = obj.event.getLocalPosition(self);
hero.target.x = pos.x;
hero.target.y = pos.y;
});
stage.on('move', function (obj) {
var pos = obj.event.getLocalPosition(self);
hero.target.x = pos.x;
hero.target.y = pos.y;
});
var enemies = [];
var enemyCount = 0;
function spawnEnemy() {
var enemy = self.addChild(new Enemy());
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
enemy.x = Math.random() * 2048;
enemy.y = -100;
break;
case 1:
enemy.x = 2048 + 100;
enemy.y = Math.random() * 2732;
break;
case 2:
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 100;
break;
case 3:
enemy.x = -100;
enemy.y = Math.random() * 2732;
break;
}
enemies.push(enemy);
enemyCount++;
}
for (var i = 0; i < 10; i++) {
spawnEnemy();
}
var bullets = [];
XS.on('tick', function () {
heroAliveTime++;
if (XS.ticks % Math.max(10, 100 - Math.floor(heroAliveTime / 1000)) === 0) {
spawnEnemy();
}
hero.move();
var dx = hero.target.x - hero.x;
var dy = hero.target.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (hero.isMoving) {
targetIndicator.visible = true;
targetIndicator.x = hero.target.x;
targetIndicator.y = hero.target.y;
} else {
targetIndicator.visible = false;
}
if (XS.ticks % 40 === 0 && !hero.isMoving) {
var nearestEnemy = hero.findNearestEnemy(enemies);
if (nearestEnemy) {
var bullet = hero.shoot(nearestEnemy);
bullets.push(bullet);
self.addChild(bullet);
hero.rotation = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x);
}
}
for (var i = 0; i < enemies.length; i++) {
enemies[i].move(hero);
enemies[i].shoot();
if (hero.intersects(enemies[i])) {
XS.showGameOver();
return;
}
}
for (var i = 0; i < bullets.length; i++) {
bullets[i].move();
for (var j = 0; j < enemies.length; j++) {
if (bullets[i].intersects(enemies[j])) {
enemies[j].destroy();
enemies.splice(j, 1);
bullets[i].destroy();
bullets.splice(i, 1);
score++;
scoreTxt.setText(score);
break;
}
}
}
});
});
Alien organic tank, seen from above, no perspective. Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast.
Tank seen from the top Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast.