User prompt
yazının dialogu background'ının dışına taşmamasını sağla.
User prompt
tamam şimdi bu dialogu background'ının içine “Agent Shadow, you’re active. The Light’s forces are hunting you. Stay unseen, move fast.” yazısını ekle
User prompt
chapter 1'i baştan yap bir dialogue background ekle ekrana scale'i 1 yap sadece bu olsun bunu yaptığını görebileyim
User prompt
chapter 1 introsundaki yazıları dialogue background'ın içine sığdır içinde yazsın şuan arkasında gözüküyor ve içine hiç sığdırılmış gibi de değil baya dışarıda
User prompt
chapter 1 introsundaki yazıyı küçült çok aşırı büyük şuan ve tek satırda yazmaya çalışmışsın dialoguebackground'a o yazıyı sığdır ve walkietalkie assetsini o diyalog backgroundının üstüne koy.
User prompt
chapter 1 introdaki yazılar çok büyük bu yazıları küçült ve renklerini siyah yap yazılar kalın olmak zorunda değil, ve ekrana tıklayıp devam ettikten sonra ekrandaki yazan chapter 1 yazısı ekranda değil lütfen ekrana ortala o yazıyı orta ve üstte olmasını sağla
User prompt
start game'e bastığımızda ekrana gelen walkie talki çok büyük ve yazılar çok büyük fakat background çok küçük bunun oranını düzelt
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'stroke')' in or related to this line: 'chapterTitle.style.stroke = "#fff";' Line Number: 451
User prompt
tamam şimdi chapter 1'i yapalım chapter 1'de start game butonuna bastığımızda eğer kullanıcının başka bir chapterda olduğunun verisi yoksa chapter 1'de başlayacak ve şimdi chapter 1'i anlatmaya başlıyorum: ekrana bir dialoguebackground assetsi gelir ve o background'ın sol üstünde walkietalkie assets'i bulunur ve dialoguebackground'ın içinde “Agent Shadow, you’re active. The Light’s forces are hunting you. Stay unseen, move fast.” yazar ve söyleyen kişinin adının yazacağı kısımda ??? yazar ve click to continue yazar sağ altında da ve tıklayarak diyalogu kapatırız. Ekranda o sıra beyaz ve kalın bir şekilde ekranın üstünde Chapter 1: Shadow’s Awakening yazar ve birkaç saniye durduktan sonra kaybolur ve 3 - 2 - 1 diye bir geri sayım olur ve etraftan oyunun başında yaptığımız oyuncuya yönelik mermiler oyuncuya yönelir 1 saniye aralarla 25 tane mermi gelir. şimdilik bu kadarını yap devamını sonra anlatacağım
User prompt
tamam logoyu 10 kat büyüttüm şimdi eski haline getirir misin logoyu yani scale'i 1 yapar mısın
User prompt
agent shadow logosunu 2 katı büyüt
User prompt
ana menüdeki agent shadow logosunu ve butonları 400 piksel aşağı taşı
User prompt
agent shadow logosu ve ekrandaki butonlar 200 piksel falan daha aşağıda olsun
User prompt
agent shadow logosu 5 kat daha büyük olsun ve aynı zamanda main menü için bir arka planımız olsun arka planı da assetsten mainmenubackground'ı kullan. bir de bir mainmenuwhite assetsi ekranın en üstünden en aşağısına en aşağısından en üstüne sürekli yukarı aşağı gidip dursun hem arka plan siyah hem logolar ve butonlar siyah ama o beyaz olan arka planla sani gölgeler açığa çıkıyormuş gibi gözükecek oyuna çok uygun olacak ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
seninle bir menü ekranı yapalım oyuncular oyuna ilk girdiğinde bu ekranla karşılaşsın buton arka planı olarak blackbutton assetsini kullan 3 farklı seçenek olsun, start game, endless run, reset game adında 3 farklı buton olack start game butonun basıldığında oyuncunun kaldığı chapter'dan itibaren devam edecek işte oyuna farklı farklı chapterlar yapacağız, endless run'da oyuncu keyfine göre skor yapana kadar sonsuza kadar ilerleyen bir oynanış olucak mermiye deyince elendiği falan, reset game ise oyuncu chapter 1'den oyuna tekrar başlamak isterse diye oyuncunun chapter'ını sıfırlayacak. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
karakterimizin arkasında efekt olarak 4 farklı konumda shadowbox gidip geldin karakterimiz bir gölgeymiş gibi gözükür.
User prompt
karakterimiz olarak shadow assetsi yerine shadowbox assetsini kullan ve karakterimizin gözleri olarak da shadowbox assetsinin içinde shadowredeye assetsini kullan
User prompt
Please fix the bug: 'Timeout.tick error: tween.to is not a function' in or related to this line: 'pulseTween = tween.to(bulletAsset, {' Line Number: 39 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Timeout.tick error: ChasingLightBullet is not defined' in or related to this line: 'var bullet = new ChasingLightBullet();' Line Number: 170
User prompt
Please fix the bug: 'Timeout.tick error: LightBullet is not defined' in or related to this line: 'var bullet = new LightBullet();' Line Number: 88
User prompt
Please fix the bug: 'Timeout.tick error: LightBullet is not defined' in or related to this line: 'var bullet = new LightBullet();' Line Number: 88
User prompt
Please fix the bug: 'Shadow is not defined' in or related to this line: 'var shadow = new Shadow();' Line Number: 29
User prompt
10 skordan sonra oyuncuyu takip eden ışık mermilerini getir o mermiler sürekli parlayıp sönsün
User prompt
oyuna ışık mermileri birbirine deydiğinde patlasınlar ve yokolsunlar.
User prompt
lightbullet şuan bir mermi şeklinde assets içeriyor fakat düzgün konumlanmıyor yani mermi yukarıya doğru bakıyor sürekli bunu düzelt merminin ucu assets'in yukarısına doğru bakıyor assetsin üst kısmının her zaman oyuncuya bakacak şekilde olmasını sağla
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
chapter: 1,
endlessHighScore: 0
});
/****
* Classes
****/
// Takipçi ışık mermisi (ChasingLightBullet) sınıfı
var ChasingLightBullet = Container.expand(function () {
var self = Container.call(this);
// Mermi grafiği
var bulletAsset = self.attachAsset('lightBullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Hız vektörü
self.speed = 10 + Math.random() * 3;
// Çarpışma kontrolü için son intersect durumu
self.lastIntersecting = false;
// Mermi boyutu
self.width = bulletAsset.width;
self.height = bulletAsset.height;
// Parlama animasyonu için tween
var pulseTween = null;
// Parlama animasyonu başlat
function startPulse() {
if (pulseTween) {
tween.stop(bulletAsset, {
alpha: true
});
pulseTween = null;
}
bulletAsset.alpha = 0.5 + Math.random() * 0.2;
// Tween ile alpha'yı 1'e çıkar, sonra tekrar 0.5-0.7 arası değere geri döndür, sonsuz döngü
function pulseUp() {
pulseTween = tween(bulletAsset, {
alpha: 1
}, {
duration: 350,
easing: tween.easeInOut,
onFinish: function onFinish() {
var min = 0.5,
max = 0.7;
var target = min + Math.random() * (max - min);
pulseTween = tween(bulletAsset, {
alpha: target
}, {
duration: 350,
easing: tween.easeInOut,
onFinish: pulseUp
});
}
});
}
pulseUp();
}
startPulse();
// Güncelleme fonksiyonu
self.update = function () {
// Son pozisyonları güncelle
if (self.lastX === undefined) self.lastX = self.x;
if (self.lastY === undefined) self.lastY = self.y;
// Hedefe doğru yönel
if (typeof shadow !== "undefined") {
var dx = shadow.x - self.x;
var dy = shadow.y - self.y;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
// Merminin ucunu oyuncuya bakacak şekilde döndür
self.rotation = angle + Math.PI / 2;
}
self.lastX = self.x;
self.lastY = self.y;
};
// Ekran dışına çıktı mı?
self.isOutOfBounds = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
// Yok edilirken animasyonu durdur
var _destroy = self.destroy;
self.destroy = function () {
if (pulseTween) pulseTween.stop();
_destroy.call(self);
};
return self;
});
// Işık mermisi (LightBullet) sınıfı
var LightBullet = Container.expand(function () {
var self = Container.call(this);
// Mermi grafiği
var bulletAsset = self.attachAsset('lightBullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Hız vektörü
self.speedX = 0;
self.speedY = 0;
// Çarpışma kontrolü için son intersect durumu
self.lastIntersecting = false;
// Mermi boyutu
self.width = bulletAsset.width;
self.height = bulletAsset.height;
// Mermi güncelleme fonksiyonu
self.update = function () {
// Son pozisyonları güncelle
if (self.lastX === undefined) self.lastX = self.x;
if (self.lastY === undefined) self.lastY = self.y;
self.x += self.speedX;
self.y += self.speedY;
self.lastX = self.x;
self.lastY = self.y;
};
// Ekran dışına çıktı mı?
self.isOutOfBounds = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
return self;
});
// Gölge karakter (Shadow) sınıfı
var Shadow = Container.expand(function () {
var self = Container.call(this);
// Gölge karakter grafiği olarak shadowbox kullan
var shadowBoxAsset = self.attachAsset('shadowbox', {
anchorX: 0.5,
anchorY: 0.5
});
// Gözler: shadowredeye assetini ekle
var eyeAsset = LK.getAsset('shadowredeye', {
anchorX: 0.5,
anchorY: 0.5
});
// Gözleri kutunun ortasına ve biraz yukarıya yerleştir
// shadowbox'ın yüksekliğine göre orantılı konumlandır
eyeAsset.x = 0;
eyeAsset.y = -shadowBoxAsset.height * 0.18;
// Gözleri kutunun içine ekle
self.addChild(eyeAsset);
// Yarıçapı döndür (kenar çarpışma için)
self.getRadius = function () {
// Kutu genişliğinin yarısı
return shadowBoxAsset.width / 2;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181a1b
});
/****
* Game Code
****/
// Oyun alanı boyutları
var GAME_W = 2048;
var GAME_H = 2732;
// Storage eklentisini başlat
// Menü ekranı için değişkenler
var menuContainer = null;
var menuButtons = [];
var menuActive = true;
var currentMode = null; // "chapter" veya "endless"
// Oyun içi değişkenler
var shadow = null;
var bullets = [];
var chasingBullets = [];
var score = 0;
var scoreTxt = null;
var dragNode = null;
var isGameActive = false;
var controlPanel = null;
var joystick = null;
var joystickRadius = 180 * 2;
var joystickKnobRadius = 60 * 1.2;
var isPanelActive = false;
var panelStartX = 0;
var panelStartY = 0;
var knobStartX = 0;
var knobStartY = 0;
var bulletInterval = 700;
var bulletTimer = null;
var chasingBulletInterval = 1200;
var chasingBulletTimer = null;
// Menü ekranı oluşturma fonksiyonu
function showMenu() {
menuActive = true;
isGameActive = false;
// Menü zaten varsa kaldır
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
menuButtons = [];
}
menuContainer = new Container();
// --- Main menu background (fills screen) ---
var bg = LK.getAsset('mainmenubackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: GAME_W,
height: GAME_H
});
menuContainer.addChild(bg);
// --- Animated white bar (mainmenuwhite) ---
var whiteBar = LK.getAsset('mainmenuwhite', {
anchorX: 0.5,
anchorY: 0,
x: GAME_W / 2,
y: 0,
width: GAME_W * 0.9,
height: 220
});
menuContainer.addChild(whiteBar);
// Animate whiteBar up and down forever
function animateWhiteBarDown() {
tween(whiteBar, {
y: GAME_H - whiteBar.height
}, {
duration: 2200,
easing: tween.easeInOut,
onFinish: animateWhiteBarUp
});
}
function animateWhiteBarUp() {
tween(whiteBar, {
y: 0
}, {
duration: 2200,
easing: tween.easeInOut,
onFinish: animateWhiteBarDown
});
}
animateWhiteBarDown();
// --- Logo (original scale, moved 400px down) ---
var logo = LK.getAsset('agentshadowlogo', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: 800,
scaleX: 1,
scaleY: 1
});
menuContainer.addChild(logo);
// Butonlar arası dikey boşluk
var btnSpacing = 80;
var btnW = 600;
var btnH = 180;
var startY = 1300; // 900 + 400
// Buton isimleri ve fonksiyonları
var btnDefs = [{
label: "Start Game",
onClick: function onClick() {
currentMode = "chapter";
menuActive = false;
menuContainer.visible = false;
startGameFromChapter();
}
}, {
label: "Endless Run",
onClick: function onClick() {
currentMode = "endless";
menuActive = false;
menuContainer.visible = false;
startEndlessRun();
}
}, {
label: "Reset Game",
onClick: function onClick() {
storage.chapter = 1;
// Geri bildirim için kısa bir animasyon veya renk değişimi yapılabilir
if (menuButtons[2] && menuButtons[2].bg) {
LK.effects.flashObject(menuButtons[2].bg, 0xff0000, 300);
}
}
}];
// Butonları oluştur
for (var i = 0; i < btnDefs.length; i++) {
var btnY = startY + i * (btnH + btnSpacing);
// Buton arka planı
var btnBg = LK.getAsset('blackbutton', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: btnY,
width: btnW,
height: btnH
});
// Buton metni
var btnText = new Text2(btnDefs[i].label, {
size: 80,
fill: "#fff"
});
btnText.anchor.set(0.5, 0.5);
btnText.x = GAME_W / 2;
btnText.y = btnY;
// Buton Container'ı
var btnContainer = new Container();
btnContainer.bg = btnBg;
btnContainer.addChild(btnBg);
btnContainer.addChild(btnText);
// Buton tıklama alanı
btnContainer.interactive = true;
btnContainer.buttonMode = true;
// Basit dokunma olayı
(function (def, btn) {
btnContainer.down = function (x, y, obj) {
if (!menuActive) return;
def.onClick();
};
})(btnDefs[i], btnContainer);
menuContainer.addChild(btnContainer);
menuButtons.push(btnContainer);
}
// Menü sahneye ekle
game.addChild(menuContainer);
}
// Menüden chapter modunda oyunu başlat
function startGameFromChapter() {
// Temizle
clearGameObjects();
// Chapter bilgisini storage'dan al
var chapter = storage.chapter || 1;
// Karakteri oluştur ve ortala
shadow = new Shadow();
shadow.x = GAME_W / 2;
shadow.y = GAME_H * 0.8;
game.addChild(shadow);
// Skor
score = 0;
if (scoreTxt) {
scoreTxt.destroy();
}
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
isGameActive = false; // Oyun başlatılmadan önce false
menuActive = false;
// --- CHAPTER 1 INTRO ---
// Sadece scale'i 1 olan bir dialogue background ekle
var dialogueBg = LK.getAsset('dialoguebackground', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_W / 2,
y: GAME_H / 2,
scaleX: 1,
scaleY: 1
});
game.addChild(dialogueBg);
// Chapter 1 intro dialogue text
var dialogueText = new Text2("Agent Shadow, you’re active. The Light’s forces are hunting you. Stay unseen, move fast.", {
size: 60,
fill: "#000"
});
// Metni kutunun içine sığdırmak için maxWidth ayarla
dialogueText.maxWidth = dialogueBg.width * 0.85;
// Anchor'ı üst-orta yap, kutunun içine hizala
dialogueText.anchor.set(0.5, 0);
// Y: kutunun üstünden biraz aşağıda başlasın (ör: 40px padding)
dialogueText.x = dialogueBg.x;
dialogueText.y = dialogueBg.y - dialogueBg.height / 2 + 40;
game.addChild(dialogueText);
// --- CHAPTER TITLE ve COUNTDOWN ---
function showChapterTitleAndCountdown() {
// Chapter başlığı
var chapterTitle = new Text2("Chapter 1: Shadow’s Awakening", {
size: 100,
fill: "#fff"
});
chapterTitle.anchor.set(0.5, 0);
chapterTitle.x = GAME_W / 2;
chapterTitle.y = 120;
game.addChild(chapterTitle);
// 2.5 saniye sonra başlık kaybolsun
LK.setTimeout(function () {
if (chapterTitle && !chapterTitle._destroyed) {
chapterTitle.destroy();
}
showCountdown();
}, 2500);
}
// --- 3-2-1 COUNTDOWN ---
function showCountdown() {
var countdownVals = [3, 2, 1];
var countdownText = new Text2("", {
size: 200,
fill: "#fff",
fontWeight: "bold"
});
countdownText.anchor.set(0.5, 0.5);
countdownText.x = GAME_W / 2;
countdownText.y = GAME_H / 2;
game.addChild(countdownText);
var idx = 0;
function nextCountdown() {
if (idx < countdownVals.length) {
countdownText.setText(countdownVals[idx]);
idx++;
LK.setTimeout(nextCountdown, 800);
} else {
countdownText.destroy();
startChapter1Bullets();
}
}
nextCountdown();
}
// --- CHAPTER 1: 25 mermi spawn ---
function startChapter1Bullets() {
isGameActive = true;
var bulletsFired = 0;
var maxBullets = 25;
var bulletInterval = 1000; // 1 saniye arayla
function fireBullet() {
if (!isGameActive) return;
spawnBullet();
bulletsFired++;
if (bulletsFired < maxBullets) {
LK.setTimeout(fireBullet, bulletInterval);
}
}
fireBullet();
// Takipçi mermiler chapter 1 başında gelmeyecek, normal bullet timer'ı başlatma
// startBulletTimer(); // Gerekirse ileride açılır
// startChasingBulletTimer(); // Gerekirse ileride açılır
}
}
// Endless Run başlat
function startEndlessRun() {
clearGameObjects();
// Karakteri oluştur ve ortala
shadow = new Shadow();
shadow.x = GAME_W / 2;
shadow.y = GAME_H * 0.8;
game.addChild(shadow);
// Skor
score = 0;
if (scoreTxt) {
scoreTxt.destroy();
}
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
isGameActive = true;
menuActive = false;
startBulletTimer();
startChasingBulletTimer();
}
// Oyun objelerini temizle
function clearGameObjects() {
// Karakteri sil
if (shadow) {
shadow.destroy();
shadow = null;
}
// Mermileri sil
for (var i = 0; i < bullets.length; i++) {
if (bullets[i]) bullets[i].destroy();
}
bullets = [];
for (var i = 0; i < chasingBullets.length; i++) {
if (chasingBullets[i]) chasingBullets[i].destroy();
}
chasingBullets = [];
// Skor metni sil
if (scoreTxt) {
scoreTxt.destroy();
scoreTxt = null;
}
// Joystick ve paneli sil
if (controlPanel) {
controlPanel.destroy();
controlPanel = null;
}
joystick = null;
isPanelActive = false;
dragNode = null;
joystickDirX = 0;
joystickDirY = 0;
joystickActive = false;
}
// Oyun ilk açıldığında menüyü göster
showMenu();
// Mermi oluşturma fonksiyonu
function spawnBullet() {
// Merminin çıkacağı kenarı rastgele seç (üst, alt, sol, sağ)
var edge = Math.floor(Math.random() * 4);
var bullet = new LightBullet();
var angle, startX, startY, targetX, targetY, speed;
// Hedef karakterin anlık pozisyonu
targetX = shadow.x;
targetY = shadow.y;
// Kenara göre başlangıç pozisyonu ve yönü belirle
if (edge === 0) {
// üst
startX = Math.random() * GAME_W;
startY = -bullet.height;
} else if (edge === 1) {
// sağ
startX = GAME_W + bullet.width;
startY = Math.random() * GAME_H;
} else if (edge === 2) {
// alt
startX = Math.random() * GAME_W;
startY = GAME_H + bullet.height;
} else {
// sol
startX = -bullet.width;
startY = Math.random() * GAME_H;
}
// Hedefe doğru vektör
var dx = targetX - startX;
var dy = targetY - startY;
angle = Math.atan2(dy, dx);
// Hız (her mermi için rastgele küçük bir varyasyon)
speed = 13 + Math.random() * 5;
bullet.x = startX;
bullet.y = startY;
bullet.speedX = Math.cos(angle) * speed;
bullet.speedY = Math.sin(angle) * speed;
// Merminin ucunu oyuncuya bakacak şekilde döndür
bullet.rotation = angle + Math.PI / 2;
bullets.push(bullet);
game.addChild(bullet);
}
// Takipçi mermi oluşturma fonksiyonu
function spawnChasingBullet() {
// Sadece skor 10 veya üstü ise oluştur
if (score < 10) return;
// Kenardan rastgele bir yerden başlat
var edge = Math.floor(Math.random() * 4);
var bullet = new ChasingLightBullet();
var startX, startY;
if (edge === 0) {
startX = Math.random() * GAME_W;
startY = -bullet.height;
} else if (edge === 1) {
startX = GAME_W + bullet.width;
startY = Math.random() * GAME_H;
} else if (edge === 2) {
startX = Math.random() * GAME_W;
startY = GAME_H + bullet.height;
} else {
startX = -bullet.width;
startY = Math.random() * GAME_H;
}
bullet.x = startX;
bullet.y = startY;
// Başlangıçta oyuncuya bakacak şekilde döndür
var dx = shadow.x - bullet.x;
var dy = shadow.y - bullet.y;
bullet.rotation = Math.atan2(dy, dx) + Math.PI / 2;
chasingBullets.push(bullet);
game.addChild(bullet);
}
// Mermi oluşturma zamanlayıcısı başlat
function startBulletTimer() {
if (bulletTimer) LK.clearInterval(bulletTimer);
bulletTimer = LK.setInterval(function () {
if (isGameActive) spawnBullet();
}, bulletInterval);
}
startBulletTimer();
// Takipçi mermi zamanlayıcısı başlat
function startChasingBulletTimer() {
if (chasingBulletTimer) LK.clearInterval(chasingBulletTimer);
chasingBulletTimer = LK.setInterval(function () {
if (isGameActive && score >= 10) spawnChasingBullet();
}, chasingBulletInterval);
}
startChasingBulletTimer();
// Skoru güncelle
function updateScore(val) {
score = val;
scoreTxt.setText(score);
}
// Oyun bittiğinde
function gameOver() {
isGameActive = false;
// Ekranı kırmızıya flashla
LK.effects.flashScreen(0xff2222, 800);
// Chapter modunda ise ilerlemeyi kaydet
if (currentMode === "chapter") {
// Skora göre chapter ilerletme örneği (ileride özelleştirilebilir)
if (score > 0) {
var nextChapter = (storage.chapter || 1) + 1;
storage.chapter = nextChapter;
}
}
// Endless modda high score zaten update'de kaydediliyor
// Oyun bitişini göster
LK.showGameOver();
// Kısa bir gecikmeden sonra menüyü tekrar göster
LK.setTimeout(function () {
showMenu();
}, 1200);
}
// Sürükleme işlemleri
// Joystick yönünü ve mesafesini globalde tut
var joystickDirX = 0;
var joystickDirY = 0;
var joystickActive = false;
function handleMove(x, y, obj) {
if (!isGameActive || menuActive) return;
if (isPanelActive && controlPanel && joystick) {
// Joystick merkezine göre delta
var dx = x - panelStartX;
var dy = y - panelStartY;
var dist = Math.sqrt(dx * dx + dy * dy);
// Knob'u panel sınırında tut
var maxDist = joystickRadius - joystickKnobRadius;
if (dist > maxDist) {
var angle = Math.atan2(dy, dx);
dx = Math.cos(angle) * maxDist;
dy = Math.sin(angle) * maxDist;
}
joystick.x = dx;
joystick.y = dy;
// Joystick yönünü ve oranını kaydet
if (dist > 10) {
// ölü bölge
joystickDirX = dx / maxDist;
joystickDirY = dy / maxDist;
joystickActive = true;
} else {
joystickDirX = 0;
joystickDirY = 0;
joystickActive = false;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (!isGameActive || menuActive) return;
// Kontrol paneli zaten varsa kaldır
if (controlPanel) {
controlPanel.destroy();
controlPanel = null;
joystick = null;
isPanelActive = false;
}
// Kontrol panelini oluştur
controlPanel = new Container();
controlPanel.x = x;
controlPanel.y = y;
// Panel arka planı (şeffaf daire)
var panelBg = LK.getAsset('centerCircle', {
width: joystickRadius * 2,
height: joystickRadius * 2,
color: 0x222222,
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.25
});
controlPanel.addChild(panelBg);
// Joystick knob'u (küçük daire)
joystick = LK.getAsset('centerCircle', {
width: joystickKnobRadius * 2,
height: joystickKnobRadius * 2,
color: 0xffffff,
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
joystick.x = 0;
joystick.y = 0;
controlPanel.addChild(joystick);
// Paneli oyuna ekle
game.addChild(controlPanel);
isPanelActive = true;
panelStartX = x;
panelStartY = y;
knobStartX = 0;
knobStartY = 0;
};
game.up = function (x, y, obj) {
if (menuActive) return;
// Kontrol panelini kaldır
if (controlPanel) {
controlPanel.destroy();
controlPanel = null;
joystick = null;
isPanelActive = false;
}
dragNode = null;
// Joystick bırakıldığında hareketi durdur
joystickDirX = 0;
joystickDirY = 0;
joystickActive = false;
};
// Oyun güncelleme döngüsü
game.update = function () {
if (!isGameActive || menuActive) return;
// Karakteri joystick yönünde sürekli hareket ettir
if (joystickActive) {
var moveSpeed = 22;
shadow.x += joystickDirX * moveSpeed;
shadow.y += joystickDirY * moveSpeed;
var r = shadow.getRadius();
if (shadow.x < r) shadow.x = r;
if (shadow.x > GAME_W - r) shadow.x = GAME_W - r;
if (shadow.y < r) shadow.y = r;
if (shadow.y > GAME_H - r) shadow.y = GAME_H - r;
}
// Mermileri güncelle
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
b.update();
if (b.isOutOfBounds()) {
b.destroy();
bullets.splice(i, 1);
continue;
}
var intersecting = b.intersects(shadow);
if (!b.lastIntersecting && intersecting) {
// Oyun biter
gameOver();
return;
}
b.lastIntersecting = intersecting;
}
// Takipçi mermileri güncelle
for (var i = chasingBullets.length - 1; i >= 0; i--) {
var cb = chasingBullets[i];
cb.update();
if (cb.isOutOfBounds()) {
cb.destroy();
chasingBullets.splice(i, 1);
continue;
}
var intersecting = cb.intersects(shadow);
if (!cb.lastIntersecting && intersecting) {
gameOver();
return;
}
cb.lastIntersecting = intersecting;
}
// Işık mermileri birbirine çarptı mı kontrol et ve patlat
for (var i = bullets.length - 1; i >= 0; i--) {
var b1 = bullets[i];
for (var j = i - 1; j >= 0; j--) {
var b2 = bullets[j];
if (!b1._destroyed && !b2._destroyed && b1.intersects(b2)) {
b1.destroy();
b2.destroy();
bullets.splice(i, 1);
bullets.splice(j, 1);
i--;
break;
}
}
}
// Takipçi mermiler ile normal mermiler çarpışırsa patlat
for (var i = chasingBullets.length - 1; i >= 0; i--) {
var cb = chasingBullets[i];
for (var j = bullets.length - 1; j >= 0; j--) {
var b = bullets[j];
if (!cb._destroyed && !b._destroyed && cb.intersects(b)) {
cb.destroy();
b.destroy();
chasingBullets.splice(i, 1);
bullets.splice(j, 1);
i--;
break;
}
}
}
// Takipçi mermiler birbirine çarparsa patlat
for (var i = chasingBullets.length - 1; i >= 0; i--) {
var cb1 = chasingBullets[i];
for (var j = i - 1; j >= 0; j--) {
var cb2 = chasingBullets[j];
if (!cb1._destroyed && !cb2._destroyed && cb1.intersects(cb2)) {
cb1.destroy();
cb2.destroy();
chasingBullets.splice(i, 1);
chasingBullets.splice(j, 1);
i--;
break;
}
}
}
// Skoru güncelle (hayatta kalma süresi)
if (LK.ticks % 30 === 0) {
updateScore(score + 1);
// Endless modda high score kaydet
if (currentMode === "endless" && score > (storage.endlessHighScore || 0)) {
storage.endlessHighScore = score;
}
}
};
// Oyun yeniden başladığında sıfırla
game.on('reset', function () {
// Tüm oyun objelerini temizle
clearGameObjects();
// Menüye dön
showMenu();
}); ===================================================================
--- original.js
+++ change.js
@@ -362,13 +362,15 @@
var dialogueText = new Text2("Agent Shadow, you’re active. The Light’s forces are hunting you. Stay unseen, move fast.", {
size: 60,
fill: "#000"
});
- dialogueText.anchor.set(0.5, 0.5);
- // Ortalamak ve kutuya sığdırmak için konumlandır
- dialogueText.x = dialogueBg.x;
- dialogueText.y = dialogueBg.y;
+ // Metni kutunun içine sığdırmak için maxWidth ayarla
dialogueText.maxWidth = dialogueBg.width * 0.85;
+ // Anchor'ı üst-orta yap, kutunun içine hizala
+ dialogueText.anchor.set(0.5, 0);
+ // Y: kutunun üstünden biraz aşağıda başlasın (ör: 40px padding)
+ dialogueText.x = dialogueBg.x;
+ dialogueText.y = dialogueBg.y - dialogueBg.height / 2 + 40;
game.addChild(dialogueText);
// --- CHAPTER TITLE ve COUNTDOWN ---
function showChapterTitleAndCountdown() {
// Chapter başlığı
gri bir yuvarlak. In-Game asset. 2d. High contrast. No shadows
white bullet. In-Game asset. 2d. High contrast. No shadows
kırmızı gözler, gözler sadece kırmızı, gözden başka hiçbir şey olmayacak ve 2 tane göz olacak yan yana aynı boyutta, dümdüz kırmızı gözleri ekstra efekt yok, yazı yok, gözler dikine dikdörtgen şeklinde olacak gerçek göz gibi olmayacaklar, gözlerin boşlukları olmayacak gözler köşeli olacak dikine dikdörtgen ve köşeli. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
white color circle. In-Game asset. 2d. High contrast. No shadows
rectangle with rounded edges (color white) (the edges will white too). In-Game asset. 2d. High contrast. No shadows
black walkie talkie. In-Game asset. 2d. High contrast. No shadows
only text no image, agent shadow text logo for agent game. In-Game asset. 2d. High contrast. No shadows
black rectangle (rounded corners). In-Game asset. 2d. High contrast. No shadows
lock icon. no text. only white color. In-Game asset. 2d. High contrast. No shadows
ünlem işareti kırmızı. In-Game asset. 2d. High contrast. No shadows
game skill logo, skill name is "shadow". no text. only image.. In-Game asset. 2d. High contrast. No shadows