/**** * 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