/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -50;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Crosshair = Container.expand(function () {
var self = Container.call(this);
var hunter = self.attachAsset('hunter', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Duck = Container.expand(function () {
var self = Container.call(this);
var duckBody = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
var leftWing = self.attachAsset('duckWing', {
anchorX: 0.5,
anchorY: 0.5,
x: -30,
y: -10
});
var rightWing = self.attachAsset('duckWing', {
anchorX: 0.5,
anchorY: 0.5,
x: 30,
y: -10
});
self.speed = 12;
self.direction = 1;
self.wingAnimation = 0;
self.isHit = false;
self.update = function () {
if (self.isHit) return;
self.x += self.speed * self.direction;
// Wing flapping animation
self.wingAnimation += 0.3;
leftWing.rotation = Math.sin(self.wingAnimation) * 0.5;
rightWing.rotation = -Math.sin(self.wingAnimation) * 0.5;
};
self.hit = function () {
if (self.isHit) return false;
self.isHit = true;
LK.getSound('hit').play();
// Duck falls down when hit
tween(self, {
y: self.y + 200,
rotation: Math.PI
}, {
duration: 800,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Add sky background
var skyBg = game.addChild(LK.getAsset('skyBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Game variables
var crosshair;
var ducks = [];
var bullets = [];
var duckSpawnTimer = 0;
var gameScore = 0;
var difficulty = 1;
// Initialize crosshair
crosshair = game.addChild(new Crosshair());
crosshair.x = 1024;
crosshair.y = 2600;
// Initialize score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Game controls
game.move = function (x, y, obj) {
// Hunter is stuck in position - no movement allowed
};
game.down = function (x, y, obj) {
// Manual shooting on touch/tap
var bullet = new Bullet();
bullet.x = crosshair.x;
bullet.y = crosshair.y - 50;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
function spawnDuck() {
var duck = new Duck();
// Always spawn from left side
duck.x = -100;
duck.direction = 1;
// Random height in upper half of screen
duck.y = Math.random() * 800 + 400;
// Random speed based on difficulty - very fast movement
duck.speed = 8 + Math.random() * 6 + difficulty * 2;
ducks.push(duck);
game.addChild(duck);
LK.getSound('quack').play();
}
game.update = function () {
duckSpawnTimer++;
// Spawn ducks based on difficulty
var spawnRate = Math.max(60 - difficulty * 5, 30);
if (duckSpawnTimer >= spawnRate) {
spawnDuck();
duckSpawnTimer = 0;
}
// Update and check bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.y < -50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-duck collisions
for (var j = ducks.length - 1; j >= 0; j--) {
var duck = ducks[j];
if (!duck.isHit && bullet.intersects(duck)) {
if (duck.hit()) {
gameScore += 10 * difficulty;
LK.setScore(gameScore);
scoreTxt.setText('Score: ' + gameScore);
// Remove duck from array
ducks.splice(j, 1);
// Remove bullet
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
}
// Check for ducks that escaped (only check right side since ducks fly left to right)
for (var k = ducks.length - 1; k >= 0; k--) {
var duck = ducks[k];
if (!duck.isHit && duck.x > 2200) {
duck.destroy();
ducks.splice(k, 1);
}
}
// Increase difficulty every 100 points
var newDifficulty = Math.floor(gameScore / 100) + 1;
if (newDifficulty > difficulty) {
difficulty = newDifficulty;
}
// Win condition - score 500 points
if (gameScore >= 500) {
LK.showYouWin();
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -50;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Crosshair = Container.expand(function () {
var self = Container.call(this);
var hunter = self.attachAsset('hunter', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Duck = Container.expand(function () {
var self = Container.call(this);
var duckBody = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
var leftWing = self.attachAsset('duckWing', {
anchorX: 0.5,
anchorY: 0.5,
x: -30,
y: -10
});
var rightWing = self.attachAsset('duckWing', {
anchorX: 0.5,
anchorY: 0.5,
x: 30,
y: -10
});
self.speed = 12;
self.direction = 1;
self.wingAnimation = 0;
self.isHit = false;
self.update = function () {
if (self.isHit) return;
self.x += self.speed * self.direction;
// Wing flapping animation
self.wingAnimation += 0.3;
leftWing.rotation = Math.sin(self.wingAnimation) * 0.5;
rightWing.rotation = -Math.sin(self.wingAnimation) * 0.5;
};
self.hit = function () {
if (self.isHit) return false;
self.isHit = true;
LK.getSound('hit').play();
// Duck falls down when hit
tween(self, {
y: self.y + 200,
rotation: Math.PI
}, {
duration: 800,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Add sky background
var skyBg = game.addChild(LK.getAsset('skyBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Game variables
var crosshair;
var ducks = [];
var bullets = [];
var duckSpawnTimer = 0;
var gameScore = 0;
var difficulty = 1;
// Initialize crosshair
crosshair = game.addChild(new Crosshair());
crosshair.x = 1024;
crosshair.y = 2600;
// Initialize score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Game controls
game.move = function (x, y, obj) {
// Hunter is stuck in position - no movement allowed
};
game.down = function (x, y, obj) {
// Manual shooting on touch/tap
var bullet = new Bullet();
bullet.x = crosshair.x;
bullet.y = crosshair.y - 50;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
function spawnDuck() {
var duck = new Duck();
// Always spawn from left side
duck.x = -100;
duck.direction = 1;
// Random height in upper half of screen
duck.y = Math.random() * 800 + 400;
// Random speed based on difficulty - very fast movement
duck.speed = 8 + Math.random() * 6 + difficulty * 2;
ducks.push(duck);
game.addChild(duck);
LK.getSound('quack').play();
}
game.update = function () {
duckSpawnTimer++;
// Spawn ducks based on difficulty
var spawnRate = Math.max(60 - difficulty * 5, 30);
if (duckSpawnTimer >= spawnRate) {
spawnDuck();
duckSpawnTimer = 0;
}
// Update and check bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.y < -50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-duck collisions
for (var j = ducks.length - 1; j >= 0; j--) {
var duck = ducks[j];
if (!duck.isHit && bullet.intersects(duck)) {
if (duck.hit()) {
gameScore += 10 * difficulty;
LK.setScore(gameScore);
scoreTxt.setText('Score: ' + gameScore);
// Remove duck from array
ducks.splice(j, 1);
// Remove bullet
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
}
// Check for ducks that escaped (only check right side since ducks fly left to right)
for (var k = ducks.length - 1; k >= 0; k--) {
var duck = ducks[k];
if (!duck.isHit && duck.x > 2200) {
duck.destroy();
ducks.splice(k, 1);
}
}
// Increase difficulty every 100 points
var newDifficulty = Math.floor(gameScore / 100) + 1;
if (newDifficulty > difficulty) {
difficulty = newDifficulty;
}
// Win condition - score 500 points
if (gameScore >= 500) {
LK.showYouWin();
}
};