User prompt
drum_tap_sit davula tıklayınca sese çok kısa aralıklı 2 kez delay efekti uygula.
User prompt
Apply 2 fast delay effects to drum_tap_sit when stand drum is tapped
User prompt
Kukla 5 adet hareketinden hariç tamamen ratgele ama kinematik e uygun bir şekilde başka hareketler de etsinler. Her davul tıklamasinda rastegele ve başka kinematik e uygun bir hareket etsinler
User prompt
Arkaplan müzikleri arka arkaya rastgele sırada oyun bitene kadar çalmaya devam etsin.
User prompt
Arkaplan müzikleri arka arkaya devam etsin.
User prompt
Arkaplan müzikleri arka arkaya ve rastgele sirada çalsın.
User prompt
Arkaplan müziği 4 adet olsun biri bitince diğeri başlasın
User prompt
Arkaplan asset ekle
User prompt
Kuklaya eller ve ayaklar ekle
User prompt
Boyun gözükmüyor
User prompt
Kuklaya bir de boyun asset ekle
User prompt
drum_tap_right davula tıklayınca sese reverb efekti uygula
User prompt
drum_tap_stand davula tıklayınca sese çok kısa aralıklı 3 kez delay efekti uygula.
User prompt
Drum_tap_stand davula tıklayınca çok kısa aralıklı 3 kez delay efekti uygula.
User prompt
Delay efektini sadece drum stand a uygula
User prompt
Bir davula tıklayınca çok seyrek ve rastgele olacak şekilde çok kısa aralıklı 3 kez delay efekti uygula.
User prompt
3 kez delay efekti çok seyrek rastgele olsun.
User prompt
Bir davula tıklayınca çok kısa aralıklı 3 kez delay efekti uygula.
User prompt
Kuklanın tüm hareketlerini diz ve dirsek assetlerini de kullanarak kinematik olarak tekrar düzenle ve hataları iyileştir.
User prompt
Kuklanın tüm hareketlerini kinematik olarak tekrar iyileştir.
User prompt
Kuklaya diz asseti ve dirsek asseti ekle bunları kinematics olarak düzenle
User prompt
Kukla tıklama ve çıkış tıklama için ses ekle
User prompt
Kuklaya tıklayınca ve çıkış tabelasına tıklayınca ses çıksın.
User prompt
Arkaplanda bir müzik çalsın.
User prompt
Saate Digital bir görunum ver 00:00 gibi
/****
* 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') {
LK.getSound('drum_tap_left').play();
} else if (self.drumType === 'right') {
LK.getSound('drum_tap_right').play();
} else if (self.drumType === 'sit') {
LK.getSound('drum_tap_sit').play();
} else if (self.drumType === 'stand') {
LK.getSound('drum_tap_stand').play();
} 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
});
// Body
var body = self.attachAsset('puppet_body', {
anchorX: 0.5,
anchorY: 0,
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 (kinematic joint)
var lElbow = self.attachAsset('puppet_lowerleg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
// 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 (kinematic joint)
var rElbow = self.attachAsset('puppet_lowerleg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
// 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 (kinematic joint)
var lKnee = self.attachAsset('puppet_lowerleg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
// 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 (kinematic joint)
var rKnee = self.attachAsset('puppet_lowerleg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
// 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;
head.y = -bodyH / 2 - headH / 2 + 10;
head.rotation = self.state.headAngle;
// Body
body.x = 0;
body.y = -bodyH / 2;
// --- Shoulder and hip positions ---
var armY = -bodyH / 2 + 30;
var armX = bodyW / 2 + upperArmW / 2 - 10;
var lShoulderX = -armX,
lShoulderY = armY;
var rShoulderX = armX,
rShoulderY = armY;
var legY = bodyH / 2 - 10;
var legX = bodyW / 2 - 18;
var lHipX = -legX,
lHipY = legY;
var rHipX = legX,
rHipY = legY;
// --- Default joint angles ---
// Arms
var lUpperArmAngle = -0.18,
rUpperArmAngle = 0.18;
var lElbowBend = 0.25,
rElbowBend = -0.25;
// Legs
var lUpperLegAngle = 0.18,
rUpperLegAngle = -0.18;
var lKneeBend = 0.25,
rKneeBend = -0.25;
// --- Pose-based animation ---
if (self.state.pose === 'sit') {
// Arms: down and bent
lUpperArmAngle = -1.25;
rUpperArmAngle = 1.25;
lElbowBend = 1.5;
rElbowBend = -1.5;
// Legs: thighs forward, knees bent
lUpperLegAngle = 1.35;
rUpperLegAngle = 1.35;
lKneeBend = lUpperLegAngle - Math.PI / 2 + 0.15;
rKneeBend = rUpperLegAngle - Math.PI / 2 - 0.15;
} else if (self.state.pose === 'jump') {
// Arms: up and bent
lUpperArmAngle = -0.9;
rUpperArmAngle = 0.9;
lElbowBend = 1.2;
rElbowBend = -1.2;
// Legs: up and bent
lUpperLegAngle = -0.95;
rUpperLegAngle = -0.95;
lKneeBend = lUpperLegAngle + 1.7;
rKneeBend = rUpperLegAngle + 1.7;
} else if (self.state.pose === 'stand') {
// Gentle swing for arms and walk for legs
lUpperArmAngle += self.state.vx * 0.01;
rUpperArmAngle -= self.state.vx * 0.01;
lElbowBend += Math.sin(Date.now() * 0.003) * 0.08;
rElbowBend -= Math.sin(Date.now() * 0.003) * 0.08;
var walk = Math.abs(self.state.vx) > 0.5 ? Math.sin(Date.now() * 0.008) * 0.25 : 0;
lUpperLegAngle += walk;
rUpperLegAngle -= walk;
lKneeBend += walk * 0.5;
rKneeBend -= walk * 0.5;
}
// --- Left Arm ---
lUpperArm.x = lShoulderX;
lUpperArm.y = lShoulderY;
lUpperArm.rotation = lUpperArmAngle;
// Elbow position (kinematic)
var lElbowX = lUpperArm.x + Math.sin(lUpperArmAngle) * upperArmH;
var lElbowY = lUpperArm.y + Math.cos(lUpperArmAngle) * upperArmH;
lElbow.x = lElbowX;
lElbow.y = lElbowY;
lElbow.rotation = 0;
// Lower arm
lLowerArm.x = lElbowX;
lLowerArm.y = lElbowY;
lLowerArm.rotation = lUpperArmAngle + lElbowBend;
// --- Right Arm ---
rUpperArm.x = rShoulderX;
rUpperArm.y = rShoulderY;
rUpperArm.rotation = rUpperArmAngle;
// Elbow position (kinematic)
var rElbowX = rUpperArm.x + Math.sin(rUpperArmAngle) * upperArmH;
var rElbowY = rUpperArm.y + Math.cos(rUpperArmAngle) * upperArmH;
rElbow.x = rElbowX;
rElbow.y = rElbowY;
rElbow.rotation = 0;
// Lower arm
rLowerArm.x = rElbowX;
rLowerArm.y = rElbowY;
rLowerArm.rotation = rUpperArmAngle + rElbowBend;
// --- Left Leg ---
lUpperLeg.x = lHipX;
lUpperLeg.y = lHipY;
lUpperLeg.rotation = lUpperLegAngle;
// Knee position (kinematic)
var lKneeX = lUpperLeg.x + Math.sin(lUpperLegAngle) * upperLegH;
var lKneeY = lUpperLeg.y + Math.cos(lUpperLegAngle) * upperLegH;
lKnee.x = lKneeX;
lKnee.y = lKneeY;
lKnee.rotation = 0;
// Lower leg
lLowerLeg.x = lKneeX;
lLowerLeg.y = lKneeY;
lLowerLeg.rotation = lUpperLegAngle + lKneeBend;
// --- Right Leg ---
rUpperLeg.x = rHipX;
rUpperLeg.y = rHipY;
rUpperLeg.rotation = rUpperLegAngle;
// Knee position (kinematic)
var rKneeX = rUpperLeg.x + Math.sin(rUpperLegAngle) * upperLegH;
var rKneeY = rUpperLeg.y + Math.cos(rUpperLegAngle) * upperLegH;
rKnee.x = rKneeX;
rKnee.y = rKneeY;
rKnee.rotation = 0;
// Lower leg
rLowerLeg.x = rKneeX;
rLowerLeg.y = rKneeY;
rLowerLeg.rotation = rUpperLegAngle + rKneeBend;
// --- Body rotation for pose ---
if (self.state.pose === 'sit') {
body.rotation = -0.18;
} else if (self.state.pose === 'jump') {
body.rotation = 0.12;
} else {
body.rotation = 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
****/
// 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'));
// Play background music (loops by default)
LK.playMusic('musicId');
game.setBackgroundColor(0x000000);
// 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
@@ -197,166 +197,128 @@
head.rotation = self.state.headAngle;
// Body
body.x = 0;
body.y = -bodyH / 2;
- // Arms
+ // --- Shoulder and hip positions ---
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;
- // --- Kinematic arm pose setup ---
- // Default: stand
- var lUpperArmAngle = -0.18;
- var rUpperArmAngle = 0.18;
- var lLowerArmAngle = 0.25;
- var rLowerArmAngle = -0.25;
- // Smoother transitions for arms
+ var lShoulderX = -armX,
+ lShoulderY = armY;
+ var rShoulderX = armX,
+ rShoulderY = armY;
+ var legY = bodyH / 2 - 10;
+ var legX = bodyW / 2 - 18;
+ var lHipX = -legX,
+ lHipY = legY;
+ var rHipX = legX,
+ rHipY = legY;
+ // --- Default joint angles ---
+ // Arms
+ var lUpperArmAngle = -0.18,
+ rUpperArmAngle = 0.18;
+ var lElbowBend = 0.25,
+ rElbowBend = -0.25;
+ // Legs
+ var lUpperLegAngle = 0.18,
+ rUpperLegAngle = -0.18;
+ var lKneeBend = 0.25,
+ rKneeBend = -0.25;
+ // --- Pose-based animation ---
if (self.state.pose === 'sit') {
- lUpperArmAngle = -1.35;
- rUpperArmAngle = 1.35;
- lLowerArmAngle = 1.7;
- rLowerArmAngle = -1.7;
+ // Arms: down and bent
+ lUpperArmAngle = -1.25;
+ rUpperArmAngle = 1.25;
+ lElbowBend = 1.5;
+ rElbowBend = -1.5;
+ // Legs: thighs forward, knees bent
+ lUpperLegAngle = 1.35;
+ rUpperLegAngle = 1.35;
+ lKneeBend = lUpperLegAngle - Math.PI / 2 + 0.15;
+ rKneeBend = rUpperLegAngle - Math.PI / 2 - 0.15;
} else if (self.state.pose === 'jump') {
- lUpperArmAngle = -1.1;
- rUpperArmAngle = 1.1;
- lLowerArmAngle = 1.5;
- rLowerArmAngle = -1.5;
+ // Arms: up and bent
+ lUpperArmAngle = -0.9;
+ rUpperArmAngle = 0.9;
+ lElbowBend = 1.2;
+ rElbowBend = -1.2;
+ // Legs: up and bent
+ lUpperLegAngle = -0.95;
+ rUpperLegAngle = -0.95;
+ lKneeBend = lUpperLegAngle + 1.7;
+ rKneeBend = rUpperLegAngle + 1.7;
} else if (self.state.pose === 'stand') {
- // Gentle swing based on horizontal velocity for more life
- lUpperArmAngle += self.state.vx * 0.012;
- rUpperArmAngle -= self.state.vx * 0.012;
- var swing = Math.sin(Date.now() * 0.003) * 0.12;
- lLowerArmAngle += swing;
- rLowerArmAngle -= swing;
+ // Gentle swing for arms and walk for legs
+ lUpperArmAngle += self.state.vx * 0.01;
+ rUpperArmAngle -= self.state.vx * 0.01;
+ lElbowBend += Math.sin(Date.now() * 0.003) * 0.08;
+ rElbowBend -= Math.sin(Date.now() * 0.003) * 0.08;
+ var walk = Math.abs(self.state.vx) > 0.5 ? Math.sin(Date.now() * 0.008) * 0.25 : 0;
+ lUpperLegAngle += walk;
+ rUpperLegAngle -= walk;
+ lKneeBend += walk * 0.5;
+ rKneeBend -= walk * 0.5;
}
- // Left upper arm
+ // --- Left Arm ---
lUpperArm.x = lShoulderX;
lUpperArm.y = lShoulderY;
lUpperArm.rotation = lUpperArmAngle;
- // Left elbow position
+ // Elbow position (kinematic)
var lElbowX = lUpperArm.x + Math.sin(lUpperArmAngle) * upperArmH;
var lElbowY = lUpperArm.y + Math.cos(lUpperArmAngle) * upperArmH;
lElbow.x = lElbowX;
lElbow.y = lElbowY;
lElbow.rotation = 0;
- // Left lower arm
+ // Lower arm
lLowerArm.x = lElbowX;
lLowerArm.y = lElbowY;
- lLowerArm.rotation = lLowerArmAngle;
- // Right upper arm
+ lLowerArm.rotation = lUpperArmAngle + lElbowBend;
+ // --- Right Arm ---
rUpperArm.x = rShoulderX;
rUpperArm.y = rShoulderY;
rUpperArm.rotation = rUpperArmAngle;
- // Right elbow position
+ // Elbow position (kinematic)
var rElbowX = rUpperArm.x + Math.sin(rUpperArmAngle) * upperArmH;
var rElbowY = rUpperArm.y + Math.cos(rUpperArmAngle) * upperArmH;
rElbow.x = rElbowX;
rElbow.y = rElbowY;
rElbow.rotation = 0;
- // Right lower arm
+ // Lower arm
rLowerArm.x = rElbowX;
rLowerArm.y = rElbowY;
- rLowerArm.rotation = rLowerArmAngle;
- // --- Kinematic leg pose setup ---
- var legY = bodyH / 2 - 10;
- var legX = bodyW / 2 - 18;
- // Default: stand
- var lUpperLegAngle = 0.18;
- var rUpperLegAngle = -0.18;
- var lLowerLegAngle = 0.25;
- var rLowerLegAngle = -0.25;
- if (self.state.pose === 'sit') {
- lUpperLegAngle = 1.45;
- rUpperLegAngle = 1.45;
- lLowerLegAngle = lUpperLegAngle - Math.PI / 2 + 0.22;
- rLowerLegAngle = rUpperLegAngle - Math.PI / 2 - 0.22;
- } else if (self.state.pose === 'jump') {
- lUpperLegAngle = -1.1;
- rUpperLegAngle = -1.1;
- lLowerLegAngle = lUpperLegAngle + 1.85;
- rLowerLegAngle = rUpperLegAngle + 1.85;
- } else if (self.state.pose === 'stand') {
- // Gentle walk cycle if moving
- var walk = Math.abs(self.state.vx) > 0.5 ? Math.sin(Date.now() * 0.008) * 0.28 : 0;
- lUpperLegAngle += walk;
- rUpperLegAngle -= walk;
- lLowerLegAngle += walk * 0.5;
- rLowerLegAngle -= walk * 0.5;
- }
- // Left upper leg
- lUpperLeg.x = -legX;
- lUpperLeg.y = legY;
+ rLowerArm.rotation = rUpperArmAngle + rElbowBend;
+ // --- Left Leg ---
+ lUpperLeg.x = lHipX;
+ lUpperLeg.y = lHipY;
lUpperLeg.rotation = lUpperLegAngle;
- // Calculate left knee position
+ // Knee position (kinematic)
var lKneeX = lUpperLeg.x + Math.sin(lUpperLegAngle) * upperLegH;
var lKneeY = lUpperLeg.y + Math.cos(lUpperLegAngle) * upperLegH;
lKnee.x = lKneeX;
lKnee.y = lKneeY;
lKnee.rotation = 0;
- // Attach lower leg at knee, rotate for more natural foot placement
+ // Lower leg
lLowerLeg.x = lKneeX;
lLowerLeg.y = lKneeY;
- lLowerLeg.rotation = lLowerLegAngle;
- // Right upper leg
- rUpperLeg.x = legX;
- rUpperLeg.y = legY;
+ lLowerLeg.rotation = lUpperLegAngle + lKneeBend;
+ // --- Right Leg ---
+ rUpperLeg.x = rHipX;
+ rUpperLeg.y = rHipY;
rUpperLeg.rotation = rUpperLegAngle;
- // Calculate right knee position
+ // Knee position (kinematic)
var rKneeX = rUpperLeg.x + Math.sin(rUpperLegAngle) * upperLegH;
var rKneeY = rUpperLeg.y + Math.cos(rUpperLegAngle) * upperLegH;
rKnee.x = rKneeX;
rKnee.y = rKneeY;
rKnee.rotation = 0;
- // Attach lower leg at knee, rotate for more natural foot placement
+ // Lower leg
rLowerLeg.x = rKneeX;
rLowerLeg.y = rKneeY;
- rLowerLeg.rotation = rLowerLegAngle;
- // Pose adjustments
+ rLowerLeg.rotation = rUpperLegAngle + rKneeBend;
+ // --- Body rotation for pose ---
if (self.state.pose === 'sit') {
- // Sitting: thighs forward, knees bent, shins down
- lUpperLeg.rotation = 1.45;
- var lKneeX = lUpperLeg.x + Math.sin(lUpperLeg.rotation) * upperLegH;
- var lKneeY = lUpperLeg.y + Math.cos(lUpperLeg.rotation) * upperLegH;
- lKnee.x = lKneeX;
- lKnee.y = lKneeY;
- lKnee.rotation = 0;
- lLowerLeg.x = lKneeX;
- lLowerLeg.y = lKneeY;
- lLowerLeg.rotation = lUpperLeg.rotation - Math.PI / 2 + 0.22;
- rUpperLeg.rotation = 1.45;
- var rKneeX = rUpperLeg.x + Math.sin(rUpperLeg.rotation) * upperLegH;
- var rKneeY = rUpperLeg.y + Math.cos(rUpperLeg.rotation) * upperLegH;
- rKnee.x = rKneeX;
- rKnee.y = rKneeY;
- rKnee.rotation = 0;
- rLowerLeg.x = rKneeX;
- rLowerLeg.y = rKneeY;
- rLowerLeg.rotation = rUpperLeg.rotation - Math.PI / 2 - 0.22;
- body.rotation = -0.22;
+ body.rotation = -0.18;
} else if (self.state.pose === 'jump') {
- // Jump: legs up, knees bent
- lUpperLeg.rotation = -1.1;
- var lKneeX = lUpperLeg.x + Math.sin(lUpperLeg.rotation) * upperLegH;
- var lKneeY = lUpperLeg.y + Math.cos(lUpperLeg.rotation) * upperLegH;
- lKnee.x = lKneeX;
- lKnee.y = lKneeY;
- lKnee.rotation = 0;
- lLowerLeg.x = lKneeX;
- lLowerLeg.y = lKneeY;
- lLowerLeg.rotation = lUpperLeg.rotation + 1.85;
- rUpperLeg.rotation = -1.1;
- var rKneeX = rUpperLeg.x + Math.sin(rUpperLeg.rotation) * upperLegH;
- var rKneeY = rUpperLeg.y + Math.cos(rUpperLeg.rotation) * upperLegH;
- rKnee.x = rKneeX;
- rKnee.y = rKneeY;
- rKnee.rotation = 0;
- rLowerLeg.x = rKneeX;
- rLowerLeg.y = rKneeY;
- rLowerLeg.rotation = rUpperLeg.rotation + 1.85;
- body.rotation = 0.18;
+ body.rotation = 0.12;
} else {
body.rotation = 0;
}
}
@@ -476,17 +438,17 @@
/****
* Game Code
****/
-// Define and initialize the reverb object before using it
-// Win/lose sound
-// Drum tap sound
-// Finish sign
-// Ground
-// Drums
-// Puppet body parts (shapes)
-// --- World setup ---
// 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