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