/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Chomp effect (cartoon flash) var ChompEffect = Container.expand(function () { var self = Container.call(this); var effect = self.attachAsset('chompEffect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); self.effect = effect; self.play = function (x, y) { self.x = x; self.y = y; self.alpha = 0.7; self.scaleX = 1; self.scaleY = 1; tween(self, { alpha: 0, scaleX: 2.2, scaleY: 2.2 }, { duration: 320, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); // Clukr (yellow, chicken, beak) var Clukr = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('clukrBody', { anchorX: 0.5, anchorY: 0.5 }); var beak = self.attachAsset('clukrBeak', { anchorX: 0.5, anchorY: 0.5, y: 32 }); var eyeL = self.attachAsset('clukrEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: -12, y: -12 }); var eyeR = self.attachAsset('clukrEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: 12, y: -12 }); var pupilL = self.attachAsset('clukrPupil', { anchorX: 0.5, anchorY: 0.5, x: -12, y: -12 }); var pupilR = self.attachAsset('clukrPupil', { anchorX: 0.5, anchorY: 0.5, x: 12, y: -12 }); var mouth = self.attachAsset('clukrMouth', { anchorX: 0.5, anchorY: 0.5, y: 38, scaleY: 1.1 }); self.eyeL = eyeL; self.eyeR = eyeR; self.pupilL = pupilL; self.pupilR = pupilR; self.mouth = mouth; self.isScared = false; self.isEaten = false; self.speed = 7.8; self.direction = 0; self.setScared = function (scared) { self.isScared = scared; if (scared) { tween(mouth, { scaleY: 1.7 }, { duration: 120 }); } else { tween(mouth, { scaleY: 1.1 }, { duration: 120 }); } }; self.lookAt = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var mag = Math.sqrt(dx * dx + dy * dy); var maxOffset = 5; var ox = mag > 0 ? dx / mag * maxOffset : 0; var oy = mag > 0 ? dy / mag * maxOffset : 0; self.pupilL.x = -12 + ox; self.pupilL.y = -12 + oy; self.pupilR.x = 12 + ox; self.pupilR.y = -12 + oy; }; return self; }); // Mr. Black Hat (Player) var MrBlackHat = Container.expand(function () { var self = Container.call(this); // Body var body = self.attachAsset('mrBlackHat', { anchorX: 0.5, anchorY: 0.5 }); // Hat var brim = self.attachAsset('hatBrim', { anchorX: 0.5, anchorY: 0.5, y: -110 }); var top = self.attachAsset('hatTop', { anchorX: 0.5, anchorY: 1, y: -170 }); // Eyes var eyeL = self.attachAsset('eyeWhite', { anchorX: 0.5, anchorY: 0.5, x: -40, y: -30 }); var eyeR = self.attachAsset('eyeWhite', { anchorX: 0.5, anchorY: 0.5, x: 40, y: -30 }); var pupilL = self.attachAsset('eyePupil', { anchorX: 0.5, anchorY: 0.5, x: -40, y: -30 }); var pupilR = self.attachAsset('eyePupil', { anchorX: 0.5, anchorY: 0.5, x: 40, y: -30 }); // Mouth var mouth = self.attachAsset('mouth', { anchorX: 0.5, anchorY: 0.5, y: 50, scaleY: 0.7 }); self.mouth = mouth; self.eyeL = eyeL; self.eyeR = eyeR; self.pupilL = pupilL; self.pupilR = pupilR; self.isChomping = false; self.chompingTimer = 0; // Chomp animation self.chomp = function () { if (self.isChomping) return; self.isChomping = true; tween(mouth, { scaleY: 1.3 }, { duration: 90, easing: tween.easeOut, onFinish: function onFinish() { tween(mouth, { scaleY: 0.7 }, { duration: 120, easing: tween.easeIn, onFinish: function onFinish() { self.isChomping = false; } }); } }); }; // Animate eyes to look at a point self.lookAt = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var mag = Math.sqrt(dx * dx + dy * dy); var maxOffset = 10; var ox = mag > 0 ? dx / mag * maxOffset : 0; var oy = mag > 0 ? dy / mag * maxOffset : 0; self.pupilL.x = -40 + ox; self.pupilL.y = -30 + oy; self.pupilR.x = 40 + ox; self.pupilR.y = -30 + oy; }; return self; }); // Oren (orange, round, scared) var Oren = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('orenBody', { anchorX: 0.5, anchorY: 0.5 }); var eyeL = self.attachAsset('orenEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: -22, y: -18 }); var eyeR = self.attachAsset('orenEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: 22, y: -18 }); var pupilL = self.attachAsset('orenPupil', { anchorX: 0.5, anchorY: 0.5, x: -22, y: -18 }); var pupilR = self.attachAsset('orenPupil', { anchorX: 0.5, anchorY: 0.5, x: 22, y: -18 }); var mouth = self.attachAsset('orenMouth', { anchorX: 0.5, anchorY: 0.5, y: 28, scaleY: 1.1 }); self.eyeL = eyeL; self.eyeR = eyeR; self.pupilL = pupilL; self.pupilR = pupilR; self.mouth = mouth; self.isScared = false; self.isEaten = false; self.speed = 7.5; self.direction = 0; // radians self.setScared = function (scared) { self.isScared = scared; if (scared) { tween(mouth, { scaleY: 1.7 }, { duration: 120 }); } else { tween(mouth, { scaleY: 1.1 }, { duration: 120 }); } }; self.lookAt = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var mag = Math.sqrt(dx * dx + dy * dy); var maxOffset = 7; var ox = mag > 0 ? dx / mag * maxOffset : 0; var oy = mag > 0 ? dy / mag * maxOffset : 0; self.pupilL.x = -22 + ox; self.pupilL.y = -18 + oy; self.pupilR.x = 22 + ox; self.pupilR.y = -18 + oy; }; return self; }); // Raddy (red, rabbit-like, long ears) var Raddy = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('raddyBody', { anchorX: 0.5, anchorY: 0.5 }); var earL = self.attachAsset('raddyEar', { anchorX: 0.5, anchorY: 1, x: -28, y: -70, rotation: -0.3 }); var earR = self.attachAsset('raddyEar', { anchorX: 0.5, anchorY: 1, x: 28, y: -70, rotation: 0.3 }); var eyeL = self.attachAsset('raddyEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: -16, y: -16 }); var eyeR = self.attachAsset('raddyEyeWhite', { anchorX: 0.5, anchorY: 0.5, x: 16, y: -16 }); var pupilL = self.attachAsset('raddyPupil', { anchorX: 0.5, anchorY: 0.5, x: -16, y: -16 }); var pupilR = self.attachAsset('raddyPupil', { anchorX: 0.5, anchorY: 0.5, x: 16, y: -16 }); var mouth = self.attachAsset('raddyMouth', { anchorX: 0.5, anchorY: 0.5, y: 22, scaleY: 1.1 }); self.eyeL = eyeL; self.eyeR = eyeR; self.pupilL = pupilL; self.pupilR = pupilR; self.mouth = mouth; self.isScared = false; self.isEaten = false; self.speed = 8.2; self.direction = 0; self.setScared = function (scared) { self.isScared = scared; if (scared) { tween(mouth, { scaleY: 1.7 }, { duration: 120 }); } else { tween(mouth, { scaleY: 1.1 }, { duration: 120 }); } }; self.lookAt = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var mag = Math.sqrt(dx * dx + dy * dy); var maxOffset = 6; var ox = mag > 0 ? dx / mag * maxOffset : 0; var oy = mag > 0 ? dy / mag * maxOffset : 0; self.pupilL.x = -16 + ox; self.pupilL.y = -16 + oy; self.pupilR.x = 16 + ox; self.pupilR.y = -16 + oy; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf6f6e9 }); /**** * Game Code ****/ // Chomp effect // Clukr (yellow, chicken, beak) // Raddy (red, rabbit-like, long ears) // Oren (orange, round, scared) // Mr. Black Hat (player) // Game state var player = null; var targets = []; var targetsEaten = 0; var dragNode = null; var lastTouchX = 0; var lastTouchY = 0; var chompReady = true; var chompCooldown = 0; var chompRadius = 120; var chompedThisPress = false; // Score text var scoreTxt = new Text2('0/3', { size: 120, fill: 0x222222 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Helper: spawn all targets function spawnTargets() { targets = []; targetsEaten = 0; // Oren var oren = new Oren(); oren.x = 400; oren.y = 900; targets.push(oren); game.addChild(oren); // Raddy var raddy = new Raddy(); raddy.x = 1648; raddy.y = 700; targets.push(raddy); game.addChild(raddy); // Clukr var clukr = new Clukr(); clukr.x = 1024; clukr.y = 2100; targets.push(clukr); game.addChild(clukr); } // Helper: reset player position function resetPlayer() { player.x = 1024; player.y = 1500; } // Initialize player and targets player = new MrBlackHat(); game.addChild(player); resetPlayer(); spawnTargets(); scoreTxt.setText('0/3'); // Helper: update score function updateScore() { scoreTxt.setText(targetsEaten + '/3'); if (targetsEaten >= 3) { LK.setScore(3); LK.showYouWin(); } } // Helper: chomp at current position function tryChomp() { if (!chompReady || player.isChomping) return; chompReady = false; chompedThisPress = true; player.chomp(); // Chomp effect var effect = new ChompEffect(); game.addChild(effect); effect.play(player.x, player.y + 80); // Check for targets in range for (var i = 0; i < targets.length; ++i) { var t = targets[i]; if (t.isEaten) continue; var dx = t.x - player.x; var dy = t.y - (player.y + 80); var dist = Math.sqrt(dx * dx + dy * dy); if (dist < chompRadius) { // Eat! t.isEaten = true; targetsEaten += 1; updateScore(); // Cartoon bulge and fade tween(t, { scaleX: 1.5, scaleY: 0.5, alpha: 0 }, { duration: 400, easing: tween.bounceOut, onFinish: function onFinish() { t.destroy(); } }); // Slapstick flash LK.effects.flashObject(player, 0xffff00, 200); } } // Chomp cooldown chompCooldown = 18; // ~0.3s } // Touch/move logic game.down = function (x, y, obj) { // Don't allow drag from top left 100x100 if (x < 100 && y < 100) return; dragNode = player; lastTouchX = x; lastTouchY = y; chompedThisPress = false; }; game.move = function (x, y, obj) { if (dragNode) { // Clamp to game area var px = Math.max(120, Math.min(2048 - 120, x)); var py = Math.max(220, Math.min(2732 - 120, y)); dragNode.x = px; dragNode.y = py; lastTouchX = px; lastTouchY = py; } // Eyes look at last touch player.lookAt(lastTouchX, lastTouchY); for (var i = 0; i < targets.length; ++i) { var t = targets[i]; if (!t.isEaten) t.lookAt(player.x, player.y); } }; game.up = function (x, y, obj) { dragNode = null; chompReady = true; chompedThisPress = false; }; // Chomp on tap (if not dragging) game.tap = function (x, y, obj) { if (!dragNode && !chompedThisPress) { tryChomp(); } }; // For mobile: treat quick tap as chomp game.down = function (x, y, obj) { if (x < 100 && y < 100) return; dragNode = player; lastTouchX = x; lastTouchY = y; chompedThisPress = false; // If tap (not drag), chomp immediately tryChomp(); }; game.up = function (x, y, obj) { dragNode = null; chompReady = true; chompedThisPress = false; }; // Main update loop game.update = function () { // Chomp cooldown if (chompCooldown > 0) { chompCooldown -= 1; if (chompCooldown <= 0) { chompReady = true; } } // Targets flee from player for (var i = 0; i < targets.length; ++i) { var t = targets[i]; if (t.isEaten) continue; var dx = t.x - player.x; var dy = t.y - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 400) { // Scared, run away t.setScared(true); var fleeAngle = Math.atan2(dy, dx); var speed = t.speed + 2.5 * (400 - dist) / 400; t.x += Math.cos(fleeAngle) * speed; t.y += Math.sin(fleeAngle) * speed; // Clamp to game area t.x = Math.max(80, Math.min(2048 - 80, t.x)); t.y = Math.max(120, Math.min(2732 - 80, t.y)); } else { t.setScared(false); // Idle bounce t.y += Math.sin(LK.ticks / 18 + i * 2) * 0.7; } // Eyes look at player t.lookAt(player.x, player.y); } // Player eyes look at last touch player.lookAt(lastTouchX, lastTouchY); }; // Reset game on game over or win LK.on('gameover', function () { // Reset everything player.x = 1024; player.y = 1500; for (var i = 0; i < targets.length; ++i) { targets[i].destroy(); } spawnTargets(); targetsEaten = 0; updateScore(); }); LK.on('youwin', function () { // Reset everything player.x = 1024; player.y = 1500; for (var i = 0; i < targets.length; ++i) { targets[i].destroy(); } spawnTargets(); targetsEaten = 0; updateScore(); });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Chomp effect (cartoon flash)
var ChompEffect = Container.expand(function () {
var self = Container.call(this);
var effect = self.attachAsset('chompEffect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
self.effect = effect;
self.play = function (x, y) {
self.x = x;
self.y = y;
self.alpha = 0.7;
self.scaleX = 1;
self.scaleY = 1;
tween(self, {
alpha: 0,
scaleX: 2.2,
scaleY: 2.2
}, {
duration: 320,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
// Clukr (yellow, chicken, beak)
var Clukr = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('clukrBody', {
anchorX: 0.5,
anchorY: 0.5
});
var beak = self.attachAsset('clukrBeak', {
anchorX: 0.5,
anchorY: 0.5,
y: 32
});
var eyeL = self.attachAsset('clukrEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: -12,
y: -12
});
var eyeR = self.attachAsset('clukrEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: 12,
y: -12
});
var pupilL = self.attachAsset('clukrPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: -12,
y: -12
});
var pupilR = self.attachAsset('clukrPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: 12,
y: -12
});
var mouth = self.attachAsset('clukrMouth', {
anchorX: 0.5,
anchorY: 0.5,
y: 38,
scaleY: 1.1
});
self.eyeL = eyeL;
self.eyeR = eyeR;
self.pupilL = pupilL;
self.pupilR = pupilR;
self.mouth = mouth;
self.isScared = false;
self.isEaten = false;
self.speed = 7.8;
self.direction = 0;
self.setScared = function (scared) {
self.isScared = scared;
if (scared) {
tween(mouth, {
scaleY: 1.7
}, {
duration: 120
});
} else {
tween(mouth, {
scaleY: 1.1
}, {
duration: 120
});
}
};
self.lookAt = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var mag = Math.sqrt(dx * dx + dy * dy);
var maxOffset = 5;
var ox = mag > 0 ? dx / mag * maxOffset : 0;
var oy = mag > 0 ? dy / mag * maxOffset : 0;
self.pupilL.x = -12 + ox;
self.pupilL.y = -12 + oy;
self.pupilR.x = 12 + ox;
self.pupilR.y = -12 + oy;
};
return self;
});
// Mr. Black Hat (Player)
var MrBlackHat = Container.expand(function () {
var self = Container.call(this);
// Body
var body = self.attachAsset('mrBlackHat', {
anchorX: 0.5,
anchorY: 0.5
});
// Hat
var brim = self.attachAsset('hatBrim', {
anchorX: 0.5,
anchorY: 0.5,
y: -110
});
var top = self.attachAsset('hatTop', {
anchorX: 0.5,
anchorY: 1,
y: -170
});
// Eyes
var eyeL = self.attachAsset('eyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: -40,
y: -30
});
var eyeR = self.attachAsset('eyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: 40,
y: -30
});
var pupilL = self.attachAsset('eyePupil', {
anchorX: 0.5,
anchorY: 0.5,
x: -40,
y: -30
});
var pupilR = self.attachAsset('eyePupil', {
anchorX: 0.5,
anchorY: 0.5,
x: 40,
y: -30
});
// Mouth
var mouth = self.attachAsset('mouth', {
anchorX: 0.5,
anchorY: 0.5,
y: 50,
scaleY: 0.7
});
self.mouth = mouth;
self.eyeL = eyeL;
self.eyeR = eyeR;
self.pupilL = pupilL;
self.pupilR = pupilR;
self.isChomping = false;
self.chompingTimer = 0;
// Chomp animation
self.chomp = function () {
if (self.isChomping) return;
self.isChomping = true;
tween(mouth, {
scaleY: 1.3
}, {
duration: 90,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(mouth, {
scaleY: 0.7
}, {
duration: 120,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isChomping = false;
}
});
}
});
};
// Animate eyes to look at a point
self.lookAt = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var mag = Math.sqrt(dx * dx + dy * dy);
var maxOffset = 10;
var ox = mag > 0 ? dx / mag * maxOffset : 0;
var oy = mag > 0 ? dy / mag * maxOffset : 0;
self.pupilL.x = -40 + ox;
self.pupilL.y = -30 + oy;
self.pupilR.x = 40 + ox;
self.pupilR.y = -30 + oy;
};
return self;
});
// Oren (orange, round, scared)
var Oren = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('orenBody', {
anchorX: 0.5,
anchorY: 0.5
});
var eyeL = self.attachAsset('orenEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: -22,
y: -18
});
var eyeR = self.attachAsset('orenEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: 22,
y: -18
});
var pupilL = self.attachAsset('orenPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: -22,
y: -18
});
var pupilR = self.attachAsset('orenPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: 22,
y: -18
});
var mouth = self.attachAsset('orenMouth', {
anchorX: 0.5,
anchorY: 0.5,
y: 28,
scaleY: 1.1
});
self.eyeL = eyeL;
self.eyeR = eyeR;
self.pupilL = pupilL;
self.pupilR = pupilR;
self.mouth = mouth;
self.isScared = false;
self.isEaten = false;
self.speed = 7.5;
self.direction = 0; // radians
self.setScared = function (scared) {
self.isScared = scared;
if (scared) {
tween(mouth, {
scaleY: 1.7
}, {
duration: 120
});
} else {
tween(mouth, {
scaleY: 1.1
}, {
duration: 120
});
}
};
self.lookAt = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var mag = Math.sqrt(dx * dx + dy * dy);
var maxOffset = 7;
var ox = mag > 0 ? dx / mag * maxOffset : 0;
var oy = mag > 0 ? dy / mag * maxOffset : 0;
self.pupilL.x = -22 + ox;
self.pupilL.y = -18 + oy;
self.pupilR.x = 22 + ox;
self.pupilR.y = -18 + oy;
};
return self;
});
// Raddy (red, rabbit-like, long ears)
var Raddy = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('raddyBody', {
anchorX: 0.5,
anchorY: 0.5
});
var earL = self.attachAsset('raddyEar', {
anchorX: 0.5,
anchorY: 1,
x: -28,
y: -70,
rotation: -0.3
});
var earR = self.attachAsset('raddyEar', {
anchorX: 0.5,
anchorY: 1,
x: 28,
y: -70,
rotation: 0.3
});
var eyeL = self.attachAsset('raddyEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: -16,
y: -16
});
var eyeR = self.attachAsset('raddyEyeWhite', {
anchorX: 0.5,
anchorY: 0.5,
x: 16,
y: -16
});
var pupilL = self.attachAsset('raddyPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: -16,
y: -16
});
var pupilR = self.attachAsset('raddyPupil', {
anchorX: 0.5,
anchorY: 0.5,
x: 16,
y: -16
});
var mouth = self.attachAsset('raddyMouth', {
anchorX: 0.5,
anchorY: 0.5,
y: 22,
scaleY: 1.1
});
self.eyeL = eyeL;
self.eyeR = eyeR;
self.pupilL = pupilL;
self.pupilR = pupilR;
self.mouth = mouth;
self.isScared = false;
self.isEaten = false;
self.speed = 8.2;
self.direction = 0;
self.setScared = function (scared) {
self.isScared = scared;
if (scared) {
tween(mouth, {
scaleY: 1.7
}, {
duration: 120
});
} else {
tween(mouth, {
scaleY: 1.1
}, {
duration: 120
});
}
};
self.lookAt = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var mag = Math.sqrt(dx * dx + dy * dy);
var maxOffset = 6;
var ox = mag > 0 ? dx / mag * maxOffset : 0;
var oy = mag > 0 ? dy / mag * maxOffset : 0;
self.pupilL.x = -16 + ox;
self.pupilL.y = -16 + oy;
self.pupilR.x = 16 + ox;
self.pupilR.y = -16 + oy;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf6f6e9
});
/****
* Game Code
****/
// Chomp effect
// Clukr (yellow, chicken, beak)
// Raddy (red, rabbit-like, long ears)
// Oren (orange, round, scared)
// Mr. Black Hat (player)
// Game state
var player = null;
var targets = [];
var targetsEaten = 0;
var dragNode = null;
var lastTouchX = 0;
var lastTouchY = 0;
var chompReady = true;
var chompCooldown = 0;
var chompRadius = 120;
var chompedThisPress = false;
// Score text
var scoreTxt = new Text2('0/3', {
size: 120,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Helper: spawn all targets
function spawnTargets() {
targets = [];
targetsEaten = 0;
// Oren
var oren = new Oren();
oren.x = 400;
oren.y = 900;
targets.push(oren);
game.addChild(oren);
// Raddy
var raddy = new Raddy();
raddy.x = 1648;
raddy.y = 700;
targets.push(raddy);
game.addChild(raddy);
// Clukr
var clukr = new Clukr();
clukr.x = 1024;
clukr.y = 2100;
targets.push(clukr);
game.addChild(clukr);
}
// Helper: reset player position
function resetPlayer() {
player.x = 1024;
player.y = 1500;
}
// Initialize player and targets
player = new MrBlackHat();
game.addChild(player);
resetPlayer();
spawnTargets();
scoreTxt.setText('0/3');
// Helper: update score
function updateScore() {
scoreTxt.setText(targetsEaten + '/3');
if (targetsEaten >= 3) {
LK.setScore(3);
LK.showYouWin();
}
}
// Helper: chomp at current position
function tryChomp() {
if (!chompReady || player.isChomping) return;
chompReady = false;
chompedThisPress = true;
player.chomp();
// Chomp effect
var effect = new ChompEffect();
game.addChild(effect);
effect.play(player.x, player.y + 80);
// Check for targets in range
for (var i = 0; i < targets.length; ++i) {
var t = targets[i];
if (t.isEaten) continue;
var dx = t.x - player.x;
var dy = t.y - (player.y + 80);
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < chompRadius) {
// Eat!
t.isEaten = true;
targetsEaten += 1;
updateScore();
// Cartoon bulge and fade
tween(t, {
scaleX: 1.5,
scaleY: 0.5,
alpha: 0
}, {
duration: 400,
easing: tween.bounceOut,
onFinish: function onFinish() {
t.destroy();
}
});
// Slapstick flash
LK.effects.flashObject(player, 0xffff00, 200);
}
}
// Chomp cooldown
chompCooldown = 18; // ~0.3s
}
// Touch/move logic
game.down = function (x, y, obj) {
// Don't allow drag from top left 100x100
if (x < 100 && y < 100) return;
dragNode = player;
lastTouchX = x;
lastTouchY = y;
chompedThisPress = false;
};
game.move = function (x, y, obj) {
if (dragNode) {
// Clamp to game area
var px = Math.max(120, Math.min(2048 - 120, x));
var py = Math.max(220, Math.min(2732 - 120, y));
dragNode.x = px;
dragNode.y = py;
lastTouchX = px;
lastTouchY = py;
}
// Eyes look at last touch
player.lookAt(lastTouchX, lastTouchY);
for (var i = 0; i < targets.length; ++i) {
var t = targets[i];
if (!t.isEaten) t.lookAt(player.x, player.y);
}
};
game.up = function (x, y, obj) {
dragNode = null;
chompReady = true;
chompedThisPress = false;
};
// Chomp on tap (if not dragging)
game.tap = function (x, y, obj) {
if (!dragNode && !chompedThisPress) {
tryChomp();
}
};
// For mobile: treat quick tap as chomp
game.down = function (x, y, obj) {
if (x < 100 && y < 100) return;
dragNode = player;
lastTouchX = x;
lastTouchY = y;
chompedThisPress = false;
// If tap (not drag), chomp immediately
tryChomp();
};
game.up = function (x, y, obj) {
dragNode = null;
chompReady = true;
chompedThisPress = false;
};
// Main update loop
game.update = function () {
// Chomp cooldown
if (chompCooldown > 0) {
chompCooldown -= 1;
if (chompCooldown <= 0) {
chompReady = true;
}
}
// Targets flee from player
for (var i = 0; i < targets.length; ++i) {
var t = targets[i];
if (t.isEaten) continue;
var dx = t.x - player.x;
var dy = t.y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 400) {
// Scared, run away
t.setScared(true);
var fleeAngle = Math.atan2(dy, dx);
var speed = t.speed + 2.5 * (400 - dist) / 400;
t.x += Math.cos(fleeAngle) * speed;
t.y += Math.sin(fleeAngle) * speed;
// Clamp to game area
t.x = Math.max(80, Math.min(2048 - 80, t.x));
t.y = Math.max(120, Math.min(2732 - 80, t.y));
} else {
t.setScared(false);
// Idle bounce
t.y += Math.sin(LK.ticks / 18 + i * 2) * 0.7;
}
// Eyes look at player
t.lookAt(player.x, player.y);
}
// Player eyes look at last touch
player.lookAt(lastTouchX, lastTouchY);
};
// Reset game on game over or win
LK.on('gameover', function () {
// Reset everything
player.x = 1024;
player.y = 1500;
for (var i = 0; i < targets.length; ++i) {
targets[i].destroy();
}
spawnTargets();
targetsEaten = 0;
updateScore();
});
LK.on('youwin', function () {
// Reset everything
player.x = 1024;
player.y = 1500;
for (var i = 0; i < targets.length; ++i) {
targets[i].destroy();
}
spawnTargets();
targetsEaten = 0;
updateScore();
});