/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Bowl class
var Bowl = Container.expand(function () {
var self = Container.call(this);
self.bowlAsset = self.attachAsset('bowl', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Fruit class
var Fruit = Container.expand(function () {
var self = Container.call(this);
// Vars
self.level = 1; // 1-7
self.radius = 90; // default, will be set below
self.isMerging = false; // prevent double merge
// Attach fruit asset
self.setLevel = function (level) {
self.level = level;
// Remove old asset if exists
if (self.fruitAsset) {
self.removeChild(self.fruitAsset);
}
var assetId = 'fruit' + level;
self.fruitAsset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = self.fruitAsset.width / 2;
};
self.setLevel(1);
// Physics
self.vx = 0;
self.vy = 0;
self.gravity = 2.2;
self.bounce = 0.55;
self.friction = 0.99;
self.isStatic = false; // true: can't move (for bowl, etc)
// Merge animation
self.playMergeAnim = function () {
tween(self, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
}
});
};
// Update
self.update = function () {
if (self.isStatic) {
return;
}
// Physics
self.vy += self.gravity;
self.x += self.vx;
self.y += self.vy;
// Friction (horizontal)
self.vx *= self.friction;
// Bowl collision
var bowlTop = bowl.y - bowl.height / 2;
var bowlLeft = bowl.x - bowl.width / 2;
var bowlRight = bowl.x + bowl.width / 2;
// Alt sınır (bowl)
if (self.y + self.radius > bowlTop) {
self.y = bowlTop - self.radius;
self.vy *= -self.bounce;
self.vx *= self.friction;
// Yavaşça durdur
if (Math.abs(self.vy) < 2) {
self.vy = 0;
}
}
// Yan sınırlar (bowl + taş duvarlar)
// Sol taş duvar assetiyle çarpışma
var leftWallRight = leftWall.x + leftWall.width;
if (self.x - self.radius < leftWallRight) {
self.x = leftWallRight + self.radius;
self.vx = Math.abs(self.vx) * self.bounce; // Sağa seker
}
// Sağ taş duvar assetiyle çarpışma
var rightWallLeft = rightWall.x - rightWall.width;
if (self.x + self.radius > rightWallLeft) {
self.x = rightWallLeft - self.radius;
self.vx = -Math.abs(self.vx) * self.bounce; // Sola seker
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf7f7f7
});
/****
* Game Code
****/
// Oyun alanı boyutları
// 7 farklı seviye için meyve şekilleri (örnek renkler ve boyutlar, gerçek oyunda görsellerle değiştirilebilir)
// Limon
// Portakal
// Elma
// Kivi
// Üzüm
// Karpuz
// Ejder Meyvesi
// Kap (bowl)
var GAME_W = 2048;
var GAME_H = 2732;
// Arka plan ekle (huzurlu bir ev içi görseli)
var background = LK.getAsset('bg_home', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: GAME_H / 2,
scaleX: 1,
scaleY: 1
});
game.addChild(background);
// Bowl'u oluştur ve ortala (alt kısımda)
var bowl = new Bowl();
bowl.x = GAME_W / 2;
bowl.y = GAME_H - 200;
game.addChild(bowl);
// Taş duvarlar (sol ve sağ)
var wallWidth = 120;
var wallHeight = GAME_H;
var leftWall = LK.getAsset('left', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
scaleX: wallWidth / 100,
scaleY: wallHeight / 100
});
var rightWall = LK.getAsset('left', {
anchorX: 1,
anchorY: 0,
x: GAME_W,
y: 0,
scaleX: wallWidth / 100,
scaleY: wallHeight / 100
});
game.addChild(leftWall);
game.addChild(rightWall);
// Meyve listesi
var fruits = [];
// Skor
var score = 0;
var topScore = storage.topScore || 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#222"
});
scoreTxt.anchor.set(0.5, 0);
// Top score text
var topScoreTxt = new Text2('Top Score : ' + topScore, {
size: 60,
fill: "#000"
});
topScoreTxt.anchor.set(0.5, 0);
topScoreTxt.y = scoreTxt.height + 10;
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(topScoreTxt);
// Sonraki atılacak meyve
var nextLevel = 1;
var nextFruitPreview = LK.getAsset('fruit1', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: 220,
scaleX: 0.7,
scaleY: 0.7
});
game.addChild(nextFruitPreview);
// Atılacak meyve pozisyonu
var shootX = GAME_W / 2;
var shootY = 400;
// Atılacak meyve (henüz düşmeyen)
var holdingFruit = null;
var isDragging = false;
// Oyun bitti mi?
var isGameOver = false;
// Skoru güncelle
function updateScore(val) {
score = val;
scoreTxt.setText(score);
if (score > topScore) {
topScore = score;
topScoreTxt.setText('En Yüksek: ' + topScore);
storage.topScore = topScore;
}
}
// Yeni meyve seviyesi seç (1-5 arası daha sık, 6-7 nadir)
function getRandomLevel() {
// %60 olasılıkla elma (fruit1), %40 olasılıkla muz (fruit2) fırlat
var r = Math.random();
if (r < 0.6) {
return 1; // elma
} else {
return 2; // muz
}
}
// Yeni meyve oluştur (henüz düşmeyen)
function spawnHoldingFruit() {
nextLevel = getRandomLevel();
if (nextFruitPreview) {
game.removeChild(nextFruitPreview);
}
nextFruitPreview = LK.getAsset('fruit' + nextLevel, {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: 220,
scaleX: 0.7,
scaleY: 0.7
});
game.addChild(nextFruitPreview);
holdingFruit = new Fruit();
holdingFruit.setLevel(nextLevel);
holdingFruit.x = shootX;
holdingFruit.y = shootY;
holdingFruit.isStatic = true;
game.addChild(holdingFruit);
}
// İlk meyveyi oluştur
spawnHoldingFruit();
// Ekrana dokunma/çekme ile meyve pozisyonunu ayarla
game.move = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
// Sadece yatayda hareket ettir
var minX = bowl.x - bowl.width / 2 + holdingFruit.radius;
var maxX = bowl.x + bowl.width / 2 - holdingFruit.radius;
holdingFruit.x = Math.max(minX, Math.min(maxX, x));
// Y sabit
holdingFruit.y = shootY;
};
// Dokunma başlat
game.down = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
isDragging = true;
game.move(x, y, obj);
};
// Dokunma bırakınca meyveyi bırak
game.up = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
if (!isDragging) {
return;
}
isDragging = false;
// Meyveyi serbest bırak
holdingFruit.isStatic = false;
holdingFruit.vx = 0;
holdingFruit.vy = 0;
fruits.push(holdingFruit);
holdingFruit = null;
// Yeni meyve oluştur
LK.setTimeout(function () {
if (!isGameOver) {
spawnHoldingFruit();
}
}, 250);
};
// Meyve çarpışma ve birleştirme
function checkFruitMerges() {
for (var i = 0; i < fruits.length; i++) {
var f1 = fruits[i];
if (f1.isMerging) {
continue;
}
for (var j = i + 1; j < fruits.length; j++) {
var f2 = fruits[j];
if (f2.isMerging) {
continue;
}
if (f1.level !== f2.level) {
continue;
}
// Çarpışma kontrolü
var dx = f1.x - f2.x;
var dy = f1.y - f2.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < f1.radius + f2.radius - 8) {
// biraz tolerans
// Birleştir
mergeFruits(f1, f2);
return; // Birleştikten sonra döngüyü kır, çünkü dizi değişti
}
}
}
}
// Meyve birleştirme
function mergeFruits(f1, f2) {
if (f1.isMerging || f2.isMerging) {
return;
}
f1.isMerging = true;
f2.isMerging = true;
// Yeni meyve pozisyonu ortalama
var newX = (f1.x + f2.x) / 2;
var newY = (f1.y + f2.y) / 2;
var newVx = (f1.vx + f2.vx) / 2;
var newVy = (f1.vy + f2.vy) / 2;
// Yeni meyve
var newLevel = Math.min(f1.level + 1, 7);
var newFruit = new Fruit();
newFruit.setLevel(newLevel);
newFruit.x = newX;
newFruit.y = newY;
newFruit.vx = newVx;
newFruit.vy = -Math.abs(newVy) * 0.7 - 8; // yukarı zıplat
newFruit.isStatic = false;
game.addChild(newFruit);
fruits.push(newFruit);
// Animasyon
newFruit.scaleX = 0.7;
newFruit.scaleY = 0.7;
tween(newFruit, {
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.easeOut
});
// Eski meyveleri sil
f1.visible = false;
f2.visible = false;
LK.setTimeout(function () {
f1.destroy();
f2.destroy();
}, 60);
// Listeden çıkar
for (var k = fruits.length - 1; k >= 0; k--) {
if (fruits[k] === f1 || fruits[k] === f2) {
fruits.splice(k, 1);
}
}
// Skor ekle
updateScore(score + Math.pow(2, newLevel + 1));
// En yüksek seviyeye ulaşıldıysa kazan veya 2 tane fruit7 birleşirse oyun biter
var fruit7Count = 0;
for (var i = 0; i < fruits.length; i++) {
if (fruits[i].level === 7) {
fruit7Count++;
}
}
// Yeni oluşan meyve de fruit7 ise sayıyı artır
if (newFruit.level === 7) {
fruit7Count++;
}
if (fruit7Count >= 2) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
return;
}
// 20 veya daha fazla meyve varsa oyun biter
if (fruits.length >= 20) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
return;
}
}
// Meyve-meyve fiziksel çarpışma (sıçrama)
function resolveFruitCollisions() {
for (var i = 0; i < fruits.length; i++) {
var f1 = fruits[i];
if (f1.isMerging) {
continue;
}
for (var j = i + 1; j < fruits.length; j++) {
var f2 = fruits[j];
if (f2.isMerging) {
continue;
}
// Çarpışma kontrolü
var dx = f1.x - f2.x;
var dy = f1.y - f2.y;
var dist = Math.sqrt(dx * dx + dy * dy);
var minDist = f1.radius + f2.radius;
if (dist < minDist - 2) {
// Meyveleri ayır
var overlap = (minDist - dist) / 2;
if (dist === 0) {
dx = Math.random() - 0.5;
dy = Math.random() - 0.5;
dist = 1;
}
var nx = dx / dist;
var ny = dy / dist;
f1.x += nx * overlap;
f1.y += ny * overlap;
f2.x -= nx * overlap;
f2.y -= ny * overlap;
// Basit elastik çarpışma
var tx = -ny,
ty = nx;
var dpTan1 = f1.vx * tx + f1.vy * ty;
var dpTan2 = f2.vx * tx + f2.vy * ty;
var dpNorm1 = f1.vx * nx + f1.vy * ny;
var dpNorm2 = f2.vx * nx + f2.vy * ny;
var m1 = dpNorm2;
var m2 = dpNorm1;
f1.vx = tx * dpTan1 + nx * m1;
f1.vy = ty * dpTan1 + ny * m1;
f2.vx = tx * dpTan2 + nx * m2;
f2.vy = ty * dpTan2 + ny * m2;
// Hafif sönümleme
f1.vx *= 0.98;
f1.vy *= 0.98;
f2.vx *= 0.98;
f2.vy *= 0.98;
}
}
}
}
// Meyveler taşarsa oyun biter
function checkGameOver() {
for (var i = 0; i < fruits.length; i++) {
if (fruits[i].y - fruits[i].radius < 120) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 400);
return;
}
}
}
// Oyun döngüsü
game.update = function () {
// Meyveleri güncelle
for (var i = 0; i < fruits.length; i++) {
fruits[i].update();
}
// Çarpışma ve birleştirme
checkFruitMerges();
resolveFruitCollisions();
// Oyun bitti mi?
checkGameOver();
};
// Oyun bittiğinde veya kazanıldığında cleanup otomatik yapılır (LK tarafından)
/* END */ /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Bowl class
var Bowl = Container.expand(function () {
var self = Container.call(this);
self.bowlAsset = self.attachAsset('bowl', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Fruit class
var Fruit = Container.expand(function () {
var self = Container.call(this);
// Vars
self.level = 1; // 1-7
self.radius = 90; // default, will be set below
self.isMerging = false; // prevent double merge
// Attach fruit asset
self.setLevel = function (level) {
self.level = level;
// Remove old asset if exists
if (self.fruitAsset) {
self.removeChild(self.fruitAsset);
}
var assetId = 'fruit' + level;
self.fruitAsset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = self.fruitAsset.width / 2;
};
self.setLevel(1);
// Physics
self.vx = 0;
self.vy = 0;
self.gravity = 2.2;
self.bounce = 0.55;
self.friction = 0.99;
self.isStatic = false; // true: can't move (for bowl, etc)
// Merge animation
self.playMergeAnim = function () {
tween(self, {
scaleX: 1.25,
scaleY: 1.25
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
}
});
};
// Update
self.update = function () {
if (self.isStatic) {
return;
}
// Physics
self.vy += self.gravity;
self.x += self.vx;
self.y += self.vy;
// Friction (horizontal)
self.vx *= self.friction;
// Bowl collision
var bowlTop = bowl.y - bowl.height / 2;
var bowlLeft = bowl.x - bowl.width / 2;
var bowlRight = bowl.x + bowl.width / 2;
// Alt sınır (bowl)
if (self.y + self.radius > bowlTop) {
self.y = bowlTop - self.radius;
self.vy *= -self.bounce;
self.vx *= self.friction;
// Yavaşça durdur
if (Math.abs(self.vy) < 2) {
self.vy = 0;
}
}
// Yan sınırlar (bowl + taş duvarlar)
// Sol taş duvar assetiyle çarpışma
var leftWallRight = leftWall.x + leftWall.width;
if (self.x - self.radius < leftWallRight) {
self.x = leftWallRight + self.radius;
self.vx = Math.abs(self.vx) * self.bounce; // Sağa seker
}
// Sağ taş duvar assetiyle çarpışma
var rightWallLeft = rightWall.x - rightWall.width;
if (self.x + self.radius > rightWallLeft) {
self.x = rightWallLeft - self.radius;
self.vx = -Math.abs(self.vx) * self.bounce; // Sola seker
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf7f7f7
});
/****
* Game Code
****/
// Oyun alanı boyutları
// 7 farklı seviye için meyve şekilleri (örnek renkler ve boyutlar, gerçek oyunda görsellerle değiştirilebilir)
// Limon
// Portakal
// Elma
// Kivi
// Üzüm
// Karpuz
// Ejder Meyvesi
// Kap (bowl)
var GAME_W = 2048;
var GAME_H = 2732;
// Arka plan ekle (huzurlu bir ev içi görseli)
var background = LK.getAsset('bg_home', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: GAME_H / 2,
scaleX: 1,
scaleY: 1
});
game.addChild(background);
// Bowl'u oluştur ve ortala (alt kısımda)
var bowl = new Bowl();
bowl.x = GAME_W / 2;
bowl.y = GAME_H - 200;
game.addChild(bowl);
// Taş duvarlar (sol ve sağ)
var wallWidth = 120;
var wallHeight = GAME_H;
var leftWall = LK.getAsset('left', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
scaleX: wallWidth / 100,
scaleY: wallHeight / 100
});
var rightWall = LK.getAsset('left', {
anchorX: 1,
anchorY: 0,
x: GAME_W,
y: 0,
scaleX: wallWidth / 100,
scaleY: wallHeight / 100
});
game.addChild(leftWall);
game.addChild(rightWall);
// Meyve listesi
var fruits = [];
// Skor
var score = 0;
var topScore = storage.topScore || 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#222"
});
scoreTxt.anchor.set(0.5, 0);
// Top score text
var topScoreTxt = new Text2('Top Score : ' + topScore, {
size: 60,
fill: "#000"
});
topScoreTxt.anchor.set(0.5, 0);
topScoreTxt.y = scoreTxt.height + 10;
LK.gui.top.addChild(scoreTxt);
LK.gui.top.addChild(topScoreTxt);
// Sonraki atılacak meyve
var nextLevel = 1;
var nextFruitPreview = LK.getAsset('fruit1', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: 220,
scaleX: 0.7,
scaleY: 0.7
});
game.addChild(nextFruitPreview);
// Atılacak meyve pozisyonu
var shootX = GAME_W / 2;
var shootY = 400;
// Atılacak meyve (henüz düşmeyen)
var holdingFruit = null;
var isDragging = false;
// Oyun bitti mi?
var isGameOver = false;
// Skoru güncelle
function updateScore(val) {
score = val;
scoreTxt.setText(score);
if (score > topScore) {
topScore = score;
topScoreTxt.setText('En Yüksek: ' + topScore);
storage.topScore = topScore;
}
}
// Yeni meyve seviyesi seç (1-5 arası daha sık, 6-7 nadir)
function getRandomLevel() {
// %60 olasılıkla elma (fruit1), %40 olasılıkla muz (fruit2) fırlat
var r = Math.random();
if (r < 0.6) {
return 1; // elma
} else {
return 2; // muz
}
}
// Yeni meyve oluştur (henüz düşmeyen)
function spawnHoldingFruit() {
nextLevel = getRandomLevel();
if (nextFruitPreview) {
game.removeChild(nextFruitPreview);
}
nextFruitPreview = LK.getAsset('fruit' + nextLevel, {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: 220,
scaleX: 0.7,
scaleY: 0.7
});
game.addChild(nextFruitPreview);
holdingFruit = new Fruit();
holdingFruit.setLevel(nextLevel);
holdingFruit.x = shootX;
holdingFruit.y = shootY;
holdingFruit.isStatic = true;
game.addChild(holdingFruit);
}
// İlk meyveyi oluştur
spawnHoldingFruit();
// Ekrana dokunma/çekme ile meyve pozisyonunu ayarla
game.move = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
// Sadece yatayda hareket ettir
var minX = bowl.x - bowl.width / 2 + holdingFruit.radius;
var maxX = bowl.x + bowl.width / 2 - holdingFruit.radius;
holdingFruit.x = Math.max(minX, Math.min(maxX, x));
// Y sabit
holdingFruit.y = shootY;
};
// Dokunma başlat
game.down = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
isDragging = true;
game.move(x, y, obj);
};
// Dokunma bırakınca meyveyi bırak
game.up = function (x, y, obj) {
if (isGameOver) {
return;
}
if (!holdingFruit) {
return;
}
if (!isDragging) {
return;
}
isDragging = false;
// Meyveyi serbest bırak
holdingFruit.isStatic = false;
holdingFruit.vx = 0;
holdingFruit.vy = 0;
fruits.push(holdingFruit);
holdingFruit = null;
// Yeni meyve oluştur
LK.setTimeout(function () {
if (!isGameOver) {
spawnHoldingFruit();
}
}, 250);
};
// Meyve çarpışma ve birleştirme
function checkFruitMerges() {
for (var i = 0; i < fruits.length; i++) {
var f1 = fruits[i];
if (f1.isMerging) {
continue;
}
for (var j = i + 1; j < fruits.length; j++) {
var f2 = fruits[j];
if (f2.isMerging) {
continue;
}
if (f1.level !== f2.level) {
continue;
}
// Çarpışma kontrolü
var dx = f1.x - f2.x;
var dy = f1.y - f2.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < f1.radius + f2.radius - 8) {
// biraz tolerans
// Birleştir
mergeFruits(f1, f2);
return; // Birleştikten sonra döngüyü kır, çünkü dizi değişti
}
}
}
}
// Meyve birleştirme
function mergeFruits(f1, f2) {
if (f1.isMerging || f2.isMerging) {
return;
}
f1.isMerging = true;
f2.isMerging = true;
// Yeni meyve pozisyonu ortalama
var newX = (f1.x + f2.x) / 2;
var newY = (f1.y + f2.y) / 2;
var newVx = (f1.vx + f2.vx) / 2;
var newVy = (f1.vy + f2.vy) / 2;
// Yeni meyve
var newLevel = Math.min(f1.level + 1, 7);
var newFruit = new Fruit();
newFruit.setLevel(newLevel);
newFruit.x = newX;
newFruit.y = newY;
newFruit.vx = newVx;
newFruit.vy = -Math.abs(newVy) * 0.7 - 8; // yukarı zıplat
newFruit.isStatic = false;
game.addChild(newFruit);
fruits.push(newFruit);
// Animasyon
newFruit.scaleX = 0.7;
newFruit.scaleY = 0.7;
tween(newFruit, {
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.easeOut
});
// Eski meyveleri sil
f1.visible = false;
f2.visible = false;
LK.setTimeout(function () {
f1.destroy();
f2.destroy();
}, 60);
// Listeden çıkar
for (var k = fruits.length - 1; k >= 0; k--) {
if (fruits[k] === f1 || fruits[k] === f2) {
fruits.splice(k, 1);
}
}
// Skor ekle
updateScore(score + Math.pow(2, newLevel + 1));
// En yüksek seviyeye ulaşıldıysa kazan veya 2 tane fruit7 birleşirse oyun biter
var fruit7Count = 0;
for (var i = 0; i < fruits.length; i++) {
if (fruits[i].level === 7) {
fruit7Count++;
}
}
// Yeni oluşan meyve de fruit7 ise sayıyı artır
if (newFruit.level === 7) {
fruit7Count++;
}
if (fruit7Count >= 2) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
return;
}
// 20 veya daha fazla meyve varsa oyun biter
if (fruits.length >= 20) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
return;
}
}
// Meyve-meyve fiziksel çarpışma (sıçrama)
function resolveFruitCollisions() {
for (var i = 0; i < fruits.length; i++) {
var f1 = fruits[i];
if (f1.isMerging) {
continue;
}
for (var j = i + 1; j < fruits.length; j++) {
var f2 = fruits[j];
if (f2.isMerging) {
continue;
}
// Çarpışma kontrolü
var dx = f1.x - f2.x;
var dy = f1.y - f2.y;
var dist = Math.sqrt(dx * dx + dy * dy);
var minDist = f1.radius + f2.radius;
if (dist < minDist - 2) {
// Meyveleri ayır
var overlap = (minDist - dist) / 2;
if (dist === 0) {
dx = Math.random() - 0.5;
dy = Math.random() - 0.5;
dist = 1;
}
var nx = dx / dist;
var ny = dy / dist;
f1.x += nx * overlap;
f1.y += ny * overlap;
f2.x -= nx * overlap;
f2.y -= ny * overlap;
// Basit elastik çarpışma
var tx = -ny,
ty = nx;
var dpTan1 = f1.vx * tx + f1.vy * ty;
var dpTan2 = f2.vx * tx + f2.vy * ty;
var dpNorm1 = f1.vx * nx + f1.vy * ny;
var dpNorm2 = f2.vx * nx + f2.vy * ny;
var m1 = dpNorm2;
var m2 = dpNorm1;
f1.vx = tx * dpTan1 + nx * m1;
f1.vy = ty * dpTan1 + ny * m1;
f2.vx = tx * dpTan2 + nx * m2;
f2.vy = ty * dpTan2 + ny * m2;
// Hafif sönümleme
f1.vx *= 0.98;
f1.vy *= 0.98;
f2.vx *= 0.98;
f2.vy *= 0.98;
}
}
}
}
// Meyveler taşarsa oyun biter
function checkGameOver() {
for (var i = 0; i < fruits.length; i++) {
if (fruits[i].y - fruits[i].radius < 120) {
isGameOver = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 400);
return;
}
}
}
// Oyun döngüsü
game.update = function () {
// Meyveleri güncelle
for (var i = 0; i < fruits.length; i++) {
fruits[i].update();
}
// Çarpışma ve birleştirme
checkFruitMerges();
resolveFruitCollisions();
// Oyun bitti mi?
checkGameOver();
};
// Oyun bittiğinde veya kazanıldığında cleanup otomatik yapılır (LK tarafından)
/* END */
pixel art 2d apple. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d banana. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d purple grapes. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d orange. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d strawberry. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d watermelon. In-Game asset. 2d. High contrast. No shadows
make pixel art 2d pineapple. In-Game asset. 2d. High contrast. No shadows
The inside of a quiet and peaceful house with no people inside. In-Game asset. 2d. High contrast. No shadows
a floor made of stone. In-Game asset. 2d. High contrast. No shadows