/****
* 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();
});