User prompt
Tüm pozlarda bacak hareketlerini tekrar olustur
User prompt
Tüm pozları tekrar güncelle
User prompt
Üst bacakları yukarda kalça ile vücuda aşağıda diz ile alt bacaklara bağla.
User prompt
Bacakları birbiriyle dizde birlestir. Tüm pozlarda bacak hareketlerini sil.
User prompt
Tüm pozlarda bacakların ik pozisyon ve bağlantı larini resetle
User prompt
Üst bacaklar saga sola aç.
User prompt
Zıplama ve oturma pozlarında ust bacaklar yer değiştirmesin.
User prompt
Ust Bacakları bir ucu kalcayla bir ucunu dizle bağla
User prompt
Bacakları sağa sola biraz aç.
User prompt
Bacakkarı varsayılan pozda aşağıya sal.
User prompt
Tüm pozları guncelle
User prompt
Urt bacakların kalça bağlantısını kes
User prompt
Dizlerin bağlantısını kopar ve dizleri ust bacak ucuna taşı.
User prompt
Alt bacakların ust ucu ile ust bacakların alt uclarini birbirine ayni hizada bagla
User prompt
Sol bacağin üst ucunu ust bacaga yapıstir
User prompt
Ust bacakları ile alt bacakları dizlerle birbirine bagla.
User prompt
Üst bacakların ve alt bacakların tum bağlantılarıni kes
User prompt
Alt bacakları üst bacaklarla aynı hizaya al.
User prompt
Dizleri alt bacak ucuna taşı
User prompt
Dizleri ust bacak ucuna taşı
User prompt
Dizlerin tüm bağlantısını kes ve biraz uzaga taşı
User prompt
İlk pozda Alt bacakları üst bacaklarla aynı hizada yap
User prompt
Dizleri üst bacagin hizasına taşı
User prompt
Üst bacakları kalçadan ayir
User prompt
Üst bacakları swap yap
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Drum class var Drum = Container.expand(function () { var self = Container.call(this); self.drumType = 'none'; // 'large', 'left', 'right', 'sit', 'stand' self.action = null; // function to call on tap // Set up drum asset self.setDrum = function (type) { self.drumType = type; var assetId = type === 'large' ? 'drum_large' : 'drum_medium'; var drum = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // (Drum label removed) }; // Drum tap effect self.flash = function () { tween(self, { scaleX: 1.18, scaleY: 0.92 }, { duration: 80, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 120 }); } }); }; // Touch event self.down = function (x, y, obj) { self.flash(); // Play unique sound for each drum type if (self.drumType === 'large') { LK.getSound('drum_tap_center').play(); } else if (self.drumType === 'left') { // Play with very long reverb effect if (typeof reverb !== "undefined" && reverb.add) { var leftSound = LK.getSound('drum_tap_left'); reverb.add(leftSound, { reverbTime: 3.5 }); // simulate very long reverb (if plugin supports param) leftSound.play(); } else { LK.getSound('drum_tap_left').play(); } } else if (self.drumType === 'right') { // Play with very long reverb effect if (typeof reverb !== "undefined" && reverb.add) { var rightSound = LK.getSound('drum_tap_right'); reverb.add(rightSound, { reverbTime: 3.5 }); // simulate very long reverb (if plugin supports param) rightSound.play(); } else { LK.getSound('drum_tap_right').play(); } } else if (self.drumType === 'sit') { var sitSound = LK.getSound('drum_tap_sit'); sitSound.play(); LK.setTimeout(function () { sitSound.play(); }, 120); } else if (self.drumType === 'stand') { // Play the sound with 3 fast delay effects (echoes) var base = LK.getSound('drum_tap_stand'); base.play(); LK.setTimeout(function () { base.play(); }, 45); LK.setTimeout(function () { base.play(); }, 90); } else { // No fallback sound } if (self.action) self.action(); }; return self; }); // Puppet class: articulated body with simple kinematics var Puppet = Container.expand(function () { var self = Container.call(this); // --- Body part sizes (for positioning) --- var headH = 120 * 1.5, headW = 120 * 1.5; var bodyH = 200 * 1.5, bodyW = 80 * 1.5; var upperArmH = 100 * 1.5, upperArmW = 40 * 1.5; var lowerArmH = 90 * 1.5, lowerArmW = 32 * 1.5; var upperLegH = 120 * 1.5, upperLegW = 48 * 1.5; var lowerLegH = 110 * 1.5, lowerLegW = 40 * 1.5; // --- Create body parts --- // Head var head = self.attachAsset('puppet_head', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Neck (between head and body, sized to match hip) var neck = self.attachAsset('puppet_neck', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, // match hip scale scaleY: 1.5 }); // Shoulders (left and right) var lShoulder = self.attachAsset('puppet_shoulder', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); var rShoulder = self.attachAsset('puppet_shoulder', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Body var body = self.attachAsset('puppet_body', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Single hip (center) var hip = self.attachAsset('puppet_hip', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Left upper arm var lUpperArm = self.attachAsset('puppet_upperarm', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Left elbow var lElbow = self.attachAsset('puppet_elbow', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Left lower arm var lLowerArm = self.attachAsset('puppet_lowerarm', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Right upper arm var rUpperArm = self.attachAsset('puppet_upperarm', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Right elbow var rElbow = self.attachAsset('puppet_elbow', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Right lower arm var rLowerArm = self.attachAsset('puppet_lowerarm', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Left upper leg var lUpperLeg = self.attachAsset('puppet_upperleg', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Left knee var lKnee = self.attachAsset('puppet_knee', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Left lower leg var lLowerLeg = self.attachAsset('puppet_lowerleg', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Right upper leg var rUpperLeg = self.attachAsset('puppet_upperleg', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // Right knee var rKnee = self.attachAsset('puppet_knee', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Right lower leg var rLowerLeg = self.attachAsset('puppet_lowerleg', { anchorX: 0.5, anchorY: 0, scaleX: 1.5, scaleY: 1.5 }); // --- Initial pose state --- self.state = { vx: 0, // horizontal velocity vy: 0, // vertical velocity grounded: false, pose: 'stand', // 'stand', 'sit', 'jump' headAngle: 0, // radians, for "pull head" actions x: 0, // world position y: 0 }; // --- Positioning offsets (relative to puppet center) --- function updateBodyParts() { // Head head.x = 0; // Move head higher above the neck for a more natural look (was +10, now -30 for more separation) head.y = -bodyH / 2 - headH / 2 - 30; head.rotation = self.state.headAngle; // Neck: place between head and body, sized to match hip // Use hip asset size for neck size/placement var hipH = 44 * 1.5; // puppet_hip height * scale var neckH = hipH; neck.x = 0; neck.y = -bodyH / 2 - neckH / 2 + 38; // 38 is a small offset to visually connect neck, adjust as needed neck.rotation = 0; // Body body.x = 0; body.y = -bodyH / 2; // Arms var armY = -bodyH / 2 + 30; var armX = bodyW / 2 + upperArmW / 2 - 10; // Shoulder positions var lShoulderX = -armX; var lShoulderY = armY; var rShoulderX = armX; var rShoulderY = armY; // Place shoulder assets at shoulder positions lShoulder.x = lShoulderX; lShoulder.y = lShoulderY; rShoulder.x = rShoulderX; rShoulder.y = rShoulderY; // --- Improved arm and leg kinematics --- // Default arm pose angles (arms down) var lUpperArmAngle = 0.0; // 0deg, left arm down var rUpperArmAngle = 0.0; // 0deg, right arm down var lLowerArmAngle = 0; // straight var rLowerArmAngle = 0; // straight // Default leg positions (legs always joined at knee, no movement) var hipX = 0; var hipY = bodyH / 2 - 10; var kneeX = hipX; var kneeY = hipY + upperLegH; // --- POSE LOGIC --- // Arms if (self.state.pose === 'sit') { // Kollar öne doğru bükülmüş, oturma pozunda lUpperArmAngle = -1.25; rUpperArmAngle = 1.25; lLowerArmAngle = 1.5; rLowerArmAngle = -1.5; } else if (self.state.pose === 'jump') { // Zıplama pozunda kollar yukarı kalksın lUpperArmAngle = -1.6; rUpperArmAngle = 1.6; lLowerArmAngle = 2.0; rLowerArmAngle = -2.0; } else if (self.state.pose === 'stand') { // Hafif salınım lUpperArmAngle += self.state.vx * 0.01; rUpperArmAngle -= self.state.vx * 0.01; lLowerArmAngle += Math.sin(Date.now() * 0.003) * 0.08; rLowerArmAngle -= Math.sin(Date.now() * 0.003) * 0.08; } // --- ARM KINEMATICS --- // Shoulder positions lUpperArm.x = lShoulderX; lUpperArm.y = lShoulderY; rUpperArm.x = rShoulderX; rUpperArm.y = rShoulderY; // Elbow positions (kinematik bağlantı) var lElbowX = lUpperArm.x + Math.sin(lUpperArmAngle) * upperArmH; var lElbowY = lUpperArm.y + Math.cos(lUpperArmAngle) * upperArmH; var rElbowX = rUpperArm.x + Math.sin(rUpperArmAngle) * upperArmH; var rElbowY = rUpperArm.y + Math.cos(rUpperArmAngle) * upperArmH; lElbow.x = lElbowX; lElbow.y = lElbowY; rElbow.x = rElbowX; rElbow.y = rElbowY; // Upper arm rotations (shoulder to elbow) lUpperArm.rotation = Math.atan2(lElbow.y - lShoulderY, lElbow.x - lShoulderX) - Math.PI / 2; rUpperArm.rotation = Math.atan2(rElbow.y - rShoulderY, rElbow.x - rShoulderX) - Math.PI / 2; // Lower arm positions and rotations (elbow to wrist) lLowerArm.x = lElbowX; lLowerArm.y = lElbowY; lLowerArm.rotation = lLowerArmAngle; rLowerArm.x = rElbowX; rLowerArm.y = rElbowY; rLowerArm.rotation = rLowerArmAngle; // --- LEG KINEMATICS --- // Kalça (hip) pozisyonu: gövdenin altına ortalanmış hip.x = hipX; hip.y = hipY; // --- Leg pose logic --- // Varsayılan açı ve offsetler var lUpperLegAngle = Math.PI / 2; var rUpperLegAngle = Math.PI / 2; var lLowerLegAngle = Math.PI / 2; var rLowerLegAngle = Math.PI / 2; var kneeSpread = 0; // dizlerin birbirinden uzaklığı var kneeYOffset = 0; // dizlerin yukarı/aşağı offseti var footYOffset = 0; // ayakların yukarı/aşağı offseti if (self.state.pose === 'sit') { // Oturma pozunda dizler önde, bacaklar bükülü lUpperLegAngle = Math.PI / 2.5; rUpperLegAngle = Math.PI / 2.5; lLowerLegAngle = Math.PI / 1.15; rLowerLegAngle = Math.PI / 1.15; kneeSpread = 32; kneeYOffset = 30; footYOffset = 60; } else if (self.state.pose === 'jump') { // Zıplama pozunda bacaklar düz ve hafif açık lUpperLegAngle = Math.PI / 2.15; rUpperLegAngle = Math.PI / 2.15; lLowerLegAngle = Math.PI / 2.05; rLowerLegAngle = Math.PI / 2.05; kneeSpread = 24; kneeYOffset = -18; footYOffset = -10; } else if (self.state.pose === 'stand') { // Ayakta duruşta bacaklar düz, hafif salınım var sway = Math.sin(Date.now() * 0.001) * 0.08; lUpperLegAngle = Math.PI / 2 + sway; rUpperLegAngle = Math.PI / 2 - sway; lLowerLegAngle = Math.PI / 2 + sway * 0.5; rLowerLegAngle = Math.PI / 2 - sway * 0.5; kneeSpread = 0; kneeYOffset = 0; footYOffset = 0; } // Diz noktası: kalçadan üst bacak uzunluğu kadar aşağıda, dizler arası mesafe ile ayrık var lKneeX = hipX - kneeSpread; var rKneeX = hipX + kneeSpread; var lKneeY = hipY + upperLegH + kneeYOffset; var rKneeY = hipY + upperLegH + kneeYOffset; // Üst bacaklar: kalçadan dize lUpperLeg.x = hipX; lUpperLeg.y = hipY; lUpperLeg.rotation = lUpperLegAngle; rUpperLeg.x = hipX; rUpperLeg.y = hipY; rUpperLeg.rotation = rUpperLegAngle; // Dizler lKnee.x = lKneeX; lKnee.y = lKneeY; rKnee.x = rKneeX; rKnee.y = rKneeY; // Alt bacaklar: dizden aşağıya iner lLowerLeg.x = lKneeX; lLowerLeg.y = lKneeY; lLowerLeg.rotation = lLowerLegAngle; rLowerLeg.x = rKneeX; rLowerLeg.y = rKneeY; rLowerLeg.rotation = rLowerLegAngle; // Gövde açısı: oturunca hafif öne, zıplarken hafif geriye body.rotation = self.state.pose === 'sit' ? -0.18 : self.state.pose === 'jump' ? 0.12 : 0; } // --- Public puppet actions --- self.pullHeadLeft = function () { // Pull head left, add leftward velocity if (self.state.grounded) { self.state.vx -= 12; self.state.headAngle = -0.5; tween(self.state, { headAngle: 0 }, { duration: 400, easing: tween.easeOut }); } }; self.pullHeadRight = function () { if (self.state.grounded) { self.state.vx += 12; self.state.headAngle = 0.5; tween(self.state, { headAngle: 0 }, { duration: 400, easing: tween.easeOut }); } }; self.jump = function () { if (self.state.grounded) { self.state.vy = -48; // Increased jump velocity for higher jump self.state.grounded = false; self.state.pose = 'jump'; tween(self.state, {}, { duration: 0, onFinish: function onFinish() { // After 400ms, return to stand pose LK.setTimeout(function () { self.state.pose = 'stand'; }, 400); } }); } }; self.sit = function () { if (self.state.grounded && self.state.pose !== 'sit') { self.state.pose = 'sit'; // After 600ms, stand up automatically LK.setTimeout(function () { self.stand(); }, 600); } }; self.stand = function () { if (self.state.grounded && self.state.pose !== 'stand') { self.state.pose = 'stand'; } }; // --- Physics update --- self.update = function () { // Gravity if (!self.state.grounded) { self.state.vy += 2.2; // gravity if (self.state.vy > 40) self.state.vy = 40; } // Friction if (self.state.grounded) { self.state.vx *= 0.82; if (Math.abs(self.state.vx) < 0.5) self.state.vx = 0; } else { self.state.vx *= 0.98; } // Move self.state.x += self.state.vx; self.state.y += self.state.vy; // Clamp to world bounds if (self.state.x < 80) self.state.x = 80; if (self.state.x > 2048 - 80) self.state.x = 2048 - 80; // --- Ava: Adjust puppet Y so feet are above ground visually --- // The puppet's feet are at y + (bodyH/2) + upperLegH + lowerLegH - 10 - 10 // ground.y = 2732 - 80, ground height = 80 // So, puppet.y + (bodyH/2) + upperLegH + lowerLegH - 20 = 2732 - 80 // puppet.y = 2732 - 80 - (bodyH/2) - upperLegH - lowerLegH + 20 var puppetFeetOffset = bodyH / 2 + upperLegH + lowerLegH - 20; var puppetGroundY = 2732 - 80 - puppetFeetOffset; if (self.state.y > puppetGroundY) self.state.y = puppetGroundY; // above ground // Ground collision if (self.state.y >= puppetGroundY) { self.state.y = puppetGroundY; self.state.vy = 0; self.state.grounded = true; if (self.state.pose === 'jump') self.state.pose = 'stand'; } else { self.state.grounded = false; } // Apply to container self.x = self.state.x; self.y = self.state.y; updateBodyParts(); }; // --- Start position --- self.state.x = 600; // Moved puppet further right (was 180) // --- Ava: Set initial Y so feet are above ground visually --- var puppetFeetOffset = bodyH / 2 + upperLegH + lowerLegH - 20; self.state.y = 2732 - 80 - puppetFeetOffset; updateBodyParts(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Ava: background asset // Apply reverb to all drum and win/lose sounds // --- World setup --- // Puppet body parts (shapes) // Drums // Ground // Finish sign // Drum tap sound // Win/lose sound // Define and initialize the reverb object before using it var reverb = { add: function add(sound) { // Dummy implementation: does nothing, but prevents errors // In a real environment, this would apply a reverb effect to the sound } }; reverb.add(LK.getSound('drum_tap_center')); reverb.add(LK.getSound('drum_tap_left')); reverb.add(LK.getSound('drum_tap_right')); reverb.add(LK.getSound('drum_tap_sit')); reverb.add(LK.getSound('drum_tap_stand')); reverb.add(LK.getSound('lose')); reverb.add(LK.getSound('win')); // --- Background music playlist (4 tracks, play in random order) --- var musicTracks = [{ id: 'musicId', volume: 0.1, start: 0, end: 1 }, { id: 'musicId2', volume: 0.1, start: 0, end: 1 }, { id: 'musicId3', volume: 0.1, start: 0, end: 1 }, { id: 'musicId4', volume: 0.1, start: 0, end: 1 }]; // Shuffle helper (Fisher-Yates) function shuffleArray(arr) { for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // Start with a shuffled playlist var shuffledMusicOrder = []; function reshuffleMusicOrder() { shuffledMusicOrder = []; for (var i = 0; i < musicTracks.length; ++i) shuffledMusicOrder.push(i); shuffleArray(shuffledMusicOrder); } reshuffleMusicOrder(); var currentMusicOrderIndex = 0; function playNextMusic() { // If we've played all, reshuffle for a new random order if (currentMusicOrderIndex >= shuffledMusicOrder.length) { reshuffleMusicOrder(); currentMusicOrderIndex = 0; } var trackIndex = shuffledMusicOrder[currentMusicOrderIndex]; var track = musicTracks[trackIndex]; LK.playMusic(track.id, { loop: false, volume: track.volume, start: track.start, end: track.end, onFinish: function onFinish() { currentMusicOrderIndex++; playNextMusic(); } }); } playNextMusic(); game.setBackgroundColor(0x000000); // --- Background --- // Ava: Add background image behind all elements var background = LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0, scaleX: 1, scaleY: 1 }); game.addChild(background); // Ground var ground = LK.getAsset('ground', { anchorX: 0, anchorY: 0 }); ground.x = 0; ground.y = 2732 - 80; game.addChild(ground); // Finish sign var finishSign = LK.getAsset('finish_sign', { anchorX: 0.5, anchorY: 1, scaleX: 3, scaleY: 6 // 2x as tall as before }); finishSign.x = 2048 - 120; finishSign.y = 2732 - 80; game.addChild(finishSign); // Finish text removed // --- Puppet --- var puppet = new Puppet(); game.addChild(puppet); // --- Drums --- var drums = []; // Drum positions (relative to center) // Move drums higher: set drumCenterY above puppet's head var drumCenterX = 2048 / 2, drumCenterY = 900; // was 2732 / 2 + 220, now much higher (puppet head is around y=~1200) var drumRadius = 220 * 3; var angleList = [{ type: 'left', angle: -Math.PI / 2 - 0.7 }, { type: 'right', angle: -Math.PI / 2 + 0.7 }, { type: 'sit', angle: Math.PI / 2 + 0.7 }, { type: 'stand', angle: Math.PI / 2 - 0.7 }]; // --- Drum action pool --- // Each drum will have all actions, only their order will be shuffled // Ava: Increase the number of right movement actions (pullHeadRight) in the action pool var puppetActions = [function () { puppet.pullHeadLeft(); }, function () { puppet.pullHeadRight(); }, function () { puppet.pullHeadRight(); }, function () { puppet.jump(); }, function () { puppet.sit(); }, function () { puppet.stand(); }]; // Large center drum (fixed action sequence) var drumJump = new Drum(); drumJump.setDrum('large'); drumJump.x = drumCenterX; drumJump.y = drumCenterY; // Assign a fixed sequence of all 5 actions, and cycle through them drumJump._actionSequence = puppetActions.slice(); drumJump._actionIndex = 0; drumJump.action = function () { drumJump._actionSequence[drumJump._actionIndex](); drumJump._actionIndex = (drumJump._actionIndex + 1) % drumJump._actionSequence.length; }; game.addChild(drumJump); drums.push(drumJump); // Four medium drums for (var i = 0; i < angleList.length; ++i) { var d = new Drum(); d.setDrum(angleList[i].type); d.x = drumCenterX + Math.cos(angleList[i].angle) * drumRadius; d.y = drumCenterY + Math.sin(angleList[i].angle) * drumRadius; // Each drum gets a fixed sequence of all 5 actions, and cycles through them d._actionSequence = puppetActions.slice(); d._actionIndex = 0; d.action = function (drum) { return function () { drum._actionSequence[drum._actionIndex](); drum._actionIndex = (drum._actionIndex + 1) % drum._actionSequence.length; }; }(d); game.addChild(d); drums.push(d); } // --- Timer --- var timeLeft = 60; function formatTimeDigital(secs) { var m = Math.floor(secs / 60); var s = secs % 60; var mm = m < 10 ? "0" + m : "" + m; var ss = s < 10 ? "0" + s : "" + s; return mm + ":" + ss; } var timerText = new Text2(formatTimeDigital(60), { size: 120, fill: '#ffffff' }); timerText.anchor.set(0.5, 0); LK.gui.top.addChild(timerText); // --- Score/Win state --- var gameEnded = false; // --- Timer logic --- var timerInterval = LK.setInterval(function () { if (gameEnded) return; timeLeft -= 1; if (timeLeft < 0) timeLeft = 0; timerText.setText(formatTimeDigital(timeLeft)); if (timeLeft === 0 && !gameEnded) { gameEnded = true; LK.getSound('lose').play(); LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); } }, 1000); // --- Game update --- game.update = function () { if (gameEnded) return; puppet.update(); // Win condition: puppet body collides with finish sign using intersects if (!gameEnded && puppet.intersects(finishSign)) { gameEnded = true; LK.setScore(timeLeft); // Set score to remaining seconds LK.getSound('win').play(); LK.effects.flashScreen(0x44c767, 800); LK.showYouWin(); } }; // --- Clean up on game over --- game.onDestroy = function () { LK.clearInterval(timerInterval); }; // --- Prevent accidental tap on top left (menu) --- /* No elements are placed at (0,0)-(100,100) */ // --- UX: drums are always on top --- for (var i = 0; i < drums.length; ++i) { game.addChild(drums[i]); }
===================================================================
--- original.js
+++ change.js
@@ -337,28 +337,70 @@
// --- LEG KINEMATICS ---
// Kalça (hip) pozisyonu: gövdenin altına ortalanmış
hip.x = hipX;
hip.y = hipY;
- // Diz noktası: kalçanın hemen altında, üst bacak uzunluğu kadar aşağıda
- lKnee.x = kneeX;
- lKnee.y = kneeY;
- rKnee.x = kneeX;
- rKnee.y = kneeY;
+ // --- Leg pose logic ---
+ // Varsayılan açı ve offsetler
+ var lUpperLegAngle = Math.PI / 2;
+ var rUpperLegAngle = Math.PI / 2;
+ var lLowerLegAngle = Math.PI / 2;
+ var rLowerLegAngle = Math.PI / 2;
+ var kneeSpread = 0; // dizlerin birbirinden uzaklığı
+ var kneeYOffset = 0; // dizlerin yukarı/aşağı offseti
+ var footYOffset = 0; // ayakların yukarı/aşağı offseti
+ if (self.state.pose === 'sit') {
+ // Oturma pozunda dizler önde, bacaklar bükülü
+ lUpperLegAngle = Math.PI / 2.5;
+ rUpperLegAngle = Math.PI / 2.5;
+ lLowerLegAngle = Math.PI / 1.15;
+ rLowerLegAngle = Math.PI / 1.15;
+ kneeSpread = 32;
+ kneeYOffset = 30;
+ footYOffset = 60;
+ } else if (self.state.pose === 'jump') {
+ // Zıplama pozunda bacaklar düz ve hafif açık
+ lUpperLegAngle = Math.PI / 2.15;
+ rUpperLegAngle = Math.PI / 2.15;
+ lLowerLegAngle = Math.PI / 2.05;
+ rLowerLegAngle = Math.PI / 2.05;
+ kneeSpread = 24;
+ kneeYOffset = -18;
+ footYOffset = -10;
+ } else if (self.state.pose === 'stand') {
+ // Ayakta duruşta bacaklar düz, hafif salınım
+ var sway = Math.sin(Date.now() * 0.001) * 0.08;
+ lUpperLegAngle = Math.PI / 2 + sway;
+ rUpperLegAngle = Math.PI / 2 - sway;
+ lLowerLegAngle = Math.PI / 2 + sway * 0.5;
+ rLowerLegAngle = Math.PI / 2 - sway * 0.5;
+ kneeSpread = 0;
+ kneeYOffset = 0;
+ footYOffset = 0;
+ }
+ // Diz noktası: kalçadan üst bacak uzunluğu kadar aşağıda, dizler arası mesafe ile ayrık
+ var lKneeX = hipX - kneeSpread;
+ var rKneeX = hipX + kneeSpread;
+ var lKneeY = hipY + upperLegH + kneeYOffset;
+ var rKneeY = hipY + upperLegH + kneeYOffset;
// Üst bacaklar: kalçadan dize
lUpperLeg.x = hipX;
lUpperLeg.y = hipY;
- lUpperLeg.rotation = Math.PI / 2;
+ lUpperLeg.rotation = lUpperLegAngle;
rUpperLeg.x = hipX;
rUpperLeg.y = hipY;
- rUpperLeg.rotation = Math.PI / 2;
+ rUpperLeg.rotation = rUpperLegAngle;
+ // Dizler
+ lKnee.x = lKneeX;
+ lKnee.y = lKneeY;
+ rKnee.x = rKneeX;
+ rKnee.y = rKneeY;
// Alt bacaklar: dizden aşağıya iner
- lLowerLeg.x = kneeX;
- lLowerLeg.y = kneeY;
- lLowerLeg.rotation = Math.PI / 2;
- rLowerLeg.x = kneeX;
- rLowerLeg.y = kneeY;
- rLowerLeg.rotation = Math.PI / 2;
- // Bacaklar her pozda sabit, hareket etmez
+ lLowerLeg.x = lKneeX;
+ lLowerLeg.y = lKneeY;
+ lLowerLeg.rotation = lLowerLegAngle;
+ rLowerLeg.x = rKneeX;
+ rLowerLeg.y = rKneeY;
+ rLowerLeg.rotation = rLowerLegAngle;
// Gövde açısı: oturunca hafif öne, zıplarken hafif geriye
body.rotation = self.state.pose === 'sit' ? -0.18 : self.state.pose === 'jump' ? 0.12 : 0;
}
// --- Public puppet actions ---