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.