User prompt
notalarin dustugu tepeye asagi donuk bir tunel yap ve notalar bundan dussun
Code edit (1 edits merged)
Please save this source code
User prompt
Stair Note Catcher
Initial prompt
oyuncu var ver asagidaki merdivenler ile yukaridan gelen notalari yakalamaya calisacak.toplam 7 farkli nota olacak ve 7 sira olacak.asagida ise 7 sira merdiven olacak oyucu sag sol yaparak merdivenler ile nota toplayacak,oyuncunun 3 kalbi olacak.aralarda bombalar gelecek ve oyuncu bombalara degerse 1 kalbi gidecek ve hic kalbi kalmazsa oyunu kaybedecek.oyunda skor tablosu olacak.ve ozel shieldi alarsa kisa sureligine kalkan kazanacak,kalkan sayeside bombalar oyuncuyu etkileyemeyecek.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var FallingBomb = Container.expand(function (lane) { var self = Container.call(this); var bombGraphics = self.attachAsset('bomb', { anchorX: 0.5, anchorY: 0.5 }); self.lane = lane; self.speed = 8; self.update = function () { self.y += self.speed; }; return self; }); var FallingNote = Container.expand(function (noteType, lane) { var self = Container.call(this); var noteGraphics = self.attachAsset('note' + noteType, { anchorX: 0.5, anchorY: 0.5 }); self.lane = lane; self.speed = 8; self.noteType = noteType; 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 }); self.currentLane = 3; self.shieldActive = false; self.shieldTimer = 0; self.shieldEffect = null; self.update = function () { if (self.shieldActive) { self.shieldTimer--; // Update shield effect position to follow player if (self.shieldEffect) { self.shieldEffect.x = self.x; self.shieldEffect.y = self.y; } if (self.shieldTimer <= 0) { self.shieldActive = false; playerGraphics.tint = 0xFFFFFF; shieldUI.container.visible = false; // Remove shield effect when shield ends if (self.shieldEffect) { self.shieldEffect.destroy(); self.shieldEffect = null; } } else { // Update shield timer bar var progress = self.shieldTimer / 300; // 300 is max shield time shieldUI.barFg.width = 300 * progress; } } else { shieldUI.container.visible = false; } }; self.activateShield = function () { self.shieldActive = true; self.shieldTimer = 300; // 5 seconds at 60fps playerGraphics.tint = 0xFFD700; shieldUI.container.visible = true; shieldUI.barFg.width = 300; // Remove any existing shield effect first if (self.shieldEffect) { self.shieldEffect.destroy(); self.shieldEffect = null; } // Create shield activation effect that persists only when shield is active if (self.shieldActive) { self.shieldEffect = new ShieldEffect(); self.shieldEffect.x = self.x; self.shieldEffect.y = self.y; game.addChild(self.shieldEffect); self.shieldEffect.startEffect(); } }; return self; }); var ShieldEffect = Container.expand(function () { var self = Container.call(this); var effectGraphics = self.attachAsset('shieldEffect', { anchorX: 0.5, anchorY: 0.5 }); effectGraphics.alpha = 0.7; effectGraphics.scaleX = 1.2; effectGraphics.scaleY = 1.2; self.animationDirection = 1; self.update = function () { // Continuous pulsing animation while shield is active effectGraphics.rotation += 0.05; effectGraphics.scaleX += 0.01 * self.animationDirection; effectGraphics.scaleY += 0.01 * self.animationDirection; if (effectGraphics.scaleX >= 1.4) { self.animationDirection = -1; } else if (effectGraphics.scaleX <= 1.0) { self.animationDirection = 1; } }; self.startEffect = function () { // Initial pulse effect tween(effectGraphics, { alpha: 0.7 }, { duration: 300, easing: tween.easeOut }); }; return self; }); var ShieldPowerup = Container.expand(function (lane) { var self = Container.call(this); var shieldGraphics = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5 }); self.lane = lane; self.speed = 6; self.update = function () { self.y += self.speed; shieldGraphics.rotation += 0.1; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var player; var staircases = []; var fallingNotes = []; var fallingBombs = []; var shieldPowerups = []; var hearts = []; var scoreTxt; var heartsTxt; var shieldUI = {}; var playerHealth = 3; var gameSpeed = 1; var spawnTimer = 0; var bombSpawnChance = 0.15; var shieldSpawnChance = 0.05; var shieldSpawned = false; var musicStarted = false; var lanePositions = []; var laneWidth = 2048 / 7; // Calculate lane positions for (var i = 0; i < 7; i++) { lanePositions[i] = i * laneWidth + laneWidth / 2; } // Create staircases for (var i = 0; i < 7; i++) { var staircase = game.addChild(LK.getAsset('staircase', { anchorX: 0.5, anchorY: 0.5 })); staircase.x = lanePositions[i]; staircase.y = 2732 - 100; staircase.width = laneWidth - 20; // Make each staircase fit its lane with small gap staircase.height = 2000; // Set appropriate height for individual staircases (1000% increase) staircases.push(staircase); } // Create tunnel at top var tunnel = game.addChild(LK.getAsset('tunnel', { anchorX: 0.5, anchorY: 1 })); tunnel.x = 2048 / 2; tunnel.y = 200; // Create player player = game.addChild(new Player()); player.x = lanePositions[player.currentLane]; player.y = 2732 - 100 - 740; // Position player lower on the staircase // Create UI scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); heartsTxt = new Text2('♥ ♥ ♥', { size: 80, fill: 0xFF0000 }); heartsTxt.anchor.set(1, 0); LK.gui.topRight.addChild(heartsTxt); // Create shield UI shieldUI.container = new Container(); shieldUI.container.visible = false; LK.gui.topRight.addChild(shieldUI.container); shieldUI.text = new Text2('SHIELD', { size: 80, fill: 0xFFD700 }); shieldUI.text.anchor.set(1, 0); shieldUI.text.x = 0; shieldUI.text.y = 100; shieldUI.container.addChild(shieldUI.text); // Shield timer bar background shieldUI.barBg = LK.getAsset('staircase', { anchorX: 1, anchorY: 0 }); shieldUI.barBg.x = 0; shieldUI.barBg.y = 180; shieldUI.barBg.width = 300; shieldUI.barBg.height = 30; shieldUI.barBg.tint = 0x333333; shieldUI.container.addChild(shieldUI.barBg); // Shield timer bar foreground shieldUI.barFg = LK.getAsset('staircase', { anchorX: 1, anchorY: 0 }); shieldUI.barFg.x = 0; shieldUI.barFg.y = 180; shieldUI.barFg.width = 300; shieldUI.barFg.height = 30; shieldUI.barFg.tint = 0xFF0000; shieldUI.container.addChild(shieldUI.barFg); function updateHeartsDisplay() { var heartsText = ''; for (var i = 0; i < playerHealth; i++) { heartsText += '♥ '; } heartsTxt.setText(heartsText); } function spawnFallingObject() { var lane = Math.floor(Math.random() * 7); var x = lanePositions[lane]; var spawnY = 150; // Spawn from bottom of tunnel if (Math.random() < shieldSpawnChance && !shieldSpawned) { // Spawn shield powerup var shield = new ShieldPowerup(lane); shield.x = x; shield.y = spawnY; shieldPowerups.push(shield); game.addChild(shield); shieldSpawned = true; } else if (Math.random() < bombSpawnChance) { // Spawn bomb var bomb = new FallingBomb(lane); bomb.x = x; bomb.y = spawnY; fallingBombs.push(bomb); game.addChild(bomb); } else { // Spawn note var noteType = Math.floor(Math.random() * 7) + 1; var note = new FallingNote(noteType, lane); note.x = x; note.y = spawnY; fallingNotes.push(note); game.addChild(note); } } function movePlayer(targetLane) { if (targetLane >= 0 && targetLane < 7) { player.currentLane = targetLane; tween(player, { x: lanePositions[targetLane] }, { duration: 200, easing: tween.easeOut }); } } game.down = function (x, y, obj) { var clickedLane = Math.floor(x / laneWidth); movePlayer(clickedLane); }; game.update = function () { // Spawn falling objects spawnTimer++; if (spawnTimer >= Math.max(30 - Math.floor(LK.ticks / 600), 15)) { spawnFallingObject(); spawnTimer = 0; } // Update and check falling notes for (var i = fallingNotes.length - 1; i >= 0; i--) { var note = fallingNotes[i]; if (note.lastY === undefined) note.lastY = note.y; // Check if note went off screen if (note.lastY < 2732 && note.y >= 2732) { note.destroy(); fallingNotes.splice(i, 1); continue; } // Check collision with player if (note.lane === player.currentLane && note.intersects(player)) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); LK.getSound('catch').play(); // Start music when first note is caught if (!musicStarted) { LK.playMusic('background_music'); musicStarted = true; } note.destroy(); fallingNotes.splice(i, 1); continue; } note.lastY = note.y; } // Update and check falling bombs for (var i = fallingBombs.length - 1; i >= 0; i--) { var bomb = fallingBombs[i]; if (bomb.lastY === undefined) bomb.lastY = bomb.y; // Check if bomb went off screen if (bomb.lastY < 2732 && bomb.y >= 2732) { bomb.destroy(); fallingBombs.splice(i, 1); continue; } // Check collision with player if (bomb.lane === player.currentLane && bomb.intersects(player)) { if (player.shieldActive) { // Bomb hits shield - create explosion effect LK.getSound('bomb_hit').play(); LK.effects.flashScreen(0xFFD700, 300); // Create explosion effect using tween var explosionScale = { scale: 1 }; tween(explosionScale, { scale: 3 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { // Explosion animation complete } }); // Tint bomb red and fade out for explosion effect tween(bomb, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, easing: tween.easeOut }); } else { // Bomb hits player without shield playerHealth--; updateHeartsDisplay(); LK.getSound('bomb_hit').play(); LK.effects.flashScreen(0xff0000, 500); } bomb.destroy(); fallingBombs.splice(i, 1); if (playerHealth <= 0) { // Make player bounce and fall when losing tween(player, { y: player.y - 200 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { // After jumping up, fall down tween(player, { y: player.y + 400 }, { duration: 600, easing: tween.bounceIn, onFinish: function onFinish() { LK.showGameOver(); } }); } }); } continue; } bomb.lastY = bomb.y; } // Update and check shield powerups for (var i = shieldPowerups.length - 1; i >= 0; i--) { var shield = shieldPowerups[i]; if (shield.lastY === undefined) shield.lastY = shield.y; // Check if shield went off screen if (shield.lastY < 2732 && shield.y >= 2732) { shield.destroy(); shieldPowerups.splice(i, 1); shieldSpawned = false; continue; } // Check collision with player if (shield.lane === player.currentLane && shield.intersects(player) && !player.shieldActive) { player.activateShield(); LK.getSound('shield_pickup').play(); shield.destroy(); shieldPowerups.splice(i, 1); shieldSpawned = false; continue; } shield.lastY = shield.y; } // Gradually increase game speed if (LK.ticks % 1800 === 0) { // Every 30 seconds gameSpeed += 0.1; for (var i = 0; i < fallingNotes.length; i++) { fallingNotes[i].speed = 8 * gameSpeed; } for (var i = 0; i < fallingBombs.length; i++) { fallingBombs[i].speed = 8 * gameSpeed; } for (var i = 0; i < shieldPowerups.length; i++) { shieldPowerups[i].speed = 6 * gameSpeed; } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var FallingBomb = Container.expand(function (lane) {
var self = Container.call(this);
var bombGraphics = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = lane;
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var FallingNote = Container.expand(function (noteType, lane) {
var self = Container.call(this);
var noteGraphics = self.attachAsset('note' + noteType, {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = lane;
self.speed = 8;
self.noteType = noteType;
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
});
self.currentLane = 3;
self.shieldActive = false;
self.shieldTimer = 0;
self.shieldEffect = null;
self.update = function () {
if (self.shieldActive) {
self.shieldTimer--;
// Update shield effect position to follow player
if (self.shieldEffect) {
self.shieldEffect.x = self.x;
self.shieldEffect.y = self.y;
}
if (self.shieldTimer <= 0) {
self.shieldActive = false;
playerGraphics.tint = 0xFFFFFF;
shieldUI.container.visible = false;
// Remove shield effect when shield ends
if (self.shieldEffect) {
self.shieldEffect.destroy();
self.shieldEffect = null;
}
} else {
// Update shield timer bar
var progress = self.shieldTimer / 300; // 300 is max shield time
shieldUI.barFg.width = 300 * progress;
}
} else {
shieldUI.container.visible = false;
}
};
self.activateShield = function () {
self.shieldActive = true;
self.shieldTimer = 300; // 5 seconds at 60fps
playerGraphics.tint = 0xFFD700;
shieldUI.container.visible = true;
shieldUI.barFg.width = 300;
// Remove any existing shield effect first
if (self.shieldEffect) {
self.shieldEffect.destroy();
self.shieldEffect = null;
}
// Create shield activation effect that persists only when shield is active
if (self.shieldActive) {
self.shieldEffect = new ShieldEffect();
self.shieldEffect.x = self.x;
self.shieldEffect.y = self.y;
game.addChild(self.shieldEffect);
self.shieldEffect.startEffect();
}
};
return self;
});
var ShieldEffect = Container.expand(function () {
var self = Container.call(this);
var effectGraphics = self.attachAsset('shieldEffect', {
anchorX: 0.5,
anchorY: 0.5
});
effectGraphics.alpha = 0.7;
effectGraphics.scaleX = 1.2;
effectGraphics.scaleY = 1.2;
self.animationDirection = 1;
self.update = function () {
// Continuous pulsing animation while shield is active
effectGraphics.rotation += 0.05;
effectGraphics.scaleX += 0.01 * self.animationDirection;
effectGraphics.scaleY += 0.01 * self.animationDirection;
if (effectGraphics.scaleX >= 1.4) {
self.animationDirection = -1;
} else if (effectGraphics.scaleX <= 1.0) {
self.animationDirection = 1;
}
};
self.startEffect = function () {
// Initial pulse effect
tween(effectGraphics, {
alpha: 0.7
}, {
duration: 300,
easing: tween.easeOut
});
};
return self;
});
var ShieldPowerup = Container.expand(function (lane) {
var self = Container.call(this);
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = lane;
self.speed = 6;
self.update = function () {
self.y += self.speed;
shieldGraphics.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
var player;
var staircases = [];
var fallingNotes = [];
var fallingBombs = [];
var shieldPowerups = [];
var hearts = [];
var scoreTxt;
var heartsTxt;
var shieldUI = {};
var playerHealth = 3;
var gameSpeed = 1;
var spawnTimer = 0;
var bombSpawnChance = 0.15;
var shieldSpawnChance = 0.05;
var shieldSpawned = false;
var musicStarted = false;
var lanePositions = [];
var laneWidth = 2048 / 7;
// Calculate lane positions
for (var i = 0; i < 7; i++) {
lanePositions[i] = i * laneWidth + laneWidth / 2;
}
// Create staircases
for (var i = 0; i < 7; i++) {
var staircase = game.addChild(LK.getAsset('staircase', {
anchorX: 0.5,
anchorY: 0.5
}));
staircase.x = lanePositions[i];
staircase.y = 2732 - 100;
staircase.width = laneWidth - 20; // Make each staircase fit its lane with small gap
staircase.height = 2000; // Set appropriate height for individual staircases (1000% increase)
staircases.push(staircase);
}
// Create tunnel at top
var tunnel = game.addChild(LK.getAsset('tunnel', {
anchorX: 0.5,
anchorY: 1
}));
tunnel.x = 2048 / 2;
tunnel.y = 200;
// Create player
player = game.addChild(new Player());
player.x = lanePositions[player.currentLane];
player.y = 2732 - 100 - 740; // Position player lower on the staircase
// Create UI
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
heartsTxt = new Text2('♥ ♥ ♥', {
size: 80,
fill: 0xFF0000
});
heartsTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(heartsTxt);
// Create shield UI
shieldUI.container = new Container();
shieldUI.container.visible = false;
LK.gui.topRight.addChild(shieldUI.container);
shieldUI.text = new Text2('SHIELD', {
size: 80,
fill: 0xFFD700
});
shieldUI.text.anchor.set(1, 0);
shieldUI.text.x = 0;
shieldUI.text.y = 100;
shieldUI.container.addChild(shieldUI.text);
// Shield timer bar background
shieldUI.barBg = LK.getAsset('staircase', {
anchorX: 1,
anchorY: 0
});
shieldUI.barBg.x = 0;
shieldUI.barBg.y = 180;
shieldUI.barBg.width = 300;
shieldUI.barBg.height = 30;
shieldUI.barBg.tint = 0x333333;
shieldUI.container.addChild(shieldUI.barBg);
// Shield timer bar foreground
shieldUI.barFg = LK.getAsset('staircase', {
anchorX: 1,
anchorY: 0
});
shieldUI.barFg.x = 0;
shieldUI.barFg.y = 180;
shieldUI.barFg.width = 300;
shieldUI.barFg.height = 30;
shieldUI.barFg.tint = 0xFF0000;
shieldUI.container.addChild(shieldUI.barFg);
function updateHeartsDisplay() {
var heartsText = '';
for (var i = 0; i < playerHealth; i++) {
heartsText += '♥ ';
}
heartsTxt.setText(heartsText);
}
function spawnFallingObject() {
var lane = Math.floor(Math.random() * 7);
var x = lanePositions[lane];
var spawnY = 150; // Spawn from bottom of tunnel
if (Math.random() < shieldSpawnChance && !shieldSpawned) {
// Spawn shield powerup
var shield = new ShieldPowerup(lane);
shield.x = x;
shield.y = spawnY;
shieldPowerups.push(shield);
game.addChild(shield);
shieldSpawned = true;
} else if (Math.random() < bombSpawnChance) {
// Spawn bomb
var bomb = new FallingBomb(lane);
bomb.x = x;
bomb.y = spawnY;
fallingBombs.push(bomb);
game.addChild(bomb);
} else {
// Spawn note
var noteType = Math.floor(Math.random() * 7) + 1;
var note = new FallingNote(noteType, lane);
note.x = x;
note.y = spawnY;
fallingNotes.push(note);
game.addChild(note);
}
}
function movePlayer(targetLane) {
if (targetLane >= 0 && targetLane < 7) {
player.currentLane = targetLane;
tween(player, {
x: lanePositions[targetLane]
}, {
duration: 200,
easing: tween.easeOut
});
}
}
game.down = function (x, y, obj) {
var clickedLane = Math.floor(x / laneWidth);
movePlayer(clickedLane);
};
game.update = function () {
// Spawn falling objects
spawnTimer++;
if (spawnTimer >= Math.max(30 - Math.floor(LK.ticks / 600), 15)) {
spawnFallingObject();
spawnTimer = 0;
}
// Update and check falling notes
for (var i = fallingNotes.length - 1; i >= 0; i--) {
var note = fallingNotes[i];
if (note.lastY === undefined) note.lastY = note.y;
// Check if note went off screen
if (note.lastY < 2732 && note.y >= 2732) {
note.destroy();
fallingNotes.splice(i, 1);
continue;
}
// Check collision with player
if (note.lane === player.currentLane && note.intersects(player)) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('catch').play();
// Start music when first note is caught
if (!musicStarted) {
LK.playMusic('background_music');
musicStarted = true;
}
note.destroy();
fallingNotes.splice(i, 1);
continue;
}
note.lastY = note.y;
}
// Update and check falling bombs
for (var i = fallingBombs.length - 1; i >= 0; i--) {
var bomb = fallingBombs[i];
if (bomb.lastY === undefined) bomb.lastY = bomb.y;
// Check if bomb went off screen
if (bomb.lastY < 2732 && bomb.y >= 2732) {
bomb.destroy();
fallingBombs.splice(i, 1);
continue;
}
// Check collision with player
if (bomb.lane === player.currentLane && bomb.intersects(player)) {
if (player.shieldActive) {
// Bomb hits shield - create explosion effect
LK.getSound('bomb_hit').play();
LK.effects.flashScreen(0xFFD700, 300);
// Create explosion effect using tween
var explosionScale = {
scale: 1
};
tween(explosionScale, {
scale: 3
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
// Explosion animation complete
}
});
// Tint bomb red and fade out for explosion effect
tween(bomb, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
easing: tween.easeOut
});
} else {
// Bomb hits player without shield
playerHealth--;
updateHeartsDisplay();
LK.getSound('bomb_hit').play();
LK.effects.flashScreen(0xff0000, 500);
}
bomb.destroy();
fallingBombs.splice(i, 1);
if (playerHealth <= 0) {
// Make player bounce and fall when losing
tween(player, {
y: player.y - 200
}, {
duration: 400,
easing: tween.easeOut,
onFinish: function onFinish() {
// After jumping up, fall down
tween(player, {
y: player.y + 400
}, {
duration: 600,
easing: tween.bounceIn,
onFinish: function onFinish() {
LK.showGameOver();
}
});
}
});
}
continue;
}
bomb.lastY = bomb.y;
}
// Update and check shield powerups
for (var i = shieldPowerups.length - 1; i >= 0; i--) {
var shield = shieldPowerups[i];
if (shield.lastY === undefined) shield.lastY = shield.y;
// Check if shield went off screen
if (shield.lastY < 2732 && shield.y >= 2732) {
shield.destroy();
shieldPowerups.splice(i, 1);
shieldSpawned = false;
continue;
}
// Check collision with player
if (shield.lane === player.currentLane && shield.intersects(player) && !player.shieldActive) {
player.activateShield();
LK.getSound('shield_pickup').play();
shield.destroy();
shieldPowerups.splice(i, 1);
shieldSpawned = false;
continue;
}
shield.lastY = shield.y;
}
// Gradually increase game speed
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
gameSpeed += 0.1;
for (var i = 0; i < fallingNotes.length; i++) {
fallingNotes[i].speed = 8 * gameSpeed;
}
for (var i = 0; i < fallingBombs.length; i++) {
fallingBombs[i].speed = 8 * gameSpeed;
}
for (var i = 0; i < shieldPowerups.length; i++) {
shieldPowerups[i].speed = 6 * gameSpeed;
}
}
};
2D metal golgesiz merdiven. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
2D golgesiz guclu bomba resimi. In-Game asset. 2d. High contrast. No shadows
2D golgesiz mavi renkte panelli fantastik holografik bir kalkan. In-Game asset. 2d. High contrast. No shadows
2D sari seffaf golgesiz panelli fantastik bir kure. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik notasi. In-Game asset. 2d. High contrast. No shadows
2D muzik yalniz notasi. In-Game asset. 2d. High contrast. No shadows
2d. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
2D bir yere tirmanamak isteyen elleri ve kollari acik pixelart bir insan. In-Game asset. 2d. High contrast. No shadows