/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Düşen yiyecek ve bomba için temel sınıf
var FallingItem = Container.expand(function () {
var self = Container.call(this);
// .type, .speed, .assetId dışarıdan atanacak
self.update = function () {
self.y += self.speed;
};
return self;
});
// Şiş (Skewer) class
var Skewer = Container.expand(function () {
var self = Container.call(this);
var skewerAsset = self.attachAsset('skewer', {
anchorX: 0.5,
anchorY: 0.5
});
// Düz (dik) konumda başlat
self.rotation = 0;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x7ed6df // Gökyüzü mavisi/turkuaz arka plan
});
/****
* Game Code
****/
// Arka plan görselini ekle
var bgAsset = LK.getAsset('Biber', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
game.addChildAt(bgAsset, 0); // En arkaya ekle
// Bomba (bomb) - siyah
// Köfte (meatball) - kahverengi
// Sebze (vegetable) - yeşil
// Şiş (skewer)
// Oyun alanı boyutları
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Skewer oluştur ve konumlandır
var skewer = new Skewer();
game.addChild(skewer);
// Sol alt köşede, dik başlat
skewer.x = 180;
skewer.y = GAME_HEIGHT - 180;
skewer.rotation = 0; // Düz (dik) konumda
// Skewer'ın hareketi için sürükleme değişkenleri
var dragging = false;
// Skor metni
var scoreTxt = new Text2('0', {
size: 120,
fill: 0x7C4D03
});
// Skewer fırlama animasyonu için kullanılmayan değişkenler (eski koddan kalma, bug fix için false başlat)
var skewerFiring = false;
var skewerFireProgress = 0;
var skewerFireDuration = 0;
var skewerFireStart = {
x: 0,
y: 0
};
var skewerFireTarget = {
x: 0,
y: 0
};
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Skor
var score = 0;
// Düşen nesneler dizisi
var fallingItems = [];
// Oyun bitti mi kontrolü
var gameOver = false;
// Rastgele item türü seçimi
function getRandomItemType() {
// %40 sebze, %40 köfte, %20 bomba
var r = Math.random();
if (r < 0.4) return 'veggie';
if (r < 0.8) return 'meatball';
return 'bomb';
}
// Yeni düşen nesne oluştur
function spawnFallingItem() {
var itemType = getRandomItemType();
var item = new FallingItem();
item.type = itemType;
item.assetId = itemType;
item.speed = 7 + Math.random() * 4; // 7-11 px/sn, biraz daha yavaş
// Asset ekle
var asset = item.attachAsset(item.assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Rastgele x, kenarlara taşmasın
var margin = 100 + asset.width / 2;
item.x = margin + Math.random() * (GAME_WIDTH - 2 * margin);
item.y = -asset.height / 2;
fallingItems.push(item);
game.addChild(item);
}
// Oyun güncelleme fonksiyonu
game.update = function () {
if (gameOver) return;
// Skewer fırlama animasyonu
if (skewerFiring) {
skewerFireProgress++;
var t = skewerFireProgress / skewerFireDuration;
if (t < 0.5) {
// İleri giderken
var tt = t * 2;
skewer.x = skewerFireStart.x + (skewerFireTarget.x - skewerFireStart.x) * tt;
skewer.y = skewerFireStart.y + (skewerFireTarget.y - skewerFireStart.y) * tt;
} else if (t < 1) {
// Geri dönerken
var tt = (t - 0.5) * 2;
skewer.x = skewerFireTarget.x + (skewerFireStart.x - skewerFireTarget.x) * tt;
skewer.y = skewerFireTarget.y + (skewerFireStart.y - skewerFireTarget.y) * tt;
} else {
// Animasyon bitti
skewer.x = skewerFireStart.x;
skewer.y = skewerFireStart.y;
skewerFiring = false;
}
}
// Düşen nesneleri güncelle
for (var i = fallingItems.length - 1; i >= 0; i--) {
var item = fallingItems[i];
item.update();
// Yere değdi mi?
if (item.y - item.height / 2 > GAME_HEIGHT) {
if (item.type === 'veggie' || item.type === 'meatball') {
// Yiyecek yere düştü, oyun biter
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
gameOver = true;
return;
} else {
// Bomba yere düştü, sadece sil
item.destroy();
fallingItems.splice(i, 1);
continue;
}
}
// Şiş ile çarpışma kontrolü
// Temas anını hassas şekilde tespit etmek için lastWasIntersecting kullan
if (item.lastWasIntersecting === undefined) item.lastWasIntersecting = false;
var isIntersecting = item.intersects(skewer);
if (!item.lastWasIntersecting && isIntersecting) {
if (item.type === 'bomb') {
// Bomba yakalandı, oyun biter
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
gameOver = true;
return;
} else {
// Yiyecek yakalandı, skor artır
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Efekt: Şişin ucunda küçük bir parlama animasyonu
var effect = LK.getAsset('veggie', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.4
});
effect.x = skewer.x;
effect.y = skewer.y - skewer.height / 2 + 40; // Şişin ucu
game.addChild(effect);
tween(effect, {
scaleX: 1.1,
scaleY: 1.1,
alpha: 0
}, {
duration: 320,
easing: tween.cubicOut,
onFinish: function onFinish() {
effect.destroy();
}
});
// Yakalanan itemi sil
item.destroy();
fallingItems.splice(i, 1);
continue;
}
}
item.lastWasIntersecting = isIntersecting;
}
// Belirli aralıklarla yeni nesne oluştur
if (LK.ticks % 36 === 0) {
// ~1 adet/sn
spawnFallingItem();
}
};
// Skewer'ı sürüklemek için dokunma/taşıma olayları
function clamp(val, min, max) {
return Math.max(min, Math.min(max, val));
}
game.down = function (x, y, obj) {
// Sadece skewer'ın yakınında başlat
var local = skewer.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) < skewer.width / 2 + 80 && Math.abs(local.y) < skewer.height / 2 + 80) {
dragging = true;
moveSkewer(x, y);
}
};
game.move = function (x, y, obj) {
if (dragging) {
moveSkewer(x, y);
}
};
game.up = function (x, y, obj) {
dragging = false;
};
function moveSkewer(x, y) {
// Hem yatay hem dikeyde sınırla, kenarlara taşmasın
var halfWidth = skewer.width / 2;
var halfHeight = skewer.height / 2;
// Y ekseninde üst sınırı ekranın yarısı (halfHeight + 40 ile GAME_HEIGHT/2 - halfHeight arasında)
skewer.x = clamp(x, halfWidth + 40, GAME_WIDTH - halfWidth - 40);
skewer.y = clamp(y, GAME_HEIGHT / 2 + halfHeight, GAME_HEIGHT - halfHeight - 40);
}
// Oyun başında skor sıfırla
score = 0;
LK.setScore(0);
scoreTxt.setText(score);
// Oyun bittiğinde cleanup (LK.showGameOver çağrıldığında otomatik resetlenir) /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Düşen yiyecek ve bomba için temel sınıf
var FallingItem = Container.expand(function () {
var self = Container.call(this);
// .type, .speed, .assetId dışarıdan atanacak
self.update = function () {
self.y += self.speed;
};
return self;
});
// Şiş (Skewer) class
var Skewer = Container.expand(function () {
var self = Container.call(this);
var skewerAsset = self.attachAsset('skewer', {
anchorX: 0.5,
anchorY: 0.5
});
// Düz (dik) konumda başlat
self.rotation = 0;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x7ed6df // Gökyüzü mavisi/turkuaz arka plan
});
/****
* Game Code
****/
// Arka plan görselini ekle
var bgAsset = LK.getAsset('Biber', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
game.addChildAt(bgAsset, 0); // En arkaya ekle
// Bomba (bomb) - siyah
// Köfte (meatball) - kahverengi
// Sebze (vegetable) - yeşil
// Şiş (skewer)
// Oyun alanı boyutları
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Skewer oluştur ve konumlandır
var skewer = new Skewer();
game.addChild(skewer);
// Sol alt köşede, dik başlat
skewer.x = 180;
skewer.y = GAME_HEIGHT - 180;
skewer.rotation = 0; // Düz (dik) konumda
// Skewer'ın hareketi için sürükleme değişkenleri
var dragging = false;
// Skor metni
var scoreTxt = new Text2('0', {
size: 120,
fill: 0x7C4D03
});
// Skewer fırlama animasyonu için kullanılmayan değişkenler (eski koddan kalma, bug fix için false başlat)
var skewerFiring = false;
var skewerFireProgress = 0;
var skewerFireDuration = 0;
var skewerFireStart = {
x: 0,
y: 0
};
var skewerFireTarget = {
x: 0,
y: 0
};
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Skor
var score = 0;
// Düşen nesneler dizisi
var fallingItems = [];
// Oyun bitti mi kontrolü
var gameOver = false;
// Rastgele item türü seçimi
function getRandomItemType() {
// %40 sebze, %40 köfte, %20 bomba
var r = Math.random();
if (r < 0.4) return 'veggie';
if (r < 0.8) return 'meatball';
return 'bomb';
}
// Yeni düşen nesne oluştur
function spawnFallingItem() {
var itemType = getRandomItemType();
var item = new FallingItem();
item.type = itemType;
item.assetId = itemType;
item.speed = 7 + Math.random() * 4; // 7-11 px/sn, biraz daha yavaş
// Asset ekle
var asset = item.attachAsset(item.assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Rastgele x, kenarlara taşmasın
var margin = 100 + asset.width / 2;
item.x = margin + Math.random() * (GAME_WIDTH - 2 * margin);
item.y = -asset.height / 2;
fallingItems.push(item);
game.addChild(item);
}
// Oyun güncelleme fonksiyonu
game.update = function () {
if (gameOver) return;
// Skewer fırlama animasyonu
if (skewerFiring) {
skewerFireProgress++;
var t = skewerFireProgress / skewerFireDuration;
if (t < 0.5) {
// İleri giderken
var tt = t * 2;
skewer.x = skewerFireStart.x + (skewerFireTarget.x - skewerFireStart.x) * tt;
skewer.y = skewerFireStart.y + (skewerFireTarget.y - skewerFireStart.y) * tt;
} else if (t < 1) {
// Geri dönerken
var tt = (t - 0.5) * 2;
skewer.x = skewerFireTarget.x + (skewerFireStart.x - skewerFireTarget.x) * tt;
skewer.y = skewerFireTarget.y + (skewerFireStart.y - skewerFireTarget.y) * tt;
} else {
// Animasyon bitti
skewer.x = skewerFireStart.x;
skewer.y = skewerFireStart.y;
skewerFiring = false;
}
}
// Düşen nesneleri güncelle
for (var i = fallingItems.length - 1; i >= 0; i--) {
var item = fallingItems[i];
item.update();
// Yere değdi mi?
if (item.y - item.height / 2 > GAME_HEIGHT) {
if (item.type === 'veggie' || item.type === 'meatball') {
// Yiyecek yere düştü, oyun biter
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
gameOver = true;
return;
} else {
// Bomba yere düştü, sadece sil
item.destroy();
fallingItems.splice(i, 1);
continue;
}
}
// Şiş ile çarpışma kontrolü
// Temas anını hassas şekilde tespit etmek için lastWasIntersecting kullan
if (item.lastWasIntersecting === undefined) item.lastWasIntersecting = false;
var isIntersecting = item.intersects(skewer);
if (!item.lastWasIntersecting && isIntersecting) {
if (item.type === 'bomb') {
// Bomba yakalandı, oyun biter
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
gameOver = true;
return;
} else {
// Yiyecek yakalandı, skor artır
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Efekt: Şişin ucunda küçük bir parlama animasyonu
var effect = LK.getAsset('veggie', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.4
});
effect.x = skewer.x;
effect.y = skewer.y - skewer.height / 2 + 40; // Şişin ucu
game.addChild(effect);
tween(effect, {
scaleX: 1.1,
scaleY: 1.1,
alpha: 0
}, {
duration: 320,
easing: tween.cubicOut,
onFinish: function onFinish() {
effect.destroy();
}
});
// Yakalanan itemi sil
item.destroy();
fallingItems.splice(i, 1);
continue;
}
}
item.lastWasIntersecting = isIntersecting;
}
// Belirli aralıklarla yeni nesne oluştur
if (LK.ticks % 36 === 0) {
// ~1 adet/sn
spawnFallingItem();
}
};
// Skewer'ı sürüklemek için dokunma/taşıma olayları
function clamp(val, min, max) {
return Math.max(min, Math.min(max, val));
}
game.down = function (x, y, obj) {
// Sadece skewer'ın yakınında başlat
var local = skewer.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) < skewer.width / 2 + 80 && Math.abs(local.y) < skewer.height / 2 + 80) {
dragging = true;
moveSkewer(x, y);
}
};
game.move = function (x, y, obj) {
if (dragging) {
moveSkewer(x, y);
}
};
game.up = function (x, y, obj) {
dragging = false;
};
function moveSkewer(x, y) {
// Hem yatay hem dikeyde sınırla, kenarlara taşmasın
var halfWidth = skewer.width / 2;
var halfHeight = skewer.height / 2;
// Y ekseninde üst sınırı ekranın yarısı (halfHeight + 40 ile GAME_HEIGHT/2 - halfHeight arasında)
skewer.x = clamp(x, halfWidth + 40, GAME_WIDTH - halfWidth - 40);
skewer.y = clamp(y, GAME_HEIGHT / 2 + halfHeight, GAME_HEIGHT - halfHeight - 40);
}
// Oyun başında skor sıfırla
score = 0;
LK.setScore(0);
scoreTxt.setText(score);
// Oyun bittiğinde cleanup (LK.showGameOver çağrıldığında otomatik resetlenir)
bomba. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
köfte. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
dikey bir kebab şişi. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
domates. In-Game asset. 2d. High contrast. No shadows
biber. In-Game asset. 2d. High contrast. No shadows