/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BabyCreature = Container.expand(function (creatureType) {
var self = Container.call(this);
var graphics = self.attachAsset(creatureType || 'babyShark', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lifespan = 300; // 5 seconds at 60fps
self.age = 0;
self.update = function () {
self.y += self.speed;
self.age++;
// Fade out as it ages
graphics.alpha = Math.max(0, 1 - self.age / self.lifespan);
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Orca = Container.expand(function () {
var self = Container.call(this);
var orcaGraphics = self.attachAsset('orca', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.birthTimer = 0;
self.birthInterval = 120; // Birth every 2 seconds at 60fps
self.update = function () {
self.birthTimer++;
if (self.birthTimer >= self.birthInterval) {
self.birthTimer = 0;
giveBirth();
}
// Keep orca within bounds
if (self.x < 100) self.x = 100;
if (self.x > 1948) self.x = 1948;
if (self.y < 100) self.y = 100;
if (self.y > 2632) self.y = 2632;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.bobTimer = 0;
self.update = function () {
self.y += self.speed;
self.bobTimer += 0.1;
powerupGraphics.y = Math.sin(self.bobTimer) * 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006994
});
/****
* Game Code
****/
var orca = new Orca();
var babyCreatures = [];
var obstacles = [];
var powerups = [];
var dragNode = null;
var gameSpeed = 1;
var obstacleTimer = 0;
var powerupTimer = 0;
// Initialize orca position
orca.x = 1024;
orca.y = 1366;
game.addChild(orca);
// Score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Health display
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0xFF6B6B
});
healthTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(healthTxt);
function giveBirth() {
var creatureType = Math.random() < 0.6 ? 'babyShark' : 'hammerhead';
var baby = new BabyCreature(creatureType);
baby.x = orca.x + (Math.random() - 0.5) * 100;
baby.y = orca.y + 80;
babyCreatures.push(baby);
game.addChild(baby);
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('birth').play();
// Flash effect on birth
LK.effects.flashObject(orca, 0x3498db, 500);
}
function spawnObstacle() {
var obstacle = new Obstacle();
obstacle.x = Math.random() * 1848 + 100;
obstacle.y = -100;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerUp() {
var powerup = new PowerUp();
powerup.x = Math.random() * 1848 + 100;
powerup.y = -50;
powerups.push(powerup);
game.addChild(powerup);
}
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = orca;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
// Increase game speed over time
if (LK.ticks % 600 == 0) {
// Every 10 seconds
gameSpeed += 0.1;
}
// Spawn obstacles
obstacleTimer++;
if (obstacleTimer >= Math.max(60, 180 - LK.getScore() / 10)) {
obstacleTimer = 0;
spawnObstacle();
}
// Spawn powerups occasionally
powerupTimer++;
if (powerupTimer >= 480) {
// Every 8 seconds
powerupTimer = 0;
if (Math.random() < 0.3) {
spawnPowerUp();
}
}
// Update baby creatures
for (var i = babyCreatures.length - 1; i >= 0; i--) {
var baby = babyCreatures[i];
if (baby.age >= baby.lifespan || baby.y > 2800) {
baby.destroy();
babyCreatures.splice(i, 1);
}
}
// Update obstacles
for (var j = obstacles.length - 1; j >= 0; j--) {
var obstacle = obstacles[j];
// Check collision with orca
if (orca.intersects(obstacle)) {
orca.health--;
healthTxt.setText('Health: ' + orca.health);
LK.effects.flashObject(orca, 0xe74c3c, 800);
LK.getSound('hit').play();
obstacle.destroy();
obstacles.splice(j, 1);
if (orca.health <= 0) {
LK.showGameOver();
return;
}
continue;
}
// Remove off-screen obstacles
if (obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(j, 1);
}
}
// Update powerups
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
// Check collision with orca
if (orca.intersects(powerup)) {
LK.setScore(LK.getScore() + 50);
scoreTxt.setText('Score: ' + LK.getScore());
LK.effects.flashObject(orca, 0x2ecc71, 600);
LK.getSound('collect').play();
powerup.destroy();
powerups.splice(k, 1);
continue;
}
// Remove off-screen powerups
if (powerup.y > 2800) {
powerup.destroy();
powerups.splice(k, 1);
}
}
// Check win condition
if (LK.getScore() >= 1000) {
LK.showYouWin();
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BabyCreature = Container.expand(function (creatureType) {
var self = Container.call(this);
var graphics = self.attachAsset(creatureType || 'babyShark', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lifespan = 300; // 5 seconds at 60fps
self.age = 0;
self.update = function () {
self.y += self.speed;
self.age++;
// Fade out as it ages
graphics.alpha = Math.max(0, 1 - self.age / self.lifespan);
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Orca = Container.expand(function () {
var self = Container.call(this);
var orcaGraphics = self.attachAsset('orca', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.birthTimer = 0;
self.birthInterval = 120; // Birth every 2 seconds at 60fps
self.update = function () {
self.birthTimer++;
if (self.birthTimer >= self.birthInterval) {
self.birthTimer = 0;
giveBirth();
}
// Keep orca within bounds
if (self.x < 100) self.x = 100;
if (self.x > 1948) self.x = 1948;
if (self.y < 100) self.y = 100;
if (self.y > 2632) self.y = 2632;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.bobTimer = 0;
self.update = function () {
self.y += self.speed;
self.bobTimer += 0.1;
powerupGraphics.y = Math.sin(self.bobTimer) * 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006994
});
/****
* Game Code
****/
var orca = new Orca();
var babyCreatures = [];
var obstacles = [];
var powerups = [];
var dragNode = null;
var gameSpeed = 1;
var obstacleTimer = 0;
var powerupTimer = 0;
// Initialize orca position
orca.x = 1024;
orca.y = 1366;
game.addChild(orca);
// Score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Health display
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0xFF6B6B
});
healthTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(healthTxt);
function giveBirth() {
var creatureType = Math.random() < 0.6 ? 'babyShark' : 'hammerhead';
var baby = new BabyCreature(creatureType);
baby.x = orca.x + (Math.random() - 0.5) * 100;
baby.y = orca.y + 80;
babyCreatures.push(baby);
game.addChild(baby);
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('birth').play();
// Flash effect on birth
LK.effects.flashObject(orca, 0x3498db, 500);
}
function spawnObstacle() {
var obstacle = new Obstacle();
obstacle.x = Math.random() * 1848 + 100;
obstacle.y = -100;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerUp() {
var powerup = new PowerUp();
powerup.x = Math.random() * 1848 + 100;
powerup.y = -50;
powerups.push(powerup);
game.addChild(powerup);
}
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = orca;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
// Increase game speed over time
if (LK.ticks % 600 == 0) {
// Every 10 seconds
gameSpeed += 0.1;
}
// Spawn obstacles
obstacleTimer++;
if (obstacleTimer >= Math.max(60, 180 - LK.getScore() / 10)) {
obstacleTimer = 0;
spawnObstacle();
}
// Spawn powerups occasionally
powerupTimer++;
if (powerupTimer >= 480) {
// Every 8 seconds
powerupTimer = 0;
if (Math.random() < 0.3) {
spawnPowerUp();
}
}
// Update baby creatures
for (var i = babyCreatures.length - 1; i >= 0; i--) {
var baby = babyCreatures[i];
if (baby.age >= baby.lifespan || baby.y > 2800) {
baby.destroy();
babyCreatures.splice(i, 1);
}
}
// Update obstacles
for (var j = obstacles.length - 1; j >= 0; j--) {
var obstacle = obstacles[j];
// Check collision with orca
if (orca.intersects(obstacle)) {
orca.health--;
healthTxt.setText('Health: ' + orca.health);
LK.effects.flashObject(orca, 0xe74c3c, 800);
LK.getSound('hit').play();
obstacle.destroy();
obstacles.splice(j, 1);
if (orca.health <= 0) {
LK.showGameOver();
return;
}
continue;
}
// Remove off-screen obstacles
if (obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(j, 1);
}
}
// Update powerups
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
// Check collision with orca
if (orca.intersects(powerup)) {
LK.setScore(LK.getScore() + 50);
scoreTxt.setText('Score: ' + LK.getScore());
LK.effects.flashObject(orca, 0x2ecc71, 600);
LK.getSound('collect').play();
powerup.destroy();
powerups.splice(k, 1);
continue;
}
// Remove off-screen powerups
if (powerup.y > 2800) {
powerup.destroy();
powerups.splice(k, 1);
}
}
// Check win condition
if (LK.getScore() >= 1000) {
LK.showYouWin();
}
};