User prompt
Oyunun adını A Very Simple Tank Battle olarak değiştir oyunun yazısını ekranın üst orta kısmına yerleştir
User prompt
Oyunun yazısının arkaplanının bir assetini oluştur
User prompt
oyunun ismini Simple Tank War olarak değiştir oyunun yazısının arkasına bir arkaplan oluştur ve yazıyı ekranın orta üst kısmına yerleştir.
User prompt
Oyunun adını Epic Tank War Olarak değiştir
User prompt
Play yazısının yazı fontunu "KALIN" bunun gibi yap
User prompt
Play yazısının yazı fontunu "KALIN" bunun gibi yap
User prompt
Play yazısının yazı tipini "KALIN" bu şekilde yap
User prompt
Start Game butonunun içindeki yazıyı Play olarak değiştir
User prompt
Giriş ekranında Oyunun İsmi "Araba Savaşı" ve Start Game butonu dışında diğer şeyler oyun başladıktan sonra gözüksün
User prompt
Bir giriş ekranı olsun oyun hemen başlamasın. Start Game butonu olsun. Butona tıkladıktan sonra oyun başlasın.
User prompt
Please fix the bug: 'PlayerCar is not defined' in or related to this line: 'return self;' Line Number: 83
User prompt
Please fix the bug: 'PlayerCar is not defined' in or related to this line: 'var player = new PlayerCar();' Line Number: 110
User prompt
Please fix the bug: 'StartButton is not defined' in or related to this line: 'var txt = new Text2("Start Game", {' Line Number: 39
User prompt
Please fix the bug: 'StartButton is not defined' in or related to this line: 'var startButton = new StartButton({' Line Number: 47
User prompt
Bir giriş ekranı olsun oyun hemen başlamasın "Start Game" butonu olsun butona tıkladığında oyun başlasın.Start Game butonuna bastıktan sonra arabalar gelmeye başlasın. Giriş ekranında sadece "Start Game" butonu olsun. Bu butonun bir assetini oluştur ve boyutunu ve rengini değiştirebiliyim
User prompt
Bir giriş ekranı olsun oyun hemen başlamasın "Start Game" butonu olsun butona tıkladığında oyun başlasın.
User prompt
Bir giriş ekranı olsun oyun hemen başlamasın "Start Game" butonu olsun butona tıkladığında oyun başlasın.
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'if (typeof enemies !== "undefined" && enemies && enemies.length) {' Line Number: 341
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var i = 0; i < enemies.length; i++) {' Line Number: 341
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'visible')' in or related to this line: 'scoreTxt.visible = visible;' Line Number: 322
User prompt
Start Game yazısının bir assetini oluştur
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var i = 0; i < bullets.length; i++) {' Line Number: 348
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'if (typeof enemies !== "undefined" && enemies && typeof enemies.length !== "undefined") {' Line Number: 341
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var i = 0; i < enemies.length; i++) {' Line Number: 341
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'visible')' in or related to this line: 'if (typeof scoreTxt !== "undefined" && scoreTxt) {' Line Number: 322
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// PlayerCar class for the player-controlled car
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
// Attach player car asset, centered
var car = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
// Direction vector (normalized)
self.dirX = 0;
self.dirY = -1;
// Movement speed
self.speed = 18;
// Shooting cooldown (frames)
self.shootCooldown = 0;
// For shoot boost
self._shootBoostActive = false;
self._shootBoostTicks = 0;
// Set direction to move toward (targetX, targetY)
self.setDirection = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0.01) {
self.dirX = dx / len;
self.dirY = dy / len;
}
};
// Set boost (not used in MVP, but placeholder)
self.setBoost = function (active) {
// No-op for now
};
// Update method called every frame
self.update = function () {
// Move if playerIsMoving is true (global)
if (typeof playerIsMoving !== "undefined" && playerIsMoving) {
var moveSpeed = self.speed;
self.x += self.dirX * moveSpeed;
self.y += self.dirY * moveSpeed;
// Clamp to game area
if (self.x < 100) self.x = 100;
if (self.x > 2048 - 100) self.x = 2048 - 100;
if (self.y < 100) self.y = 100;
if (self.y > 2732 - 100) self.y = 2732 - 100;
}
// Handle shoot cooldown
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
};
// Initial position (centered)
self.x = 2048 / 2;
self.y = 2732 - 400;
return self;
});
// StartButton class for customizable start game button
var StartButton = Container.expand(function (opts) {
var self = Container.call(this);
// Default options
opts = opts || {};
var width = typeof opts.width === "number" ? opts.width : 600;
var height = typeof opts.height === "number" ? opts.height : 200;
var color = typeof opts.color === "number" ? opts.color : 0x2980ff;
// Create button background asset
var bg = self.attachAsset('startButton', {
width: width,
height: height,
color: color,
anchorX: 0.5,
anchorY: 0.5
});
// Create button text
var txt = new Text2("Start Game", {
size: Math.floor(height * 0.45),
fill: 0xFFFFFF
});
txt.anchor.set(0.5, 0.5);
txt.x = 0;
txt.y = 0;
self.addChild(txt);
// Enable touch/click
self.interactive = true;
self.buttonMode = true;
// Down event triggers onStart if defined
self.down = function (x, y, obj) {
if (typeof self.onStart === "function") {
self.onStart();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Customizable Start Game button asset
// New background asset
// Add background image to the game
// Asset for the box dropped by BossCar on death
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
// --- Start Screen State ---
var gameStarted = false;
// Hide gameplay UI until game starts
var scoreTxt, levelTxt, timerTxt;
var guiRowY = 10;
var guiSpacing = 80; // horizontal space between counters
// Create StartButton and center it
var startButton = new StartButton({
width: 600,
height: 200,
color: 0x2980ff
});
startButton.x = 2048 / 2;
startButton.y = 2732 / 2;
game.addChild(startButton);
// When StartButton is pressed, start the game
startButton.onStart = function () {
// Remove start button
startButton.destroy();
gameStarted = true;
// Show gameplay UI
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(levelTxt);
LK.gui.top.addChild(timerTxt);
// Enable controller and player
game.addChild(player);
game.addChild(controllerBg);
game.addChild(controllerKnob);
};
// --- Gameplay UI (created here, added to GUI only after game starts) ---
var player = new PlayerCar();
var enemies = [];
var bullets = [];
// Boss state
var bossSpawned = false;
var bossCar = null;
// Score
var score = 0;
var level = 1;
scoreTxt = new Text2('Score: 0', {
size: 97.2,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0); // right align score
// Level text (centered between score and timer)
levelTxt = new Text2('Level 1', {
size: 100,
fill: 0xFFD700 // gold color for level
});
levelTxt.anchor.set(0.5, 0); // center align
// Timer text (elapsed time in seconds, right of score)
timerTxt = new Text2('0:00', {
size: 99,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0, 0); // left align timer
// Arrange score, level, and timer in a single horizontal row, evenly spaced
var totalWidth = scoreTxt.width + levelTxt.width + timerTxt.width + 2 * guiSpacing;
var startX = LK.gui.top.width / 2 - totalWidth / 2;
// Score counter (left)
scoreTxt.x = startX + scoreTxt.width;
scoreTxt.y = guiRowY;
// Level counter (center)
levelTxt.x = scoreTxt.x + guiSpacing + levelTxt.width / 2;
levelTxt.y = guiRowY;
// Timer counter (right)
timerTxt.x = levelTxt.x + levelTxt.width / 2 + guiSpacing;
timerTxt.y = guiRowY;
// For pointer tracking (controller-based)
var pointerX = 2048 / 2;
var pointerY = 2732 / 2;
var playerIsMoving = false; // Start as not moving
// For boost
var boosting = false;
// --- Controller UI ---
// Controller is a circular area at the bottom center of the screen
var controllerRadius = 170;
var controllerCenterX = 2048 / 2;
var controllerCenterY = 2732 - controllerRadius - 60;
// Controller visual (semi-transparent circle)
var controllerBg = LK.getAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
width: controllerRadius * 2,
height: controllerRadius * 2,
color: 0x888888,
alpha: 0.25,
x: controllerCenterX,
y: controllerCenterY
});
// Controller knob (shows current direction)
var knobRadius = 80;
var controllerKnob = LK.getAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
width: knobRadius * 2,
height: knobRadius * 2,
color: 0x2980ff,
alpha: 0.7,
x: controllerCenterX,
y: controllerCenterY
});
// Controller and player are only added to game after start
// Track controller state
var controllerActive = false;
var controllerTouchId = null;
// Persistent controller direction for continuous movement
var lastControllerActive = false;
var lastControllerDirX = 0;
var lastControllerDirY = 0;
// Helper: get distance between two points
function dist2(x1, y1, x2, y2) {
var dx = x1 - x2;
var dy = y1 - y2;
return Math.sqrt(dx * dx + dy * dy);
}
// For enemy spawn timer
var enemySpawnTicks = 0;
// Dynamic spawn interval variables
var ENEMY_SPAWN_INTERVAL_START = 180; // 3 seconds at 60fps
var ENEMY_SPAWN_INTERVAL_END = 60; // 1 second at 60fps
var ENEMY_SPAWN_INTERVAL = ENEMY_SPAWN_INTERVAL_START;
// Timer for game progression (in ticks)
var gameTimerTicks = 0;
var GAME_TIMER_MAX = 60 * 60; // 60 seconds to reach max difficulty
// --- Event Handlers ---
// Move: handle controller input only if inside controller area
function handleMove(x, y, obj) {
// Prevent controller input before game starts
if (!gameStarted) return;
// Only respond to touches inside controller area or if already dragging controller
var isTouch = obj && obj.event && typeof obj.event.identifier !== "undefined";
var touchId = isTouch ? obj.event.identifier : null;
// If not already active, only activate if touch is inside controller
if (!controllerActive) {
var d = dist2(x, y, controllerCenterX, controllerCenterY);
if (d <= controllerRadius) {
controllerActive = true;
controllerTouchId = touchId;
} else {
// Ignore touches outside controller
return;
}
} else {
// If already active, only respond to the same touch
if (isTouch && controllerTouchId !== null && touchId !== controllerTouchId) {
return;
}
}
// Calculate direction from controller center to touch
var dx = x - controllerCenterX;
var dy = y - controllerCenterY;
var len = Math.sqrt(dx * dx + dy * dy);
// Clamp knob to controller radius
var knobX = controllerCenterX;
var knobY = controllerCenterY;
if (len > controllerRadius) {
dx = dx * controllerRadius / len;
dy = dy * controllerRadius / len;
knobX += dx;
knobY += dy;
} else {
knobX = x;
knobY = y;
}
controllerKnob.x = knobX;
controllerKnob.y = knobY;
// If movement is significant, set direction and move
if (len > 30) {
// Move player in the direction of the knob relative to controller center
player.setDirection(player.x + dx, player.y + dy);
playerIsMoving = true;
// Store last direction for persistent movement
lastControllerDirX = dx / len;
lastControllerDirY = dy / len;
lastControllerActive = true;
} else {
playerIsMoving = false;
lastControllerActive = false;
}
if (typeof LK !== "undefined" && typeof LK.ticks !== "undefined") {
lastMoveTick = LK.ticks;
}
}
game.move = handleMove;
// Down: only activate boost if controller is pressed
game.down = function (x, y, obj) {
// Prevent controller input before game starts
if (!gameStarted) return;
var d = dist2(x, y, controllerCenterX, controllerCenterY);
// Do not activate boost on controller press anymore
if (d <= controllerRadius) {
handleMove(x, y, obj);
}
};
// Up: stop boost and controller movement
game.up = function (x, y, obj) {
// Prevent controller input before game starts
if (!gameStarted) return;
boosting = false;
player.setBoost(false);
playerIsMoving = false;
controllerActive = false;
controllerTouchId = null;
// Reset persistent controller direction
lastControllerActive = false;
lastControllerDirX = 0;
lastControllerDirY = 0;
// Reset knob to center
controllerKnob.x = controllerCenterX;
controllerKnob.y = controllerCenterY;
};
// --- Main Game Loop ---
game.update = function () {
// Only run game logic if gameStarted is true
if (!gameStarted) {
return;
}
// Update player
// If controller was last dragged in a direction, keep moving in that direction
if (typeof lastControllerActive !== "undefined" && lastControllerActive && typeof lastControllerDirX !== "undefined" && typeof lastControllerDirY !== "undefined") {
// Set direction to last drag direction
player.dirX = lastControllerDirX;
player.dirY = lastControllerDirY;
playerIsMoving = true;
}
// Handle shoot speed boost timer
if (player._shootBoostActive) {
if (typeof player._shootBoostTicks === "undefined") player._shootBoostTicks = 0;
player._shootBoostTicks--;
if (player._shootBoostTicks <= 0) {
player._shootBoostActive = false;
}
}
player.update();
// If no move event occurred this frame, stop player movement
if (typeof LK !== "undefined" && typeof LK.ticks !== "undefined") {
if (typeof lastMoveTick === "undefined") {
lastMoveTick = LK.ticks;
}
if (lastMoveTick !== LK.ticks) {
// Only stop if controller is not active
if (!lastControllerActive) {
playerIsMoving = false;
}
}
}
// --- Timer and Dynamic Enemy Spawning ---
gameTimerTicks++;
// Update timer text (show mm:ss)
var elapsedSec = Math.floor(gameTimerTicks / 60);
var min = Math.floor(elapsedSec / 60);
var sec = elapsedSec % 60;
timerTxt.setText(min + ':' + (sec < 10 ? '0' : '') + sec);
// Every second, increase spawn rate by reducing ENEMY_SPAWN_INTERVAL_START, but clamp to ENEMY_SPAWN_INTERVAL_END
if (gameTimerTicks % 60 === 0) {
ENEMY_SPAWN_INTERVAL_START = Math.max(ENEMY_SPAWN_INTERVAL_END, ENEMY_SPAWN_INTERVAL_START - 5);
}
// Calculate progression (0 to 1)
var progress = Math.min(gameTimerTicks / GAME_TIMER_MAX, 1);
// Linearly interpolate spawn interval from start to end
ENEMY_SPAWN_INTERVAL = Math.round(ENEMY_SPAWN_INTERVAL_START + (ENEMY_SPAWN_INTERVAL_END - ENEMY_SPAWN_INTERVAL_START) * progress);
enemySpawnTicks++;
// Determine how many enemies to spawn this cycle (1 + extra for every 10 kills)
var spawnCount = 1 + Math.floor(score / 10);
// Boss spawn logic
if (!bossSpawned && score >= 10) {
bossSpawned = true;
bossCar = new BossCar();
// Spawn boss at random edge
var edge = Math.floor(Math.random() * 4);
var bx, by;
if (edge === 0) {
bx = 200 + Math.random() * (2048 - 400);
by = -300;
} else if (edge === 1) {
bx = 2048 + 300;
by = 200 + Math.random() * (2732 - 400);
} else if (edge === 2) {
bx = 200 + Math.random() * (2048 - 400);
by = 2732 + 300;
} else {
bx = -300;
by = 200 + Math.random() * (2732 - 400);
}
bossCar.x = bx;
bossCar.y = by;
bossCar.setTarget(player.x, player.y);
game.addChild(bossCar);
}
// Only spawn normal enemies if boss is not spawned
if (!bossSpawned && enemySpawnTicks >= ENEMY_SPAWN_INTERVAL) {
enemySpawnTicks = 0;
for (var spawnIdx = 0; spawnIdx < spawnCount; spawnIdx++) {
// Spawn enemy at random edge
var edge = Math.floor(Math.random() * 4); // 0:top, 1:right, 2:bottom, 3:left
var ex, ey;
if (edge === 0) {
// top
ex = 200 + Math.random() * (2048 - 400);
ey = -160;
} else if (edge === 1) {
// right
ex = 2048 + 160;
ey = 200 + Math.random() * (2732 - 400);
} else if (edge === 2) {
// bottom
ex = 200 + Math.random() * (2048 - 400);
ey = 2732 + 160;
} else {
// left
ex = -160;
ey = 200 + Math.random() * (2732 - 400);
}
var enemy = new EnemyCar();
enemy.x = ex;
enemy.y = ey;
enemy.setTarget(player.x, player.y);
enemies.push(enemy);
game.addChild(enemy);
}
}
// --- Update Enemies ---
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.setTarget(player.x, player.y);
enemy.update();
// Check collision with player (circle collision)
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 160) {
// Game over
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// --- Update BossCar ---
if (bossSpawned && bossCar) {
bossCar.setTarget(player.x, player.y);
bossCar.update();
// Check collision with player (circle collision, bigger radius)
var bdx = bossCar.x - player.x;
var bdy = bossCar.y - player.y;
var bdist = Math.sqrt(bdx * bdx + bdy * bdy);
if (bdist < 220) {
// Game over
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// BossCar damages enemies it collides with (just like player does)
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var edx = bossCar.x - enemy.x;
var edy = bossCar.y - enemy.y;
var edist = Math.sqrt(edx * edx + edy * edy);
if (edist < 160) {
// Remove enemy
enemy.destroy();
enemies.splice(i, 1);
// Optionally, you could increment score or add effect, but for now just remove
}
}
// If boss defeated, show win
if (bossCar.health <= 0) {
// Spawn power-up box at boss position, using bossDropBox asset
var powerUpBox = new PowerUpBox(true);
powerUpBox.x = bossCar.x;
powerUpBox.y = bossCar.y;
game.addChild(powerUpBox);
// Store reference for collision check
game._powerUpBox = powerUpBox;
bossCar.destroy();
bossCar = null;
level = 2;
if (typeof levelTxt !== "undefined") {
levelTxt.setText("Level " + level);
}
LK.effects.flashScreen(0x00ff00, 1000);
// Do NOT show win yet; wait for player to collect power-up
// LK.showYouWin();
// return;
}
}
// --- PowerUpBox pickup check ---
if (game._powerUpBox) {
var dx = player.x - game._powerUpBox.x;
var dy = player.y - game._powerUpBox.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
// Picked up!
game._powerUpBox.destroy();
game._powerUpBox = null;
// Apply shoot speed boost (reduce cooldown)
player._shootBoostActive = true;
player._shootBoostTicks = 60 * 8; // 8 seconds
player.shootCooldown = 0; // allow instant shot
// Visual feedback (flash)
LK.effects.flashObject(player, 0x4ddcfe, 800);
// Show win after pickup
LK.effects.flashScreen(0x00ff00, 1000);
LK.showYouWin();
return;
}
}
// --- Auto-shoot at nearest enemy or bossCar ---
// If there are enemies, shoot at nearest enemy. If not, and bossCar is present, shoot at bossCar.
if (player.shootCooldown === 0) {
var target = null;
if (enemies.length > 0) {
// Find nearest enemy
var minDist = 999999;
for (var i = 0; i < enemies.length; i++) {
var dx = enemies[i].x - player.x;
var dy = enemies[i].y - player.y;
var d = dx * dx + dy * dy;
if (d < minDist) {
minDist = d;
target = enemies[i];
}
}
} else if (bossSpawned && bossCar) {
// Only target bossCar if within enemy range (same as enemy targeting)
var dx = bossCar.x - player.x;
var dy = bossCar.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 900) {
// 900 is 30*30, but enemy targeting uses squared distance, so use same
target = bossCar;
}
}
if (target) {
// Shoot bullet toward target from top of car
var bullet = new Bullet();
// Place bullet at top of car (offset in direction of car)
var carDir = Math.atan2(player.dirY, player.dirX);
var offsetX = Math.cos(carDir) * 180;
var offsetY = Math.sin(carDir) * 180;
bullet.x = player.x + offsetX;
bullet.y = player.y + offsetY;
// Direction: from bullet to target
var bdx = target.x - bullet.x;
var bdy = target.y - bullet.y;
bullet.setDirection(bdx, bdy);
bullets.push(bullet);
game.addChild(bullet);
player.shootCooldown = player._shootBoostActive ? 12 : 30; // Faster fire if boost active
}
}
// --- Update Bullets ---
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Remove if out of bounds
if (bullet.x < -100 || bullet.x > 2048 + 100 || bullet.y < -100 || bullet.y > 2732 + 100) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check collision with enemies
var hit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
var dx = bullet.x - enemy.x;
var dy = bullet.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 100) {
// Hit!
hit = true;
// Remove enemy
enemy.destroy();
enemies.splice(j, 1);
// Remove bullet
bullet.destroy();
bullets.splice(i, 1);
// Score
score++;
scoreTxt.setText('Score: ' + score);
break;
}
}
// Check collision with bossCar if spawned, but only if in range (same as enemy range)
if (!hit && bossSpawned && bossCar && function () {
var dx = bullet.x - bossCar.x;
var dy = bullet.y - bossCar.y;
var dist = Math.sqrt(dx * dx + dy * dy);
return dist < 100; // Use same range as enemy hit
}()) {
// Hit boss!
hit = true;
bossCar.takeDamage(1);
bullet.destroy();
bullets.splice(i, 1);
// Optionally, flash boss or show health bar (not required for MVP)
}
if (hit) continue;
}
// --- Camera: keep player centered ---
// (In LK, the game area is fixed, so we simulate by keeping player in center and moving everything else if needed)
// For MVP, player always stays in center, so no need to move camera.
};
// --- Initial pointer direction ---
// No initial movement; player will move when controller is used
player.setDirection(player.x, player.y - 1); ===================================================================
--- original.js
+++ change.js
Kalitesini arttır
kalitesini arttır
kalitesini arttır yuvarlak olsun
remove the holes and get a flat land
mavi ve kırmızı renklerinde siyah çizgileri olan bir airdrop kutusu yap, kuş bakışı olsun üstten gözüksün. In-Game asset. 2d. High contrast. No shadows. bird eye
Bir tank savaşı temalı arkaplan görseli hazırla görselde 2 tank olsun ve bu 2 tankın önündeki 1 tankı yakalamaya çalışsın.. In-Game asset. 2d. High contrast. No shadows
daha kaliteli yap
War dropbox a bird view blue and red. In-Game asset. 2d. High contrast. No shadows. In-Game asset. 2d. High contrast. No shadows
real explosion. In-Game asset. 2d. High contrast. No shadows
Arka Planını temizle
clear background
Erase background