/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.type = 1; // 1,2,3
self.hp = 1;
self.shootTimer = 0;
self.pattern = 0; // 0: straight, 1: sine, 2: zigzag
self.baseX = 0;
self.baseY = 0;
self.t = 0;
self.speed = 4;
self.scoreValue = 10;
self.asset = null;
self.init = function (type, pattern) {
self.type = type;
self.pattern = pattern;
if (type === 1) {
self.asset = self.attachAsset('enemy1', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 1;
self.scoreValue = 10;
} else if (type === 2) {
self.asset = self.attachAsset('enemy2', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 2;
self.scoreValue = 20;
} else if (type === 3) {
self.asset = self.attachAsset('enemy3', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 3;
self.scoreValue = 40;
}
self.width = self.asset.width;
self.height = self.asset.height;
self.baseX = self.x;
self.baseY = self.y;
self.t = 0;
self.shootTimer = 0;
self.speed = 4 + type;
};
self.update = function () {
self.t += 1;
// Movement patterns
if (self.pattern === 0) {
// Straight down
self.y += self.speed;
} else if (self.pattern === 1) {
// Sine wave
self.y += self.speed;
self.x = self.baseX + Math.sin(self.t / 20) * 180;
} else if (self.pattern === 2) {
// Zigzag
self.y += self.speed;
self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80);
}
};
// Flash when hit
self.flash = function () {
tween(self.asset, {
tint: 0xffffff
}, {
duration: 80,
onFinish: function onFinish() {
tween(self.asset, {
tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b
}, {
duration: 120
});
}
});
};
return self;
});
// Enemy Bullet
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bullet = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 18;
self.dx = 0;
self.dy = 1;
self.update = function () {
self.x += self.dx * self.speed;
self.y += self.dy * self.speed;
};
return self;
});
// Player Bullet
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bullet = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -32;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Ship
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
self.speed = 22;
self.shootCooldown = 0;
self.powerLevel = 1; // 1: single, 2: double, 3: triple
self.invincible = 0; // frames left of invincibility
// Flash when hit
self.flash = function () {
tween(ship, {
tint: 0xffff00
}, {
duration: 100,
onFinish: function onFinish() {
tween(ship, {
tint: 0x33c1ff
}, {
duration: 200
});
}
});
};
return self;
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
var asset = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 1; // 1: power, 2: shield
self.update = function () {
self.y += 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Music
// Sounds
// Powerup
// Bullets
// Enemy types
// Ship (player)
// Game state variables
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var dragNode = null;
var lastMoveX = 0;
var lastMoveY = 0;
var scoreTxt = null;
var level = 1;
var waveTimer = 0;
var nextPowerupScore = 30;
var gameOver = false;
var lastIntersecting = false;
var invincibleTimer = 0;
// Set background color
game.setBackgroundColor(0x0a0a1a);
// Score display
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player
player = new PlayerShip();
player.x = 2048 / 2;
player.y = 2732 - 200;
game.addChild(player);
// Start music
LK.playMusic('bgmusic');
// Touch controls
game.down = function (x, y, obj) {
// Only allow drag if touch is on lower 1/3 of screen
if (y > 2732 * 0.6) {
dragNode = player;
lastMoveX = x;
lastMoveY = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
function handleMove(x, y, obj) {
if (dragNode === player) {
// Clamp to screen
var minX = player.width / 2 + 20;
var maxX = 2048 - player.width / 2 - 20;
var minY = 2732 * 0.6;
var maxY = 2732 - player.height / 2 - 20;
player.x = Math.max(minX, Math.min(maxX, x));
player.y = Math.max(minY, Math.min(maxY, y));
}
}
game.move = handleMove;
// Fire player bullets
function firePlayerBullets() {
if (player.shootCooldown > 0) return;
var b;
if (player.powerLevel === 1) {
b = new PlayerBullet();
b.x = player.x;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
} else if (player.powerLevel === 2) {
b = new PlayerBullet();
b.x = player.x - 32;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x + 32;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
} else if (player.powerLevel >= 3) {
b = new PlayerBullet();
b.x = player.x;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x - 48;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x + 48;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
}
LK.getSound('shoot').play();
player.shootCooldown = 10; // frames
}
// Spawn enemy wave
function spawnWave() {
var n = 4 + Math.floor(level * 0.7);
var margin = 180;
var spacing = (2048 - margin * 2) / (n - 1);
var y0 = -100;
for (var i = 0; i < n; i++) {
var e = new Enemy();
// Evolve enemy types and patterns as level increases
var type = 1;
var pattern = 0;
if (level >= 3 && Math.random() < 0.4) type = 2;
if (level >= 7 && Math.random() < 0.25) type = 3;
if (level >= 2 && Math.random() < 0.3) pattern = 1;
if (level >= 5 && Math.random() < 0.2) pattern = 2;
e.init(type, pattern);
e.x = margin + i * spacing;
e.y = y0 - Math.random() * 120;
e.baseX = e.x;
e.baseY = e.y;
enemies.push(e);
game.addChild(e);
}
}
// Spawn powerup
function spawnPowerup() {
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -60;
// Evolve powerup type
if (level >= 5 && Math.random() < 0.5) {
p.type = 2; // shield
} else {
p.type = 1; // power
}
powerups.push(p);
game.addChild(p);
}
// Main update loop
game.update = function () {
if (gameOver) return;
// Player shooting
if (player.shootCooldown > 0) player.shootCooldown--;
if (LK.ticks % 6 === 0) firePlayerBullets();
// Player invincibility
if (player.invincible > 0) {
player.invincible--;
if (player.invincible === 0) {
tween(player, {
alpha: 1
}, {
duration: 200
});
}
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var b = playerBullets[i];
b.update();
if (b.y < -60) {
b.destroy();
playerBullets.splice(i, 1);
continue;
}
// Collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
if (b.intersects(e)) {
e.hp--;
e.flash();
if (e.hp <= 0) {
LK.setScore(LK.getScore() + e.scoreValue);
scoreTxt.setText(LK.getScore());
LK.getSound('explosion').play();
e.destroy();
enemies.splice(j, 1);
}
b.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
e.update();
// Enemy shoots
if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) {
var eb = new EnemyBullet();
eb.x = e.x;
eb.y = e.y + e.height / 2 + 10;
// Aim at player
var dx = player.x - e.x;
var dy = player.y - e.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0) {
eb.dx = dx / len;
eb.dy = dy / len;
}
enemyBullets.push(eb);
game.addChild(eb);
LK.getSound('enemyShoot').play();
}
// Remove if off screen
if (e.y > 2732 + 100) {
e.destroy();
enemies.splice(i, 1);
}
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
eb.update();
if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
eb.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Collision with player
if (player.invincible === 0 && eb.intersects(player)) {
player.flash();
player.invincible = 60;
tween(player, {
alpha: 0.5
}, {
duration: 100
});
LK.effects.flashScreen(0xff0000, 400);
LK.showGameOver();
gameOver = true;
return;
}
}
// Update powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
if (p.y > 2732 + 60) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Collision with player
if (p.intersects(player)) {
LK.getSound('powerup').play();
if (p.type === 1) {
// Power up: increase powerLevel
if (player.powerLevel < 3) player.powerLevel++;
} else if (p.type === 2) {
// Shield: invincibility
player.invincible = 180;
tween(player, {
alpha: 0.5
}, {
duration: 100
});
}
p.destroy();
powerups.splice(i, 1);
}
}
// Spawn new wave if all enemies gone
if (enemies.length === 0 && waveTimer <= 0) {
spawnWave();
level++;
waveTimer = 60;
}
if (waveTimer > 0) waveTimer--;
// Spawn powerup at score milestones
if (LK.getScore() >= nextPowerupScore) {
spawnPowerup();
nextPowerupScore += 40 + Math.floor(level * 10);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,448 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Enemy
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ self.type = 1; // 1,2,3
+ self.hp = 1;
+ self.shootTimer = 0;
+ self.pattern = 0; // 0: straight, 1: sine, 2: zigzag
+ self.baseX = 0;
+ self.baseY = 0;
+ self.t = 0;
+ self.speed = 4;
+ self.scoreValue = 10;
+ self.asset = null;
+ self.init = function (type, pattern) {
+ self.type = type;
+ self.pattern = pattern;
+ if (type === 1) {
+ self.asset = self.attachAsset('enemy1', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hp = 1;
+ self.scoreValue = 10;
+ } else if (type === 2) {
+ self.asset = self.attachAsset('enemy2', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hp = 2;
+ self.scoreValue = 20;
+ } else if (type === 3) {
+ self.asset = self.attachAsset('enemy3', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hp = 3;
+ self.scoreValue = 40;
+ }
+ self.width = self.asset.width;
+ self.height = self.asset.height;
+ self.baseX = self.x;
+ self.baseY = self.y;
+ self.t = 0;
+ self.shootTimer = 0;
+ self.speed = 4 + type;
+ };
+ self.update = function () {
+ self.t += 1;
+ // Movement patterns
+ if (self.pattern === 0) {
+ // Straight down
+ self.y += self.speed;
+ } else if (self.pattern === 1) {
+ // Sine wave
+ self.y += self.speed;
+ self.x = self.baseX + Math.sin(self.t / 20) * 180;
+ } else if (self.pattern === 2) {
+ // Zigzag
+ self.y += self.speed;
+ self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80);
+ }
+ };
+ // Flash when hit
+ self.flash = function () {
+ tween(self.asset, {
+ tint: 0xffffff
+ }, {
+ duration: 80,
+ onFinish: function onFinish() {
+ tween(self.asset, {
+ tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b
+ }, {
+ duration: 120
+ });
+ }
+ });
+ };
+ return self;
+});
+// Enemy Bullet
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bullet = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 18;
+ self.dx = 0;
+ self.dy = 1;
+ self.update = function () {
+ self.x += self.dx * self.speed;
+ self.y += self.dy * self.speed;
+ };
+ return self;
+});
+// Player Bullet
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bullet = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -32;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Ship
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var ship = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ship.width;
+ self.height = ship.height;
+ self.speed = 22;
+ self.shootCooldown = 0;
+ self.powerLevel = 1; // 1: single, 2: double, 3: triple
+ self.invincible = 0; // frames left of invincibility
+ // Flash when hit
+ self.flash = function () {
+ tween(ship, {
+ tint: 0xffff00
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(ship, {
+ tint: 0x33c1ff
+ }, {
+ duration: 200
+ });
+ }
+ });
+ };
+ return self;
+});
+// Powerup
+var Powerup = Container.expand(function () {
+ var self = Container.call(this);
+ var asset = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 1; // 1: power, 2: shield
+ self.update = function () {
+ self.y += 10;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sounds
+// Powerup
+// Bullets
+// Enemy types
+// Ship (player)
+// Game state variables
+var player = null;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerups = [];
+var dragNode = null;
+var lastMoveX = 0;
+var lastMoveY = 0;
+var scoreTxt = null;
+var level = 1;
+var waveTimer = 0;
+var nextPowerupScore = 30;
+var gameOver = false;
+var lastIntersecting = false;
+var invincibleTimer = 0;
+// Set background color
+game.setBackgroundColor(0x0a0a1a);
+// Score display
+scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Initialize player
+player = new PlayerShip();
+player.x = 2048 / 2;
+player.y = 2732 - 200;
+game.addChild(player);
+// Start music
+LK.playMusic('bgmusic');
+// Touch controls
+game.down = function (x, y, obj) {
+ // Only allow drag if touch is on lower 1/3 of screen
+ if (y > 2732 * 0.6) {
+ dragNode = player;
+ lastMoveX = x;
+ lastMoveY = y;
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+function handleMove(x, y, obj) {
+ if (dragNode === player) {
+ // Clamp to screen
+ var minX = player.width / 2 + 20;
+ var maxX = 2048 - player.width / 2 - 20;
+ var minY = 2732 * 0.6;
+ var maxY = 2732 - player.height / 2 - 20;
+ player.x = Math.max(minX, Math.min(maxX, x));
+ player.y = Math.max(minY, Math.min(maxY, y));
+ }
+}
+game.move = handleMove;
+// Fire player bullets
+function firePlayerBullets() {
+ if (player.shootCooldown > 0) return;
+ var b;
+ if (player.powerLevel === 1) {
+ b = new PlayerBullet();
+ b.x = player.x;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ } else if (player.powerLevel === 2) {
+ b = new PlayerBullet();
+ b.x = player.x - 32;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ b = new PlayerBullet();
+ b.x = player.x + 32;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ } else if (player.powerLevel >= 3) {
+ b = new PlayerBullet();
+ b.x = player.x;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ b = new PlayerBullet();
+ b.x = player.x - 48;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ b = new PlayerBullet();
+ b.x = player.x + 48;
+ b.y = player.y - player.height / 2 - 10;
+ playerBullets.push(b);
+ game.addChild(b);
+ }
+ LK.getSound('shoot').play();
+ player.shootCooldown = 10; // frames
+}
+// Spawn enemy wave
+function spawnWave() {
+ var n = 4 + Math.floor(level * 0.7);
+ var margin = 180;
+ var spacing = (2048 - margin * 2) / (n - 1);
+ var y0 = -100;
+ for (var i = 0; i < n; i++) {
+ var e = new Enemy();
+ // Evolve enemy types and patterns as level increases
+ var type = 1;
+ var pattern = 0;
+ if (level >= 3 && Math.random() < 0.4) type = 2;
+ if (level >= 7 && Math.random() < 0.25) type = 3;
+ if (level >= 2 && Math.random() < 0.3) pattern = 1;
+ if (level >= 5 && Math.random() < 0.2) pattern = 2;
+ e.init(type, pattern);
+ e.x = margin + i * spacing;
+ e.y = y0 - Math.random() * 120;
+ e.baseX = e.x;
+ e.baseY = e.y;
+ enemies.push(e);
+ game.addChild(e);
+ }
+}
+// Spawn powerup
+function spawnPowerup() {
+ var p = new Powerup();
+ p.x = 200 + Math.random() * (2048 - 400);
+ p.y = -60;
+ // Evolve powerup type
+ if (level >= 5 && Math.random() < 0.5) {
+ p.type = 2; // shield
+ } else {
+ p.type = 1; // power
+ }
+ powerups.push(p);
+ game.addChild(p);
+}
+// Main update loop
+game.update = function () {
+ if (gameOver) return;
+ // Player shooting
+ if (player.shootCooldown > 0) player.shootCooldown--;
+ if (LK.ticks % 6 === 0) firePlayerBullets();
+ // Player invincibility
+ if (player.invincible > 0) {
+ player.invincible--;
+ if (player.invincible === 0) {
+ tween(player, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ }
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var b = playerBullets[i];
+ b.update();
+ if (b.y < -60) {
+ b.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Collision with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var e = enemies[j];
+ if (b.intersects(e)) {
+ e.hp--;
+ e.flash();
+ if (e.hp <= 0) {
+ LK.setScore(LK.getScore() + e.scoreValue);
+ scoreTxt.setText(LK.getScore());
+ LK.getSound('explosion').play();
+ e.destroy();
+ enemies.splice(j, 1);
+ }
+ b.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var e = enemies[i];
+ e.update();
+ // Enemy shoots
+ if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) {
+ var eb = new EnemyBullet();
+ eb.x = e.x;
+ eb.y = e.y + e.height / 2 + 10;
+ // Aim at player
+ var dx = player.x - e.x;
+ var dy = player.y - e.y;
+ var len = Math.sqrt(dx * dx + dy * dy);
+ if (len > 0) {
+ eb.dx = dx / len;
+ eb.dy = dy / len;
+ }
+ enemyBullets.push(eb);
+ game.addChild(eb);
+ LK.getSound('enemyShoot').play();
+ }
+ // Remove if off screen
+ if (e.y > 2732 + 100) {
+ e.destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var eb = enemyBullets[i];
+ eb.update();
+ if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
+ eb.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (player.invincible === 0 && eb.intersects(player)) {
+ player.flash();
+ player.invincible = 60;
+ tween(player, {
+ alpha: 0.5
+ }, {
+ duration: 100
+ });
+ LK.effects.flashScreen(0xff0000, 400);
+ LK.showGameOver();
+ gameOver = true;
+ return;
+ }
+ }
+ // Update powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var p = powerups[i];
+ p.update();
+ if (p.y > 2732 + 60) {
+ p.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (p.intersects(player)) {
+ LK.getSound('powerup').play();
+ if (p.type === 1) {
+ // Power up: increase powerLevel
+ if (player.powerLevel < 3) player.powerLevel++;
+ } else if (p.type === 2) {
+ // Shield: invincibility
+ player.invincible = 180;
+ tween(player, {
+ alpha: 0.5
+ }, {
+ duration: 100
+ });
+ }
+ p.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // Spawn new wave if all enemies gone
+ if (enemies.length === 0 && waveTimer <= 0) {
+ spawnWave();
+ level++;
+ waveTimer = 60;
+ }
+ if (waveTimer > 0) waveTimer--;
+ // Spawn powerup at score milestones
+ if (LK.getScore() >= nextPowerupScore) {
+ spawnPowerup();
+ nextPowerupScore += 40 + Math.floor(level * 10);
+ }
+};
\ No newline at end of file
Make me a Spacelnvaders InfinityGene EVO character. In-Game asset. 2d. High contrast. No shadows
Make a Spacelnvaders InfinityGene EVO enemy character. In-Game asset. 2d. High contrast. No shadows
Make this blue and green
Make this red and purple
Bana uzay gemisinin mermisini 2d pixel çiz. In-Game asset. 2d. High contrast. No shadows