/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.health = 5;
self.maxHealth = 5;
self.shootTimer = 0;
self.shootDelay = 30;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.moveTimer = 0;
self.update = function () {
self.y += self.speed;
self.moveTimer++;
if (self.moveTimer % 120 === 0) {
self.direction *= -1;
}
self.x += self.direction * 2;
if (self.x < 100 || self.x > 1948) {
self.direction *= -1;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
// Boss shoots 3 bullets in spread pattern
for (var k = -1; k <= 1; k++) {
var bullet = new EnemyBullet();
bullet.x = self.x + k * 40;
bullet.y = self.y + 60;
enemyBullets.push(bullet);
game.addChild(bullet);
}
}
// Visual health indicator
var healthRatio = self.health / self.maxHealth;
bossGraphics.tint = 0x8B0000 + 0x550000 * (1 - healthRatio);
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.shootTimer = 0;
self.shootDelay = 60 + Math.random() * 60;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.update = function () {
self.y += self.speed;
self.x += self.direction * 1;
if (self.x < 50 || self.x > 1998) {
self.direction *= -1;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 40;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.update = function () {
self.y -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B7355
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 2400;
player.health = 100;
player.maxHealth = 100;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var coins = [];
var dragNode = null;
var lastPlayerX = 1024;
var targetRotation = 0;
var waveNumber = 1;
var enemiesKilled = 0;
var enemiesPerWave = 3;
var isBossWave = false;
var bossSpawned = false;
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var waveTxt = new Text2('Wave: 1', {
size: 60,
fill: 0xFFDD44
});
waveTxt.anchor.set(0, 0);
waveTxt.x = 150;
waveTxt.y = 0;
LK.gui.topLeft.addChild(waveTxt);
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
healthBarBg.x = 150;
healthBarBg.y = 80;
LK.gui.topLeft.addChild(healthBarBg);
var healthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0
});
healthBar.x = 150;
healthBar.y = 80;
LK.gui.topLeft.addChild(healthBar);
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
function updateWave() {
waveTxt.setText('Wave: ' + waveNumber);
}
function updateHealth() {
var healthRatio = player.health / player.maxHealth;
healthBar.width = 300 * healthRatio;
// Change color based on health level
if (healthRatio > 0.6) {
healthBar.tint = 0x00ff00; // Green
} else if (healthRatio > 0.3) {
healthBar.tint = 0xffff00; // Yellow
} else {
healthBar.tint = 0xff0000; // Red
}
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemy.speed = 1 + waveNumber * 0.3;
enemy.shootDelay = Math.max(30, 60 - waveNumber * 2);
enemies.push(enemy);
game.addChild(enemy);
}
function spawnBoss() {
var boss = new Boss();
boss.x = 1024;
boss.y = -100;
boss.speed = 0.5 + waveNumber * 0.1;
boss.health = 3 + Math.floor(waveNumber / 5);
boss.maxHealth = boss.health;
enemies.push(boss);
game.addChild(boss);
bossSpawned = true;
}
function spawnWave() {
isBossWave = waveNumber % 5 === 0;
bossSpawned = false;
if (isBossWave) {
// Boss wave: spawn boss after delay
LK.setTimeout(function () {
spawnBoss();
}, 1500);
// Add some regular enemies too for boss waves
var regularEnemies = Math.min(3, Math.floor(waveNumber / 5));
for (var i = 0; i < regularEnemies; i++) {
LK.setTimeout(function () {
spawnEnemy();
}, i * 800);
}
} else {
// Regular wave
for (var i = 0; i < enemiesPerWave; i++) {
LK.setTimeout(function () {
spawnEnemy();
}, i * (1000 - waveNumber * 50));
}
}
}
function handleMove(x, y, obj) {
if (dragNode) {
var newX = Math.max(40, Math.min(2008, x));
var newY = Math.max(100, Math.min(2632, y));
dragNode.x = newX;
dragNode.y = newY;
// Calculate rotation based on movement direction
var deltaX = newX - lastPlayerX;
if (Math.abs(deltaX) > 5) {
// Only rotate if significant movement
if (deltaX > 0) {
// Moving right - rotate clockwise
targetRotation = Math.PI / 6; // 30 degrees
} else {
// Moving left - rotate counter-clockwise
targetRotation = -Math.PI / 6; // -30 degrees
}
} else {
// Not moving much horizontally - return to neutral
targetRotation = 0;
}
// Smooth rotation transition using tween
tween.stop(dragNode, {
rotation: true
});
tween(dragNode, {
rotation: targetRotation
}, {
duration: 200,
easing: tween.easeOut
});
lastPlayerX = newX;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Always set player as drag target for movement
dragNode = player;
lastPlayerX = player.x;
handleMove(x, y, obj);
// Also shoot a bullet
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
game.up = function (x, y, obj) {
dragNode = null;
// Return to neutral rotation when not moving
tween.stop(player, {
rotation: true
});
tween(player, {
rotation: 0
}, {
duration: 300,
easing: tween.easeOut
});
};
updateHealth();
spawnWave();
game.update = function () {
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Handle boss health
if (enemy.health !== undefined) {
enemy.health--;
LK.effects.flashObject(enemy, 0xFF0000, 200);
if (enemy.health > 0) {
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
// Boss defeated
LK.setScore(LK.getScore() + 50);
} else {
// Regular enemy
LK.setScore(LK.getScore() + 10);
}
updateScore();
enemiesKilled++;
// Drop coin
var coin = new Coin();
coin.x = enemy.x;
coin.y = enemy.y;
coins.push(coin);
game.addChild(coin);
LK.getSound('enemyHit').play();
LK.effects.flashObject(enemy, 0xFF0000, 200);
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
break;
}
}
bullet.lastY = bullet.y;
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY <= 2742 && bullet.y > 2742) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
player.health -= 20;
updateHealth();
LK.getSound('playerHit').play();
LK.effects.flashObject(player, 0xFF0000, 300);
bullet.destroy();
enemyBullets.splice(i, 1);
if (player.health <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
bullet.lastY = bullet.y;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastY <= 2742 && enemy.y > 2742) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
player.health -= 30;
updateHealth();
LK.getSound('playerHit').play();
LK.effects.flashObject(player, 0xFF0000, 500);
enemy.destroy();
enemies.splice(i, 1);
if (player.health <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
enemy.lastY = enemy.y;
}
// Update coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.lastY === undefined) coin.lastY = coin.y;
if (coin.lastY <= 2742 && coin.y > 2742) {
coin.destroy();
coins.splice(i, 1);
continue;
}
// Check collision with player
if (coin.intersects(player)) {
LK.setScore(LK.getScore() + 5);
updateScore();
LK.getSound('coinCollect').play();
LK.effects.flashObject(coin, 0xFFFFFF, 300);
coin.destroy();
coins.splice(i, 1);
continue;
}
coin.lastY = coin.y;
}
// Check if wave is complete
var waveComplete = false;
if (isBossWave) {
waveComplete = enemies.length === 0 && bossSpawned;
} else {
waveComplete = enemies.length === 0 && enemiesKilled >= enemiesPerWave;
}
if (waveComplete) {
waveNumber++;
// Increase difficulty progressively
if (waveNumber % 5 === 0) {
// Boss waves don't increase regular enemy count
enemiesPerWave = Math.min(10, enemiesPerWave);
} else {
enemiesPerWave = Math.min(10, 3 + Math.floor(waveNumber / 3));
}
updateWave();
enemiesKilled = 0;
// Bonus score for completing waves
var waveBonus = isBossWave ? 100 : 25;
LK.setScore(LK.getScore() + waveBonus);
updateScore();
// Show wave completion message
if (isBossWave) {
LK.effects.flashScreen(0x00FF00, 500);
}
LK.setTimeout(function () {
spawnWave();
}, isBossWave ? 3000 : 2000);
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.health = 5;
self.maxHealth = 5;
self.shootTimer = 0;
self.shootDelay = 30;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.moveTimer = 0;
self.update = function () {
self.y += self.speed;
self.moveTimer++;
if (self.moveTimer % 120 === 0) {
self.direction *= -1;
}
self.x += self.direction * 2;
if (self.x < 100 || self.x > 1948) {
self.direction *= -1;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
// Boss shoots 3 bullets in spread pattern
for (var k = -1; k <= 1; k++) {
var bullet = new EnemyBullet();
bullet.x = self.x + k * 40;
bullet.y = self.y + 60;
enemyBullets.push(bullet);
game.addChild(bullet);
}
}
// Visual health indicator
var healthRatio = self.health / self.maxHealth;
bossGraphics.tint = 0x8B0000 + 0x550000 * (1 - healthRatio);
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.shootTimer = 0;
self.shootDelay = 60 + Math.random() * 60;
self.direction = Math.random() < 0.5 ? -1 : 1;
self.update = function () {
self.y += self.speed;
self.x += self.direction * 1;
if (self.x < 50 || self.x > 1998) {
self.direction *= -1;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 40;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.update = function () {
self.y -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B7355
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 2400;
player.health = 100;
player.maxHealth = 100;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var coins = [];
var dragNode = null;
var lastPlayerX = 1024;
var targetRotation = 0;
var waveNumber = 1;
var enemiesKilled = 0;
var enemiesPerWave = 3;
var isBossWave = false;
var bossSpawned = false;
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var waveTxt = new Text2('Wave: 1', {
size: 60,
fill: 0xFFDD44
});
waveTxt.anchor.set(0, 0);
waveTxt.x = 150;
waveTxt.y = 0;
LK.gui.topLeft.addChild(waveTxt);
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
healthBarBg.x = 150;
healthBarBg.y = 80;
LK.gui.topLeft.addChild(healthBarBg);
var healthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0
});
healthBar.x = 150;
healthBar.y = 80;
LK.gui.topLeft.addChild(healthBar);
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
function updateWave() {
waveTxt.setText('Wave: ' + waveNumber);
}
function updateHealth() {
var healthRatio = player.health / player.maxHealth;
healthBar.width = 300 * healthRatio;
// Change color based on health level
if (healthRatio > 0.6) {
healthBar.tint = 0x00ff00; // Green
} else if (healthRatio > 0.3) {
healthBar.tint = 0xffff00; // Yellow
} else {
healthBar.tint = 0xff0000; // Red
}
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemy.speed = 1 + waveNumber * 0.3;
enemy.shootDelay = Math.max(30, 60 - waveNumber * 2);
enemies.push(enemy);
game.addChild(enemy);
}
function spawnBoss() {
var boss = new Boss();
boss.x = 1024;
boss.y = -100;
boss.speed = 0.5 + waveNumber * 0.1;
boss.health = 3 + Math.floor(waveNumber / 5);
boss.maxHealth = boss.health;
enemies.push(boss);
game.addChild(boss);
bossSpawned = true;
}
function spawnWave() {
isBossWave = waveNumber % 5 === 0;
bossSpawned = false;
if (isBossWave) {
// Boss wave: spawn boss after delay
LK.setTimeout(function () {
spawnBoss();
}, 1500);
// Add some regular enemies too for boss waves
var regularEnemies = Math.min(3, Math.floor(waveNumber / 5));
for (var i = 0; i < regularEnemies; i++) {
LK.setTimeout(function () {
spawnEnemy();
}, i * 800);
}
} else {
// Regular wave
for (var i = 0; i < enemiesPerWave; i++) {
LK.setTimeout(function () {
spawnEnemy();
}, i * (1000 - waveNumber * 50));
}
}
}
function handleMove(x, y, obj) {
if (dragNode) {
var newX = Math.max(40, Math.min(2008, x));
var newY = Math.max(100, Math.min(2632, y));
dragNode.x = newX;
dragNode.y = newY;
// Calculate rotation based on movement direction
var deltaX = newX - lastPlayerX;
if (Math.abs(deltaX) > 5) {
// Only rotate if significant movement
if (deltaX > 0) {
// Moving right - rotate clockwise
targetRotation = Math.PI / 6; // 30 degrees
} else {
// Moving left - rotate counter-clockwise
targetRotation = -Math.PI / 6; // -30 degrees
}
} else {
// Not moving much horizontally - return to neutral
targetRotation = 0;
}
// Smooth rotation transition using tween
tween.stop(dragNode, {
rotation: true
});
tween(dragNode, {
rotation: targetRotation
}, {
duration: 200,
easing: tween.easeOut
});
lastPlayerX = newX;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Always set player as drag target for movement
dragNode = player;
lastPlayerX = player.x;
handleMove(x, y, obj);
// Also shoot a bullet
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
game.up = function (x, y, obj) {
dragNode = null;
// Return to neutral rotation when not moving
tween.stop(player, {
rotation: true
});
tween(player, {
rotation: 0
}, {
duration: 300,
easing: tween.easeOut
});
};
updateHealth();
spawnWave();
game.update = function () {
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Handle boss health
if (enemy.health !== undefined) {
enemy.health--;
LK.effects.flashObject(enemy, 0xFF0000, 200);
if (enemy.health > 0) {
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
// Boss defeated
LK.setScore(LK.getScore() + 50);
} else {
// Regular enemy
LK.setScore(LK.getScore() + 10);
}
updateScore();
enemiesKilled++;
// Drop coin
var coin = new Coin();
coin.x = enemy.x;
coin.y = enemy.y;
coins.push(coin);
game.addChild(coin);
LK.getSound('enemyHit').play();
LK.effects.flashObject(enemy, 0xFF0000, 200);
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
break;
}
}
bullet.lastY = bullet.y;
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY <= 2742 && bullet.y > 2742) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
player.health -= 20;
updateHealth();
LK.getSound('playerHit').play();
LK.effects.flashObject(player, 0xFF0000, 300);
bullet.destroy();
enemyBullets.splice(i, 1);
if (player.health <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
bullet.lastY = bullet.y;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastY <= 2742 && enemy.y > 2742) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
player.health -= 30;
updateHealth();
LK.getSound('playerHit').play();
LK.effects.flashObject(player, 0xFF0000, 500);
enemy.destroy();
enemies.splice(i, 1);
if (player.health <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
continue;
}
enemy.lastY = enemy.y;
}
// Update coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.lastY === undefined) coin.lastY = coin.y;
if (coin.lastY <= 2742 && coin.y > 2742) {
coin.destroy();
coins.splice(i, 1);
continue;
}
// Check collision with player
if (coin.intersects(player)) {
LK.setScore(LK.getScore() + 5);
updateScore();
LK.getSound('coinCollect').play();
LK.effects.flashObject(coin, 0xFFFFFF, 300);
coin.destroy();
coins.splice(i, 1);
continue;
}
coin.lastY = coin.y;
}
// Check if wave is complete
var waveComplete = false;
if (isBossWave) {
waveComplete = enemies.length === 0 && bossSpawned;
} else {
waveComplete = enemies.length === 0 && enemiesKilled >= enemiesPerWave;
}
if (waveComplete) {
waveNumber++;
// Increase difficulty progressively
if (waveNumber % 5 === 0) {
// Boss waves don't increase regular enemy count
enemiesPerWave = Math.min(10, enemiesPerWave);
} else {
enemiesPerWave = Math.min(10, 3 + Math.floor(waveNumber / 3));
}
updateWave();
enemiesKilled = 0;
// Bonus score for completing waves
var waveBonus = isBossWave ? 100 : 25;
LK.setScore(LK.getScore() + waveBonus);
updateScore();
// Show wave completion message
if (isBossWave) {
LK.effects.flashScreen(0x00FF00, 500);
}
LK.setTimeout(function () {
spawnWave();
}, isBossWave ? 3000 : 2000);
}
};
Make me a boss for RDR2. In-Game asset. 2d. High contrast. No shadows
Make me a coin for RDR2. In-Game asset. 2d. High contrast. No shadows
Make me a enemy for RDR2. In-Game asset. 2d. High contrast. No shadows
Make me a enemy bullet for RDR2. In-Game asset. 2d. High contrast. No shadows
Make me a player bullet for RDR2. In-Game asset. 2d. High contrast. No shadows
Make me a Player for RDR2. In-Game asset. 2d. High contrast. No shadows