User prompt
Headbarlar yukarıda arkaplanın sol üst ve şag üstünde olsunlar.
User prompt
Bot oyuncu daha saldırgan olsun ve oyuncular her round başında ilk pozisyona geri dönsünler. Round bitiminde hareket etmesinler.
User prompt
Oyuncular yarım kat büyük olsun.
User prompt
Yazılar çok kalın olsun
User prompt
Tüm yazılara ve oyunculara gölge ekler misin
User prompt
Önce round 1 yazsın 2 sn sonra fight yazsın 2 sn beklesin ekranda. İlk round bitince kim kazandıysa onu 2sn yazsın ve round 2 yazsın. Tekrar kazanan 2sn yazsın eger 3.round olursa final round yazsın 2sn ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Önce round 1 yazsın 2 sn sonra fight yazsın 3 sn beklesin ekranda ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Tüm ekrandaki yazılar daha kalın fontla ve 2 sn kalsın ve titreme efektinden sonra kaybolsun. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Yazılar 1 saniye kalsın ekranda
User prompt
Kirmızı kazandı mavi kazandı ingilizce yazsın ve daha belirgin yazsın
User prompt
Oyun 3 round dan oluşsun 2 galibiyet alan taraf kazansın. Her bir round sonunda oyuncu kazanırsa kırmızı kazandı bot kazanırsa mavi kazandı yazsın
User prompt
Hit alan dövüşçü geriye doğru bir adım kaçsın. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hit alan dövüşçü kırmızı flash yapip titresin. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
FIGHT yazısı daha kalın font ve beyaz olsun. Arkaplan biraz soluk olsun.
User prompt
Fartırlara hareket efekti ekle.
User prompt
Darbe başına cooldown daha uzun olsun
User prompt
Her darbede bir can azalsın ancak bir sonraki darbe için hemen devreye girmesin.
User prompt
Beş canı tek tek azalsın.
User prompt
Iplamayı 0.5 saniyeye düşür.
User prompt
Rakip oyuncuya basınca ona vurmuş sayılalım.
User prompt
Zıpladığımızda bir saniye havada kalalım.
User prompt
Rakip oyuncu üzerimize doğru gelsin.
User prompt
Oyuncuları dokunduğumuz an oyuncular zıplasın.
User prompt
Zıplama sonrası 2 saniye yukarıda kalsın.
User prompt
Rakip takımdaki oyunculara rahatça vurabilelim. Yani...
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Dövüşçü sınıfı var Fighter = Container.expand(function (assetId) { var self = Container.call(this); // Özellikler self.hp = 100; self.isAttacking = false; self.isDefending = false; self.isPlayer = false; // Oyuncu mu, rakip mi self.attackCooldown = 0; self.defendCooldown = 0; self.assetId = assetId || 'fighter1'; // default to 'fighter1' if not provided // Görsel self.body = self.attachAsset(self.assetId, { anchorX: 0.5, anchorY: 1 }); // 5 kalpli can barı (kafanın üstünde) self.hearts = []; for (var i = 0; i < 5; i++) { var heart = self.addChild(LK.getAsset('headBar', { width: 60, height: 60, color: 0xef4244, anchorX: 0.5, anchorY: 1, x: (i - 2) * 70, y: -self.body.height - 40 })); self.hearts.push(heart); } // Saldırı animasyonu self.attackAnim = function () { if (self.isAttacking || self.attackCooldown > 0) return; self.isAttacking = true; self.attackCooldown = 30; // 0.5 sn var oldX = self.x; var targetX = self.x + (self.isPlayer ? 80 : -80); tween(self, { x: targetX }, { duration: 120, easing: tween.cubicOut, onFinish: function onFinish() { tween(self, { x: oldX }, { duration: 120, easing: tween.cubicIn, onFinish: function onFinish() { self.isAttacking = false; } }); } }); }; // Savunma animasyonu self.defendAnim = function () { if (self.isDefending || self.defendCooldown > 0) return; self.isDefending = true; self.defendCooldown = 40; // 0.66 sn tween(self.body, { scaleX: 1.2, scaleY: 0.8 }, { duration: 100, easing: tween.easeIn, onFinish: function onFinish() { tween(self.body, { scaleX: 1, scaleY: 1 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { self.isDefending = false; } }); } }); }; // Hasar alma self.takeHit = function (amount) { if (self.isDefending) { amount = Math.floor(amount / 2); } self.hp -= amount; if (self.hp < 0) self.hp = 0; self.updateHpBar(); LK.effects.flashObject(self.body, 0xffffff, 120); // Vuruş sesi: oyuncu ve rakip için farklı sesler if (self.assetId === 'fighter1') { LK.getSound('hit1').play(); } else { LK.getSound('hit2').play(); } }; // Can barını güncelle self.updateHpBar = function () { // 5 cana böl, kalan cana göre kalpleri göster/gizle var heartsToShow = Math.ceil(self.hp / 20); for (var i = 0; i < 5; i++) { self.hearts[i].alpha = i < heartsToShow ? 1 : 0.2; } }; // Zıplama animasyonu ve durumu self.isJumping = false; self.jumpVy = 0; self.jumpBaseY = 0; self.jumpAnim = function () { if (self.isJumping || self.isAttacking || self.isDefending) return; self.isJumping = true; self.jumpVy = -38; // ilk yukarı hız self.jumpBaseY = self.y; self.jumpHoldTimer = 0; // 2 saniye havada kalma sayacı self.jumpState = "up"; // "up", "hold", "down" }; self.update = function () { if (self.attackCooldown > 0) self.attackCooldown--; if (self.defendCooldown > 0) self.defendCooldown--; // Zıplama güncellemesi if (self.isJumping) { if (self.jumpState === "up") { self.y += self.jumpVy; self.jumpVy += 4; // yerçekimi if (self.jumpVy >= 0) { // Tepeye ulaştı, 0.5 saniye havada kal self.jumpState = "hold"; self.jumpHoldTimer = 30; // 0.5 saniye (60 FPS * 0.5) self.jumpVy = 0; } } else if (self.jumpState === "hold") { self.jumpHoldTimer--; // Havada sabit kal if (self.jumpHoldTimer <= 0) { self.jumpState = "down"; self.jumpVy = 4; // Aşağıya düşmeye başla } } else if (self.jumpState === "down") { self.y += self.jumpVy; self.jumpVy += 4; // yerçekimi if (self.y >= self.jumpBaseY) { self.y = self.jumpBaseY; self.isJumping = false; self.jumpVy = 0; self.jumpState = undefined; self.jumpHoldTimer = 0; } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x333333 }); /**** * Game Code ****/ // Dövüşçü 1: Kırmızı kutu, Dövüşçü 2: Mavi kutu, Arenanın zemini: Geniş sarı kutu, "Fight" için: büyük metin // Arena zemini ve dekor var arenaFloor = LK.getAsset('arenaFloor', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2200 }); game.addChild(arenaFloor); // Ejderha dekorları (üstte ve altta) var dragonTop = LK.getAsset('dragonDeco', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 80 }); var dragonBottom = LK.getAsset('dragonDeco', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2732 - 80 }); game.addChild(dragonTop); game.addChild(dragonBottom); // Dövüşçüler var fighter1 = new Fighter('fighter1'); fighter1.isPlayer = true; // Oyuncuları birbirinden uzakta başlat fighter1.x = 2048 / 2 - 400; fighter1.y = 2200; game.addChild(fighter1); var fighter2 = new Fighter('fighter2'); fighter2.isPlayer = false; fighter2.x = 2048 / 2 + 400; fighter2.y = 2200; game.addChild(fighter2); // assetId'yi constructor parametresi olarak verelim ve Fighter class'ında kullanalım // "Fight" yazısı var fightText = new Text2('FIGHT', { size: 260, fill: 0xFFFFFF, font: "900 300px 'Arial Black', Impact, Tahoma, Arial, sans-serif" }); fightText.anchor.set(0.5, 0.5); fightText.x = 2048 / 2; fightText.y = 900; game.addChild(fightText); // "Fight" yazısını fade out ile kaldır tween(fightText, { alpha: 0 }, { duration: 1200, easing: tween.cubicIn, onFinish: function onFinish() { fightText.destroy(); } }); // Skor ve can göstergesi (GUI) -- kaldırıldı, can barı kafanın üstünde // Oyun durumu var gameState = 'playing'; // 'playing', 'over' var dragFighter = null; var dragOffsetX = 0; var dragOffsetY = 0; // Dokunma/sürükleme ile oyuncu karakterini hareket ettir game.down = function (x, y, obj) { // Multiplayer ise hangi oyuncunun dokunduğunu tespit et var playerIdx = 0; if (isMultiplayer && obj && typeof obj.playerIndex === "number") { playerIdx = obj.playerIndex; } // Sadece oyuncu karakterine dokunulduysa sürükle var local1 = fighter1.toLocal(game.toGlobal({ x: x, y: y })); var local2 = fighter2.toLocal(game.toGlobal({ x: x, y: y })); if (!isMultiplayer) { if (local1.x > -fighter1.body.width / 2 && local1.x < fighter1.body.width / 2 && local1.y > -fighter1.body.height && local1.y < 0) { dragFighter = fighter1; dragOffsetX = fighter1.x - x; dragOffsetY = fighter1.y - y; dragFighter.lastMoveY = y; } } else { // Multiplayer: iki oyuncu karşılıklı if (playerIdx === 0 && local1.x > -fighter1.body.width / 2 && local1.x < fighter1.body.width / 2 && local1.y > -fighter1.body.height && local1.y < 0) { dragFighter = fighter1; dragOffsetX = fighter1.x - x; dragOffsetY = fighter1.y - y; dragFighter.lastMoveY = y; } else if (playerIdx === 1 && local2.x > -fighter2.body.width / 2 && local2.x < fighter2.body.width / 2 && local2.y > -fighter2.body.height && local2.y < 0) { dragFighter = fighter2; dragOffsetX = fighter2.x - x; dragOffsetY = fighter2.y - y; dragFighter.lastMoveY = y; } } }; game.move = function (x, y, obj) { var playerIdx = 0; if (isMultiplayer && obj && typeof obj.playerIndex === "number") { playerIdx = obj.playerIndex; } if (dragFighter && gameState === 'playing') { // Sadece yatay eksende hareket etsin, arenadan çıkmasın var minX, maxX; if (!isMultiplayer || isMultiplayer && dragFighter === fighter1) { minX = 2048 / 2 - 700; maxX = 2048 / 2 - 100; } else { // Multiplayer ve fighter2 ise sağ tarafı sınırla minX = 2048 / 2 + 100; maxX = 2048 / 2 + 700; } var newX = x + dragOffsetX; if (newX < minX) newX = minX; if (newX > maxX) newX = maxX; dragFighter.x = newX; // Yukarıya doğru hızlı bir sürükleme ile zıpla if (typeof dragFighter.lastMoveY === "undefined") dragFighter.lastMoveY = y; var dy = dragFighter.lastMoveY - y; if (dy > 120 && !dragFighter.isJumping) { // hızlıca yukarı çekildi dragFighter.jumpAnim(); } dragFighter.lastMoveY = y; } }; game.up = function (x, y, obj) { if (dragFighter) { dragFighter.lastMoveY = undefined; } dragFighter = null; }; // Oyuncu saldırı ve savunma: ekrana çift dokunma saldırı, uzun basma savunma var lastTap = [0, 0]; var tapTimeout = [null, null]; var longPressTimeout = [null, null]; game.down = function (x, y, obj) { // Multiplayer ise hangi oyuncunun dokunduğunu tespit et var playerIdx = 0; if (isMultiplayer && obj && typeof obj.playerIndex === "number") { playerIdx = obj.playerIndex; } // Sürükleme için var local1 = fighter1.toLocal(game.toGlobal({ x: x, y: y })); var local2 = fighter2.toLocal(game.toGlobal({ x: x, y: y })); if (!isMultiplayer) { if (local1.x > -fighter1.body.width / 2 && local1.x < fighter1.body.width / 2 && local1.y > -fighter1.body.height && local1.y < 0) { dragFighter = fighter1; dragOffsetX = fighter1.x - x; dragOffsetY = fighter1.y - y; // Dokunulduğu anda zıpla fighter1.jumpAnim(); } // Saldırı: çift dokunma var now = Date.now(); if (now - lastTap[0] < 350) { // Çift dokunma: saldırı fighter1.attackAnim(); tapTimeout[0] && LK.clearTimeout(tapTimeout[0]); } else { // Uzun basma: savunma longPressTimeout[0] = LK.setTimeout(function () { fighter1.defendAnim(); }, 400); tapTimeout[0] = LK.setTimeout(function () {}, 350); } lastTap[0] = now; } else { // Multiplayer: iki oyuncu karşılıklı if (playerIdx === 0 && local1.x > -fighter1.body.width / 2 && local1.x < fighter1.body.width / 2 && local1.y > -fighter1.body.height && local1.y < 0) { dragFighter = fighter1; dragOffsetX = fighter1.x - x; dragOffsetY = fighter1.y - y; // Dokunulduğu anda zıpla fighter1.jumpAnim(); } else if (playerIdx === 1 && local2.x > -fighter2.body.width / 2 && local2.x < fighter2.body.width / 2 && local2.y > -fighter2.body.height && local2.y < 0) { dragFighter = fighter2; dragOffsetX = fighter2.x - x; dragOffsetY = fighter2.y - y; // Dokunulduğu anda zıpla fighter2.jumpAnim(); } // Saldırı: çift dokunma var now = Date.now(); if (now - lastTap[playerIdx] < 350) { // Çift dokunma: saldırı if (playerIdx === 0) { fighter1.attackAnim(); } else { fighter2.attackAnim(); } tapTimeout[playerIdx] && LK.clearTimeout(tapTimeout[playerIdx]); } else { // Uzun basma: savunma longPressTimeout[playerIdx] = LK.setTimeout(function () { if (playerIdx === 0) { fighter1.defendAnim(); } else { fighter2.defendAnim(); } }, 400); tapTimeout[playerIdx] = LK.setTimeout(function () {}, 350); } lastTap[playerIdx] = now; } }; game.up = function (x, y, obj) { dragFighter = null; var playerIdx = 0; if (isMultiplayer && obj && typeof obj.playerIndex === "number") { playerIdx = obj.playerIndex; } if (longPressTimeout[playerIdx]) { LK.clearTimeout(longPressTimeout[playerIdx]); longPressTimeout[playerIdx] = null; } }; // Multiplayer kontrolü için oyuncu sayısı tespiti var isMultiplayer = false; if (typeof LK.getPlayerCount === "function") { // Eğer multiplayer plugin'i varsa, oyuncu sayısını al isMultiplayer = LK.getPlayerCount() > 1; } // Rakip AI: basit saldırı/savunma döngüsü (tek oyunculu modda aktif) var aiTimer = 0; var aiState = 'idle'; // 'idle', 'attack', 'defend' function aiUpdate() { if (gameState !== 'playing') return; if (isMultiplayer) return; // Multiplayer ise AI devre dışı aiTimer--; // Oyuncuya yaklaşma davranışı var distance = fighter2.x - fighter1.x; if (Math.abs(distance) > 260) { // Saldırı menziline girmediyse oyuncuya yaklaş var moveSpeed = 16; // Zıplamıyorsa hareket etsin if (!fighter2.isJumping && !fighter2.isAttacking && !fighter2.isDefending) { // Hedef pozisyonu hesapla var targetX = fighter2.x - moveSpeed; if (targetX < 2048 / 2 + 100) targetX = 2048 / 2 + 100; if (targetX > 2048 / 2 + 700) targetX = 2048 / 2 + 700; // Tween ile yumuşak hareket tween(fighter2, { x: targetX }, { duration: 80, easing: tween.cubicOut }); } aiTimer = 8; // Daha sık güncelle } else { // Saldırı/savunma döngüsü if (aiTimer <= 0) { var r = Math.random(); if (r < 0.5) { // Saldırı fighter2.attackAnim(); aiState = 'attack'; aiTimer = 60 + Math.floor(Math.random() * 30); } else { // Savunma fighter2.defendAnim(); aiState = 'defend'; aiTimer = 80 + Math.floor(Math.random() * 40); } } } } // Saldırı çarpışma kontrolü function checkAttack() { // Oyuncu saldırısı if (fighter1.isAttacking && Math.abs(fighter1.x - fighter2.x) < 260) { if (!fighter2.isDefending && fighter2.attackCooldown <= 0) { fighter2.takeHit(18); fighter2.attackCooldown = 60; // 60 frame (~1s) cooldown, previously 20 } else if (fighter2.isDefending && fighter2.attackCooldown <= 0) { fighter2.takeHit(9); fighter2.attackCooldown = 60; } } // Rakip saldırısı if (fighter2.isAttacking && Math.abs(fighter1.x - fighter2.x) < 260) { if (!fighter1.isDefending && fighter1.attackCooldown <= 0) { fighter1.takeHit(18); fighter1.attackCooldown = 60; } else if (fighter1.isDefending && fighter1.attackCooldown <= 0) { fighter1.takeHit(9); fighter1.attackCooldown = 60; } } } // Oyun güncellemesi game.update = function () { if (gameState !== 'playing') return; fighter1.update(); fighter2.update(); aiUpdate(); checkAttack(); // Can göstergelerini güncelle -- kaldırıldı, can barı kafanın üstünde // Kazananı kontrol et if (fighter1.hp <= 0 && gameState === 'playing') { gameState = 'over'; LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } if (fighter2.hp <= 0 && gameState === 'playing') { gameState = 'over'; LK.effects.flashScreen(0x00ff00, 1000); LK.showYouWin(); } };
===================================================================
--- original.js
+++ change.js
@@ -162,16 +162,16 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x1a1a1a
+ backgroundColor: 0x333333
});
/****
* Game Code
****/
-// Arena zemini ve dekor
// Dövüşçü 1: Kırmızı kutu, Dövüşçü 2: Mavi kutu, Arenanın zemini: Geniş sarı kutu, "Fight" için: büyük metin
+// Arena zemini ve dekor
var arenaFloor = LK.getAsset('arenaFloor', {
anchorX: 0.5,
anchorY: 1,
x: 2048 / 2,
@@ -208,10 +208,10 @@
// assetId'yi constructor parametresi olarak verelim ve Fighter class'ında kullanalım
// "Fight" yazısı
var fightText = new Text2('FIGHT', {
size: 260,
- fill: 0xFFCC00,
- font: "Impact, 'Arial Black', Tahoma"
+ fill: 0xFFFFFF,
+ font: "900 300px 'Arial Black', Impact, Tahoma, Arial, sans-serif"
});
fightText.anchor.set(0.5, 0.5);
fightText.x = 2048 / 2;
fightText.y = 900;