User prompt
Meyveler ekranın altından gelsin
User prompt
Meyveler hepsi aynı yükseklikte farklı yerlere fırlasınlar.
User prompt
Combo yazmıyor
User prompt
Oyun ilerledikçe hızlansın. Oyuna combo ekle
User prompt
Meyvelerin kesilme animasyodunda ikiye ayrılsınlar ama üst parçasıyla alt parçası farklı olsun.
User prompt
Meyvelerin kesilme animasyonunu değiştir. Meyveleri ikiye böl animasyon öyle olsun.
User prompt
Meyveyi kesemeden aşşağı düşünce lose soundu çalsın
User prompt
Satma işlemini bir kez yapalım.
User prompt
Meyveleri sattıktan sonra oyun eski haline dönmüyor ve meyveleri kesemiyorum.
User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'parent')' in or related to this line: 'if (draggingFruit.parent) {' Line Number: 929
User prompt
Meyveleri soyduktan sonra yeni bir ekran ve yeni bir arkaplan gelsin burda müşteriler gelsin ve yaptığım meyveleri para karşılığında alsınlar.
User prompt
Meyveleri hayla soyamıyorum.
User prompt
Meyveleri soyduktan sonra meyveleri kesemiyorum.
User prompt
Meyveleri soyma işlemini bir kez yapalım
User prompt
Meyveleri soyma ekranı varken oyun dursun.
User prompt
Meyveleri yıkadıktan sonra onları soyma işlemine getirelim.
User prompt
Meyveleri bir muslukta yıkayalım ama ekran farklı olsun arkaplanda tahta olmasın.
User prompt
Oyun 30 puana gelince farklı bir ekran açılsın burda kestiğimiz meyveleri yıkayalım.
User prompt
Reset game state and UI on new game
User prompt
Bombaya değersek bomb soundu başlasın.
User prompt
Meyveleri kesince sound sesi gelsin.
User prompt
Please fix the bug: 'Uncaught ReferenceError: juiceColor is not defined' in or related to this line: 'var stain = LK.getAsset('juice_stain_' + type.id, {' Line Number: 235
User prompt
Parçacıklar daha fazla ve meyvenin rengine göre renkleri daha belli olsun.
User prompt
Create stains on the background when a fruit is sliced
User prompt
Arkaplan gözükmüyor
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Bomb class
var Bomb = Container.expand(function () {
var self = Container.call(this);
// Bomb asset: black circle with red border
var assetId = 'bomb';
var bombGfx = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Add a red border by overlaying a slightly larger ellipse
var borderId = 'bomb_border';
var borderGfx = self.attachAsset(borderId, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
// Physics
self.vx = 0;
self.vy = 0;
self.gravity = 0.35 + Math.random() * 0.1;
self.sliced = false;
self.slice = function () {
if (self.sliced) return;
self.sliced = true;
// Animate: flash and fade out
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 250,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
self.update = function () {
if (self.sliced) return;
self.x += self.vx;
self.y += self.vy;
self.vy += self.gravity;
// Prevent from leaving left/right screen edges
if (self.x < 0 + self.width * 0.5) {
self.x = self.width * 0.5;
self.vx = -self.vx * 0.55;
}
if (self.x > 2048 - self.width * 0.5) {
self.x = 2048 - self.width * 0.5;
self.vx = -self.vx * 0.55;
}
};
return self;
});
// Fruit class
var Fruit = Container.expand(function () {
var self = Container.call(this);
// Fruit types: apple, banana, orange, watermelon, etc.
// Each type has a color and shape
// We'll use 'ellipse' for round fruits, 'box' for banana
// We'll randomize type on creation
var types = [{
id: 'apple',
color: 0xff2d2d,
shape: 'ellipse',
width: 320,
height: 320,
points: 1
}, {
id: 'orange',
color: 0xffa500,
shape: 'ellipse',
width: 300,
height: 300,
points: 1
}, {
id: 'banana',
color: 0xfff700,
shape: 'box',
width: 420,
height: 160,
points: 2
}, {
id: 'watermelon',
color: 0x2ecc40,
shape: 'ellipse',
width: 420,
height: 420,
points: 3
}, {
id: 'kiwi',
color: 0x8ee53f,
shape: 'ellipse',
width: 270,
height: 270,
points: 2
}];
var type = types[Math.floor(Math.random() * types.length)];
// Asset id is unique per type
var assetId = 'fruit_' + type.id;
// Initialize asset if not already
var fruitGfx = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Physics
self.vx = 0;
self.vy = 0;
self.gravity = 0.35 + Math.random() * 0.1;
self.sliced = false;
self.points = type.points;
// For arc motion, we set vx, vy on spawn
// Slicing animation
self.slice = function () {
if (self.sliced) return;
self.sliced = true;
// Play slicing sound
LK.getSound('Ninjasword').play();
// Animate: split into two halves and juice splash
var half1 = LK.getAsset(assetId, {
anchorX: 0.5,
anchorY: 1.0,
x: self.x,
y: self.y,
rotation: self.rotation
});
var half2 = LK.getAsset(assetId, {
anchorX: 0.5,
anchorY: 0.0,
x: self.x,
y: self.y,
rotation: self.rotation
});
game.addChild(half1);
game.addChild(half2);
// Animate halves flying apart and fading out
tween(half1, {
x: self.x - 80,
y: self.y - 60,
rotation: self.rotation - 0.5,
alpha: 0
}, {
duration: 350,
easing: tween.easeOut,
onFinish: function onFinish() {
half1.destroy();
}
});
tween(half2, {
x: self.x + 80,
y: self.y + 60,
rotation: self.rotation + 0.5,
alpha: 0
}, {
duration: 350,
easing: tween.easeOut,
onFinish: function onFinish() {
half2.destroy();
}
});
// Juice splash effect (ellipse, color based on fruit)
// More vivid color for splash (slightly saturated)
var vividJuiceColor = function (c) {
// Slightly brighten and saturate the color
var r = Math.min(255, (c >> 16 & 0xff) * 1.15 + 32) | 0;
var g = Math.min(255, (c >> 8 & 0xff) * 1.15 + 32) | 0;
var b = Math.min(255, (c & 0xff) * 1.15 + 32) | 0;
return r << 16 | g << 8 | b;
}(type.color || 0xff2d2d);
// Create multiple juice particles for a juicier effect
var juiceParticles = [];
var juiceParticleCount = 12 + Math.floor(Math.random() * 7); // 12-18 particles
for (var jp = 0; jp < juiceParticleCount; jp++) {
var angle = Math.random() * Math.PI * 2;
var dist = 40 + Math.random() * 60;
var scale = 0.22 + Math.random() * 0.22;
var alpha = 0.55 + Math.random() * 0.25;
var splash = LK.getAsset('juice_splash_' + type.id, {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
scaleX: scale * (0.8 + Math.random() * 0.7),
scaleY: scale * (0.5 + Math.random() * 1.1),
alpha: alpha,
tint: vividJuiceColor
});
game.addChild(splash);
juiceParticles.push(splash);
// Animate each particle outward and fade
tween(splash, {
x: self.x + Math.cos(angle) * dist,
y: self.y + Math.sin(angle) * dist,
scaleX: scale * (1.2 + Math.random() * 1.2),
scaleY: scale * (1.1 + Math.random() * 1.2),
alpha: 0
}, {
duration: 320 + Math.random() * 120,
easing: tween.easeOut,
onFinish: function (s) {
return function () {
s.destroy();
};
}(splash)
});
}
// --- Add stain to background ---
if (typeof background !== "undefined" && background && background.parent) {
// Create a stain asset (ellipse, color based on fruit, random rotation/scale)
var stain = LK.getAsset('juice_stain_' + type.id, {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
scaleX: 0.7 + Math.random() * 0.7,
scaleY: 0.5 + Math.random() * 0.7,
alpha: 0.32 + Math.random() * 0.18,
rotation: Math.random() * Math.PI * 2,
tint: vividJuiceColor
});
// Insert stain just above the background (so it stays under fruit halves/splashes)
var bgParent = background.parent;
var bgIndex = bgParent.getChildIndex(background);
bgParent.addChildAt(stain, bgIndex + 1);
}
// --- End stain ---
// Hide original fruit immediately
self.alpha = 0;
tween(self, {
alpha: 0
}, {
duration: 1,
onFinish: function onFinish() {
self.destroy();
}
});
};
// Update per frame
self.update = function () {
if (self.sliced) return;
self.x += self.vx;
self.y += self.vy;
self.vy += self.gravity;
// Prevent from leaving left/right screen edges
if (self.x < 0 + self.width * 0.5) {
self.x = self.width * 0.5;
self.vx = -self.vx * 0.55; // bounce back with some energy loss
}
if (self.x > 2048 - self.width * 0.5) {
self.x = 2048 - self.width * 0.5;
self.vx = -self.vx * 0.55;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Add background image
// Game variables
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
var fruits = [];
var bombs = [];
var fruitSpawnTimer = 0;
var bombSpawnTimer = 0;
var fruitSpawnInterval = 120; // 2 seconds at 60fps
var bombSpawnInterval = 300; // 5 seconds at 60fps
var score = 0;
var highScore = storage.highScore || 0;
var missed = 0;
var maxMissed = 3;
var isGameOver = false;
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// High score display (smaller, top right)
var highScoreTxt = new Text2('Best: ' + highScore, {
size: 60,
fill: "#fff"
});
highScoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(highScoreTxt);
// Missed fruits display (bottom left, as X icons)
var missTxt = new Text2('', {
size: 90,
fill: 0xFF4444
});
missTxt.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(missTxt);
// Helper: update score
function updateScore(val) {
score = val;
scoreTxt.setText(score);
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText('Best: ' + highScore);
}
// --- Show fruit washing screen at 30 points ---
if (score === 30 && !game._washingScreenActive) {
game._washingScreenActive = true;
showWashingScreen();
}
}
// Helper: update missed display
function updateMissed() {
var s = '';
for (var i = 0; i < missed; i++) s += '✗ ';
missTxt.setText(s);
}
// (spawning is now handled by fruit/bomb timers in game.update)
// Slicing logic
var swipePath = [];
var swipeMaxLength = 12; // Number of points to keep in swipe trail
var swipeRadius = 90; // How close swipe must be to slice
// Draw swipe trail (for visual feedback)
var swipeTrail = [];
function drawSwipeTrail() {
// Remove old
for (var i = 0; i < swipeTrail.length; i++) {
swipeTrail[i].destroy();
}
swipeTrail = [];
// Draw new
for (var i = 1; i < swipePath.length; i++) {
var p1 = swipePath[i - 1];
var p2 = swipePath[i];
// Draw a short white ellipse between points
var dx = p2.x - p1.x,
dy = p2.y - p1.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 10) continue;
var angle = Math.atan2(dy, dx);
var id = 'swipe_' + i;
var seg = LK.getAsset(id, {
anchorX: 0,
anchorY: 0.5,
x: p1.x,
y: p1.y,
rotation: angle,
alpha: 0.22
});
game.addChild(seg);
swipeTrail.push(seg);
}
}
// Handle swipe start
game.down = function (x, y, obj) {
if (isGameOver) return;
swipePath = [{
x: x,
y: y
}];
drawSwipeTrail();
};
// Handle swipe move
game.move = function (x, y, obj) {
if (isGameOver) return;
swipePath.push({
x: x,
y: y
});
if (swipePath.length > swipeMaxLength) swipePath.shift();
drawSwipeTrail();
// For each segment in swipe, check for intersection with fruits/bombs
for (var i = 1; i < swipePath.length; i++) {
var p1 = swipePath[i - 1],
p2 = swipePath[i];
// Fruits
for (var f = fruits.length - 1; f >= 0; f--) {
var fruit = fruits[f];
if (fruit.sliced) continue;
// If fruit already off screen, skip
if (fruit.y > 2732 + 120) continue;
// Check if swipe segment is close to fruit center
var cx = fruit.x,
cy = fruit.y;
var dist = pointToSegmentDistance(cx, cy, p1.x, p1.y, p2.x, p2.y);
if (dist < swipeRadius) {
fruit.slice();
updateScore(score + fruit.points); // Increase score by fruit's point value
fruits.splice(f, 1);
// Flash effect
LK.effects.flashObject(fruit, 0xffffff, 120);
}
}
// Bombs
for (var b = bombs.length - 1; b >= 0; b--) {
var bomb = bombs[b];
if (bomb.sliced) continue;
if (bomb.y > 2732 + 120) continue;
var cx = bomb.x,
cy = bomb.y;
var dist = pointToSegmentDistance(cx, cy, p1.x, p1.y, p2.x, p2.y);
if (dist < swipeRadius) {
bomb.slice();
bombs.splice(b, 1);
// Play bomb sound
LK.getSound('Bomb').play();
// Increase score by 1 when bomb is sliced
updateScore(score + 1);
// Flash screen red, then game over
LK.effects.flashScreen(0xff2222, 800);
isGameOver = true;
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
return;
}
}
}
};
// Handle swipe end
game.up = function (x, y, obj) {
swipePath = [];
drawSwipeTrail();
};
// Helper: distance from point to segment
function pointToSegmentDistance(px, py, x1, y1, x2, y2) {
var dx = x2 - x1,
dy = y2 - y1;
if (dx === 0 && dy === 0) {
dx = px - x1;
dy = py - y1;
return Math.sqrt(dx * dx + dy * dy);
}
var t = ((px - x1) * dx + (py - y1) * dy) / (dx * dx + dy * dy);
t = Math.max(0, Math.min(1, t));
var lx = x1 + t * dx,
ly = y1 + t * dy;
dx = px - lx;
dy = py - ly;
return Math.sqrt(dx * dx + dy * dy);
}
// Main game update
game.update = function () {
if (isGameOver) return;
// Spawn logic
fruitSpawnTimer++;
bombSpawnTimer++;
if (fruitSpawnTimer >= fruitSpawnInterval) {
// Spawn a fruit only
var obj = new Fruit();
var x = 200 + Math.random() * (2048 - 400);
var y = 2732 + 60;
var angle = -Math.PI / 2 + (Math.random() - 0.5) * Math.PI / 2;
var speed = 17 + Math.random() * 5.5 + score * 0.055;
var vx = Math.cos(angle) * speed * (Math.random() * 0.19 + 0.19);
var vy = -Math.abs(Math.sin(angle) * speed) * 1.32;
obj.x = x;
obj.y = y;
obj.vx = vx;
obj.vy = vy;
obj.scaleX = obj.scaleY = 1;
obj.alpha = 1;
fruits.push(obj);
game.addChild(obj);
fruitSpawnTimer = 0;
}
if (bombSpawnTimer >= bombSpawnInterval) {
// Spawn a bomb only
var obj = new Bomb();
var x = 200 + Math.random() * (2048 - 400);
var y = 2732 + 60;
var angle = -Math.PI / 2 + (Math.random() - 0.5) * Math.PI / 2;
var speed = 17 + Math.random() * 5.5 + score * 0.055;
var vx = Math.cos(angle) * speed * (Math.random() * 0.19 + 0.19);
var vy = -Math.abs(Math.sin(angle) * speed) * 1.32;
obj.x = x;
obj.y = y;
obj.vx = vx;
obj.vy = vy;
obj.scaleX = obj.scaleY = 1;
obj.alpha = 1;
bombs.push(obj);
game.addChild(obj);
bombSpawnTimer = 0;
}
// Update fruits
for (var i = fruits.length - 1; i >= 0; i--) {
var fruit = fruits[i];
fruit.update();
// Remove if off screen
if (!fruit.sliced && fruit.y > 2732 + 120) {
fruit.destroy();
fruits.splice(i, 1);
missed++;
updateMissed();
// Flash screen if missed
LK.effects.flashScreen(0x2222ff, 200);
if (missed >= maxMissed) {
isGameOver = true;
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
}
// Do NOT increase score here; only bomb slice increases score now
}
}
// Update bombs
for (var i = bombs.length - 1; i >= 0; i--) {
var bomb = bombs[i];
bomb.update();
if (bomb.y > 2732 + 120) {
bomb.destroy();
bombs.splice(i, 1);
}
}
// Fade out swipe trail
for (var i = 0; i < swipeTrail.length; i++) {
swipeTrail[i].alpha *= 0.85;
if (swipeTrail[i].alpha < 0.05) {
swipeTrail[i].destroy();
swipeTrail.splice(i, 1);
i--;
}
}
};
// Reset game state on new game
game.on('reset', function () {
// Remove all fruits and bombs
for (var i = 0; i < fruits.length; i++) fruits[i].destroy();
for (var i = 0; i < bombs.length; i++) bombs[i].destroy();
fruits = [];
bombs = [];
fruitSpawnTimer = 0;
bombSpawnTimer = 0;
score = 0;
missed = 0;
isGameOver = false;
game._peelingScreenShown = false;
updateScore(0);
updateMissed();
swipePath = [];
drawSwipeTrail();
highScore = storage.highScore || 0;
highScoreTxt.setText('Best: ' + highScore);
});
// Initial state
updateScore(0);
// Fruit assets
// Bomb asset: black circle
// --- Fruit Peeling Screen ---
function showPeelingScreen() {
// Only allow peeling screen once per game
if (game._peelingScreenShown) return;
game._peelingScreenShown = true;
isGameOver = true;
var peelOverlay = new Container();
peelOverlay.name = "peelOverlay";
peelOverlay.x = 0;
peelOverlay.y = 0;
peelOverlay.width = 2048;
peelOverlay.height = 2732;
// Semi-transparent background
var bg = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
alpha: 0.85
});
peelOverlay.addChild(bg);
// Title text
var title = new Text2('Meyveleri Soyalım!', {
size: 160,
fill: "#fff"
});
title.anchor.set(0.5, 0);
title.x = 1024;
title.y = 180;
peelOverlay.addChild(title);
// Fruits to peel (show 3 random fruits from types)
var fruitTypes = ['apple', 'orange', 'banana', 'watermelon', 'kiwi'];
var peelingFruits = [];
for (var i = 0; i < 3; i++) {
var t = fruitTypes[Math.floor(Math.random() * fruitTypes.length)];
var fruit = LK.getAsset('fruit_' + t, {
anchorX: 0.5,
anchorY: 0.5,
x: 600 + i * 420,
y: 1100,
scaleX: 1.2,
scaleY: 1.2,
alpha: 1
});
fruit._peeled = false;
peelingFruits.push(fruit);
peelOverlay.addChild(fruit);
}
// Peeling instructions
var instr = new Text2('Her meyvenin kabuğunu parmağınla yukarıdan aşağıya soy!', {
size: 80,
fill: "#fff"
});
instr.anchor.set(0.5, 0);
instr.x = 1024;
instr.y = 420;
peelOverlay.addChild(instr);
// Progress text
var progressTxt = new Text2('0 / 3', {
size: 100,
fill: 0xFFD700
});
progressTxt.anchor.set(0.5, 0);
progressTxt.x = 1024;
progressTxt.y = 1550;
peelOverlay.addChild(progressTxt);
// Add overlay to game
game.addChild(peelOverlay);
// Peeling logic: track vertical swipes over fruits
var peeledCount = 0;
var peelStartY = {};
var peelThreshold = 120; // Minimum vertical swipe distance to count as peeled
peelOverlay.down = function (x, y, obj) {
for (var i = 0; i < peelingFruits.length; i++) {
var fruit = peelingFruits[i];
if (fruit._peeled) continue;
var dx = x - fruit.x;
var dy = y - fruit.y;
var r = (fruit.width + fruit.height) * 0.25;
if (dx * dx + dy * dy < r * r) {
peelStartY[i] = y;
}
}
};
peelOverlay.move = function (x, y, obj) {
for (var i = 0; i < peelingFruits.length; i++) {
var fruit = peelingFruits[i];
if (fruit._peeled) continue;
if (typeof peelStartY[i] === "undefined") continue;
var dx = x - fruit.x;
var dy = y - fruit.y;
var r = (fruit.width + fruit.height) * 0.25;
if (dx * dx + dy * dy < r * r) {
// Check if swipe is mostly vertical and long enough
var deltaY = y - peelStartY[i];
if (Math.abs(deltaY) > peelThreshold && Math.abs(deltaY) > Math.abs(dx) * 1.2) {
fruit._peeled = true;
peeledCount++;
// Animate: flash yellow and fade
tween(fruit, {
alpha: 0.3
}, {
duration: 350,
onFinish: function onFinish() {}
});
LK.effects.flashObject(fruit, 0xFFD700, 400);
progressTxt.setText(peeledCount + " / 3");
// Remove startY so it can't be peeled again
delete peelStartY[i];
// If all peeled, finish
if (peeledCount === peelingFruits.length) {
finishPeeling();
}
}
}
}
};
peelOverlay.up = function (x, y, obj) {
// Reset peelStartY for all fruits
peelStartY = {};
};
// Prevent main game swipe while overlay is active
var oldGameDown = game.down,
oldGameMove = game.move,
oldGameUp = game.up;
game.down = function (x, y, obj) {
if (peelOverlay.down) peelOverlay.down(x, y, obj);
};
game.move = function (x, y, obj) {
if (peelOverlay.move) peelOverlay.move(x, y, obj);
};
game.up = function (x, y, obj) {
if (peelOverlay.up) peelOverlay.up(x, y, obj);
};
function finishPeeling() {
// Show "Tebrikler!" and continue button
var doneTxt = new Text2('Tebrikler! Meyveler soyuldu!', {
size: 120,
fill: "#fff"
});
doneTxt.anchor.set(0.5, 0);
doneTxt.x = 1024;
doneTxt.y = 1800;
peelOverlay.addChild(doneTxt);
var btn = new Text2('Devam Et', {
size: 100,
fill: 0x44FF44
});
btn.anchor.set(0.5, 0);
btn.x = 1024;
btn.y = 2000;
peelOverlay.addChild(btn);
// Button logic
btn.interactive = true;
btn.buttonMode = true;
peelOverlay.up = function (x, y, obj) {
var dx = x - btn.x;
var dy = y - btn.y;
if (dx * dx + dy * dy < 400 * 400) {
// Remove overlay, resume game
if (peelOverlay.parent) peelOverlay.parent.removeChild(peelOverlay);
isGameOver = false;
// Restore main game controls
game.down = oldGameDown;
game.move = oldGameMove;
game.up = oldGameUp;
}
};
// Allow tap on button to continue
game.up = function (x, y, obj) {
if (peelOverlay.up) peelOverlay.up(x, y, obj);
};
}
}
// --- Fruit Washing Screen ---
function showWashingScreen() {
// Pause main game logic
isGameOver = true;
// Overlay container
var washOverlay = new Container();
washOverlay.name = "washOverlay";
washOverlay.x = 0;
washOverlay.y = 0;
washOverlay.width = 2048;
washOverlay.height = 2732;
// Semi-transparent background
var bg = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
alpha: 0.85
});
washOverlay.addChild(bg);
// Title text
var title = new Text2('Meyveleri Yıkayalım!', {
size: 160,
fill: "#fff"
});
title.anchor.set(0.5, 0);
title.x = 1024;
title.y = 180;
washOverlay.addChild(title);
// Fruits to wash (show 3 random fruits from types)
var fruitTypes = ['apple', 'orange', 'banana', 'watermelon', 'kiwi'];
var washingFruits = [];
for (var i = 0; i < 3; i++) {
var t = fruitTypes[Math.floor(Math.random() * fruitTypes.length)];
var fruit = LK.getAsset('fruit_' + t, {
anchorX: 0.5,
anchorY: 0.5,
x: 600 + i * 420,
y: 1100,
scaleX: 1.2,
scaleY: 1.2,
alpha: 1
});
fruit._washed = false;
washingFruits.push(fruit);
washOverlay.addChild(fruit);
}
// Washing instructions
var instr = new Text2('Her meyveyi parmağınla ovalayarak yıka!', {
size: 80,
fill: "#fff"
});
instr.anchor.set(0.5, 0);
instr.x = 1024;
instr.y = 420;
washOverlay.addChild(instr);
// Progress text
var progressTxt = new Text2('0 / 3', {
size: 100,
fill: 0xAAFFAA
});
progressTxt.anchor.set(0.5, 0);
progressTxt.x = 1024;
progressTxt.y = 1550;
washOverlay.addChild(progressTxt);
// Add overlay to game
game.addChild(washOverlay);
// Washing logic: track swipes over fruits
var washedCount = 0;
washOverlay.down = function (x, y, obj) {
handleWash(x, y);
};
washOverlay.move = function (x, y, obj) {
handleWash(x, y);
};
function handleWash(x, y) {
for (var i = 0; i < washingFruits.length; i++) {
var fruit = washingFruits[i];
if (fruit._washed) continue;
// Check if touch is on fruit
var dx = x - fruit.x;
var dy = y - fruit.y;
var r = (fruit.width + fruit.height) * 0.25;
if (dx * dx + dy * dy < r * r) {
fruit._washed = true;
washedCount++;
// Animate: flash green and fade
tween(fruit, {
alpha: 0.3
}, {
duration: 350,
onFinish: function onFinish() {}
});
LK.effects.flashObject(fruit, 0x66ff66, 400);
progressTxt.setText(washedCount + " / 3");
// If all washed, finish
if (washedCount === washingFruits.length) {
finishWashing();
}
}
}
}
// Prevent main game swipe while overlay is active
var oldGameDown = game.down,
oldGameMove = game.move,
oldGameUp = game.up;
game.down = function (x, y, obj) {
if (washOverlay.down) washOverlay.down(x, y, obj);
};
game.move = function (x, y, obj) {
if (washOverlay.move) washOverlay.move(x, y, obj);
};
game.up = function (x, y, obj) {
// Do nothing
};
function finishWashing() {
// Show "Tebrikler!" and continue button
var doneTxt = new Text2('Tebrikler! Meyveler temiz!', {
size: 120,
fill: "#fff"
});
doneTxt.anchor.set(0.5, 0);
doneTxt.x = 1024;
doneTxt.y = 1800;
washOverlay.addChild(doneTxt);
var btn = new Text2('Devam Et', {
size: 100,
fill: 0x44FF44
});
btn.anchor.set(0.5, 0);
btn.x = 1024;
btn.y = 2000;
washOverlay.addChild(btn);
// Button logic
btn.interactive = true;
btn.buttonMode = true;
washOverlay.up = function (x, y, obj) {
// Check if touch is on button
var dx = x - btn.x;
var dy = y - btn.y;
if (dx * dx + dy * dy < 400 * 400) {
// Remove overlay, then show peeling screen
if (washOverlay.parent) washOverlay.parent.removeChild(washOverlay);
// Show fruit peeling screen
showPeelingScreen();
}
};
// Allow tap on button to continue
game.up = function (x, y, obj) {
if (washOverlay.up) washOverlay.up(x, y, obj);
};
}
} ===================================================================
--- original.js
+++ change.js
@@ -554,8 +554,9 @@
bombSpawnTimer = 0;
score = 0;
missed = 0;
isGameOver = false;
+ game._peelingScreenShown = false;
updateScore(0);
updateMissed();
swipePath = [];
drawSwipeTrail();
@@ -567,9 +568,11 @@
// Fruit assets
// Bomb asset: black circle
// --- Fruit Peeling Screen ---
function showPeelingScreen() {
- // Pause main game logic
+ // Only allow peeling screen once per game
+ if (game._peelingScreenShown) return;
+ game._peelingScreenShown = true;
isGameOver = true;
var peelOverlay = new Container();
peelOverlay.name = "peelOverlay";
peelOverlay.x = 0;