/****
* 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);
// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
self.type = 1;
self.asset = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Color tint for each powerup type for visual feedback
var tints = [0xffffff,
// fallback
0x33c1ff,
// 1: power (blue)
0xffe14d,
// 2: shield (yellow)
0x7bff7b,
// 3: rapid (green)
0xff3b3b,
// 4: slowmo (red)
0xff7bf7,
// 5: bomb (pink)
0x7b7bff,
// 6: score (purple)
0x00ffff,
// 7: shrink (cyan)
0xffa500,
// 8: expand (orange)
0x00ff00,
// 9: reflect (lime)
0xffffff // 10: multi (white)
];
self.setType = function (type) {
self.type = type;
if (type >= 1 && type <= 10) {
self.asset.tint = tints[type];
} else {
self.asset.tint = 0xffffff;
}
};
self.update = function () {
self.y += 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game state variables
// Ship (player)
// Enemy types
// Bullets
// Powerup
// Sounds
// Music
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;
// Powerup effect timers
// On player
// rapidFire: frames left of rapid fire
// shrink: frames left of shrink
// expand: frames left of expand
// reflect: frames left of reflect
PlayerShip.prototype.rapidFire = 0;
PlayerShip.prototype.shrink = 0;
PlayerShip.prototype.expand = 0;
PlayerShip.prototype.reflect = 0;
// On game
game.slowmo = 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;
// Randomly assign one of 10 powerup types, weighted for early game
var type = 1;
if (level < 3) {
// Early: mostly power/shield
type = Math.random() < 0.7 ? 1 : 2;
} else if (level < 6) {
// Add rapid, slowmo, bomb
var r = Math.random();
if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5;
} else {
// All types possible
type = 1 + Math.floor(Math.random() * 10);
}
if (typeof p.setType === "function") {
p.setType(type);
} else {
p.type = type;
}
powerups.push(p);
game.addChild(p);
}
// Main update loop
game.update = function () {
if (gameOver) return;
// Player shooting
if (player.shootCooldown > 0) player.shootCooldown--;
// Rapid fire powerup
if (player.rapidFire > 0) {
player.rapidFire--;
if (LK.ticks % 3 === 0) firePlayerBullets();
if (player.rapidFire === 0) {
// End rapid fire
}
} else {
if (LK.ticks % 6 === 0) firePlayerBullets();
}
// Player invincibility
if (player.invincible > 0) {
player.invincible--;
if (player.invincible === 0) {
tween(player, {
alpha: 1
}, {
duration: 200
});
}
}
// Shrink/Expand powerup
if (player.shrink > 0) {
player.shrink--;
if (player.shrink === 0) {
tween(player, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
}
if (player.expand > 0) {
player.expand--;
if (player.expand === 0) {
tween(player, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
}
// Slowmo powerup
if (game.slowmo > 0) {
game.slowmo--;
}
// 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];
// Slowmo: enemies move slower
if (game.slowmo > 0) {
if (LK.ticks % 2 === 0) {
e.update();
}
} else {
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];
// Slowmo: bullets move slower
if (game.slowmo > 0) {
if (LK.ticks % 2 === 0) {
eb.update();
}
} else {
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)) {
// Reflect powerup: reflect enemy bullets upward
if (player.reflect > 0) {
eb.dy = -Math.abs(eb.dy);
eb.dx = eb.dx;
continue;
}
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();
// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
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
});
} else if (p.type === 3) {
// Rapid fire: reduce shootCooldown for 8 seconds
player.rapidFire = 480; // frames
} else if (p.type === 4) {
// Slowmo: slow all enemies for 6 seconds
game.slowmo = 360;
} else if (p.type === 5) {
// Bomb: destroy all enemies on screen
for (var j = enemies.length - 1; j >= 0; j--) {
LK.setScore(LK.getScore() + enemies[j].scoreValue);
enemies[j].destroy();
enemies.splice(j, 1);
}
scoreTxt.setText(LK.getScore());
LK.effects.flashScreen(0xffffff, 400);
} else if (p.type === 6) {
// Score: +100 points
LK.setScore(LK.getScore() + 100);
scoreTxt.setText(LK.getScore());
} else if (p.type === 7) {
// Shrink: shrink player for 10 seconds
player.shrink = 600;
tween(player, {
scaleX: 0.6,
scaleY: 0.6
}, {
duration: 200
});
} else if (p.type === 8) {
// Expand: expand player for 10 seconds
player.expand = 600;
tween(player, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200
});
} else if (p.type === 9) {
// Reflect: reflect enemy bullets for 8 seconds
player.reflect = 480;
} else if (p.type === 10) {
// Multi: all effects for 3 seconds (except bomb/score)
player.rapidFire = 180;
player.invincible = 180;
player.reflect = 180;
player.shrink = 180;
tween(player, {
scaleX: 0.6,
scaleY: 0.6
}, {
duration: 200
});
game.slowmo = 180;
}
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
@@ -146,13 +146,45 @@
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
- var asset = self.attachAsset('powerup', {
+ // 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
+ self.type = 1;
+ self.asset = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
- self.type = 1; // 1: power, 2: shield
+ // Color tint for each powerup type for visual feedback
+ var tints = [0xffffff,
+ // fallback
+ 0x33c1ff,
+ // 1: power (blue)
+ 0xffe14d,
+ // 2: shield (yellow)
+ 0x7bff7b,
+ // 3: rapid (green)
+ 0xff3b3b,
+ // 4: slowmo (red)
+ 0xff7bf7,
+ // 5: bomb (pink)
+ 0x7b7bff,
+ // 6: score (purple)
+ 0x00ffff,
+ // 7: shrink (cyan)
+ 0xffa500,
+ // 8: expand (orange)
+ 0x00ff00,
+ // 9: reflect (lime)
+ 0xffffff // 10: multi (white)
+ ];
+ self.setType = function (type) {
+ self.type = type;
+ if (type >= 1 && type <= 10) {
+ self.asset.tint = tints[type];
+ } else {
+ self.asset.tint = 0xffffff;
+ }
+ };
self.update = function () {
self.y += 10;
};
return self;
@@ -167,15 +199,15 @@
/****
* Game Code
****/
-// Music
-// Sounds
-// Powerup
-// Bullets
-// Enemy types
-// Ship (player)
// Game state variables
+// Ship (player)
+// Enemy types
+// Bullets
+// Powerup
+// Sounds
+// Music
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
@@ -189,8 +221,20 @@
var nextPowerupScore = 30;
var gameOver = false;
var lastIntersecting = false;
var invincibleTimer = 0;
+// Powerup effect timers
+// On player
+// rapidFire: frames left of rapid fire
+// shrink: frames left of shrink
+// expand: frames left of expand
+// reflect: frames left of reflect
+PlayerShip.prototype.rapidFire = 0;
+PlayerShip.prototype.shrink = 0;
+PlayerShip.prototype.expand = 0;
+PlayerShip.prototype.reflect = 0;
+// On game
+game.slowmo = 0;
// Set background color
game.setBackgroundColor(0x0a0a1a);
// Score display
scoreTxt = new Text2('0', {
@@ -299,23 +343,44 @@
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
+ // Randomly assign one of 10 powerup types, weighted for early game
+ var type = 1;
+ if (level < 3) {
+ // Early: mostly power/shield
+ type = Math.random() < 0.7 ? 1 : 2;
+ } else if (level < 6) {
+ // Add rapid, slowmo, bomb
+ var r = Math.random();
+ if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5;
} else {
- p.type = 1; // power
+ // All types possible
+ type = 1 + Math.floor(Math.random() * 10);
}
+ if (typeof p.setType === "function") {
+ p.setType(type);
+ } else {
+ p.type = type;
+ }
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();
+ // Rapid fire powerup
+ if (player.rapidFire > 0) {
+ player.rapidFire--;
+ if (LK.ticks % 3 === 0) firePlayerBullets();
+ if (player.rapidFire === 0) {
+ // End rapid fire
+ }
+ } else {
+ if (LK.ticks % 6 === 0) firePlayerBullets();
+ }
// Player invincibility
if (player.invincible > 0) {
player.invincible--;
if (player.invincible === 0) {
@@ -325,8 +390,35 @@
duration: 200
});
}
}
+ // Shrink/Expand powerup
+ if (player.shrink > 0) {
+ player.shrink--;
+ if (player.shrink === 0) {
+ tween(player, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ }
+ if (player.expand > 0) {
+ player.expand--;
+ if (player.expand === 0) {
+ tween(player, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ }
+ // Slowmo powerup
+ if (game.slowmo > 0) {
+ game.slowmo--;
+ }
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var b = playerBullets[i];
b.update();
@@ -356,9 +448,16 @@
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
- e.update();
+ // Slowmo: enemies move slower
+ if (game.slowmo > 0) {
+ if (LK.ticks % 2 === 0) {
+ e.update();
+ }
+ } else {
+ 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;
@@ -383,16 +482,29 @@
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
- eb.update();
+ // Slowmo: bullets move slower
+ if (game.slowmo > 0) {
+ if (LK.ticks % 2 === 0) {
+ eb.update();
+ }
+ } else {
+ 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)) {
+ // Reflect powerup: reflect enemy bullets upward
+ if (player.reflect > 0) {
+ eb.dy = -Math.abs(eb.dy);
+ eb.dx = eb.dx;
+ continue;
+ }
player.flash();
player.invincible = 60;
tween(player, {
alpha: 0.5
@@ -416,8 +528,9 @@
}
// Collision with player
if (p.intersects(player)) {
LK.getSound('powerup').play();
+ // 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
if (p.type === 1) {
// Power up: increase powerLevel
if (player.powerLevel < 3) player.powerLevel++;
} else if (p.type === 2) {
@@ -427,8 +540,61 @@
alpha: 0.5
}, {
duration: 100
});
+ } else if (p.type === 3) {
+ // Rapid fire: reduce shootCooldown for 8 seconds
+ player.rapidFire = 480; // frames
+ } else if (p.type === 4) {
+ // Slowmo: slow all enemies for 6 seconds
+ game.slowmo = 360;
+ } else if (p.type === 5) {
+ // Bomb: destroy all enemies on screen
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ LK.setScore(LK.getScore() + enemies[j].scoreValue);
+ enemies[j].destroy();
+ enemies.splice(j, 1);
+ }
+ scoreTxt.setText(LK.getScore());
+ LK.effects.flashScreen(0xffffff, 400);
+ } else if (p.type === 6) {
+ // Score: +100 points
+ LK.setScore(LK.getScore() + 100);
+ scoreTxt.setText(LK.getScore());
+ } else if (p.type === 7) {
+ // Shrink: shrink player for 10 seconds
+ player.shrink = 600;
+ tween(player, {
+ scaleX: 0.6,
+ scaleY: 0.6
+ }, {
+ duration: 200
+ });
+ } else if (p.type === 8) {
+ // Expand: expand player for 10 seconds
+ player.expand = 600;
+ tween(player, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 200
+ });
+ } else if (p.type === 9) {
+ // Reflect: reflect enemy bullets for 8 seconds
+ player.reflect = 480;
+ } else if (p.type === 10) {
+ // Multi: all effects for 3 seconds (except bomb/score)
+ player.rapidFire = 180;
+ player.invincible = 180;
+ player.reflect = 180;
+ player.shrink = 180;
+ tween(player, {
+ scaleX: 0.6,
+ scaleY: 0.6
+ }, {
+ duration: 200
+ });
+ game.slowmo = 180;
}
p.destroy();
powerups.splice(i, 1);
}
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