/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Exit = Container.expand(function () {
var self = Container.call(this);
var exitGraphics = self.attachAsset('exit', {
anchorX: 0.5,
anchorY: 0.5
});
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Huggy = Container.expand(function () {
var self = Container.call(this);
var huggyGraphics = self.attachAsset('huggy', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseSpeed = 4;
self.currentSpeed = 4;
self.distanceToPlayer = 0;
self.lastY = 0;
self.dangerThreshold = 400;
self.warningActive = false;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.slowFactor = 0.5;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.isSpeedBoosted = false;
self.boostEndTime = 0;
self.lastX = 0;
self.activateBoost = function () {
self.isSpeedBoosted = true;
self.boostEndTime = LK.ticks + 300;
playerGraphics.tint = 0xFFFF00;
};
self.update = function () {
if (LK.ticks > self.boostEndTime && self.isSpeedBoosted) {
self.isSpeedBoosted = false;
playerGraphics.tint = 0xFFFFFF;
}
self.lastX = self.x;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.bobOffset = 0;
self.collected = false;
self.lastY = 0;
self.update = function () {
self.bobOffset += 0.1;
self.y = self.y + Math.sin(self.bobOffset) * 0.5;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 200;
player.y = 400;
var huggy = game.addChild(new Huggy());
huggy.x = 200;
huggy.y = -200;
var obstacles = [];
var powerups = [];
var exit = null;
var score = 0;
var gameActive = true;
var playerOnObstacle = false;
var playerMoving = false;
var playerTargetX = 200;
var scoreTxt = new Text2('Distance: 0m', {
size: 80,
fill: '#FFFFFF'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var dangerTxt = new Text2('DANGER!', {
size: 100,
fill: '#FF0000'
});
dangerTxt.anchor.set(0.5, 0.5);
dangerTxt.visible = false;
LK.gui.center.addChild(dangerTxt);
function spawnObstacle(yPos) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = 150 + Math.random() * 700;
obstacle.y = yPos;
obstacles.push(obstacle);
}
function spawnPowerUp(yPos) {
var powerup = game.addChild(new PowerUp());
powerup.x = 150 + Math.random() * 700;
powerup.y = yPos;
powerups.push(powerup);
}
function createExit(yPos) {
exit = game.addChild(new Exit());
exit.x = 1024;
exit.y = yPos;
}
function initializeLevel() {
score = 0;
player.y = 400;
huggy.y = -200;
huggy.currentSpeed = huggy.baseSpeed;
gameActive = true;
playerOnObstacle = false;
for (var i = 0; i < 15; i++) {
spawnObstacle(-500 + i * 400);
}
for (var i = 0; i < 5; i++) {
spawnPowerUp(-800 + i * 800 + Math.random() * 400);
}
createExit(-6000);
LK.playMusic('bgmusic', {
loop: true
});
}
game.down = function (x, y, obj) {
if (gameActive) {
playerMoving = true;
playerTargetX = x;
}
};
game.up = function (x, y, obj) {
playerMoving = false;
};
game.move = function (x, y, obj) {
if (gameActive && playerMoving) {
playerTargetX = x;
}
};
game.update = function () {
if (!gameActive) {
return;
}
var moveSpeed = player.speed;
if (playerMoving) {
var direction = playerTargetX > player.x ? 1 : -1;
player.x += direction * moveSpeed * 0.5;
if (player.x < 100) player.x = 100;
if (player.x > 1948) player.x = 1948;
}
player.y += moveSpeed;
if (playerOnObstacle) {
player.y += moveSpeed * (player.slowFactor - 1);
}
if (player.isSpeedBoosted) {
player.y += moveSpeed * 1.5;
}
huggy.y += huggy.currentSpeed;
var huggyDistance = Math.abs(huggy.y - player.y);
player.distanceToPlayer = huggyDistance;
if (huggyDistance < 600 && huggyDistance > 300) {
huggy.currentSpeed = huggy.baseSpeed + 1.5;
if (!huggy.warningActive) {
huggy.warningActive = true;
dangerTxt.visible = true;
LK.getSound('danger').play();
tween(dangerTxt, {
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
dangerTxt.visible = false;
dangerTxt.alpha = 1;
huggy.warningActive = false;
}
});
}
} else if (huggyDistance < 300) {
huggy.currentSpeed = huggy.baseSpeed + 3;
dangerTxt.visible = true;
} else {
huggy.currentSpeed = huggy.baseSpeed;
dangerTxt.visible = false;
}
score = Math.floor((player.y - 400) / 10);
if (score < 0) score = 0;
scoreTxt.setText('Distance: ' + score + 'm');
playerOnObstacle = false;
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.intersects(obstacle) && obstacle.lastY > player.lastY) {
playerOnObstacle = true;
obstacle.slowFactor = 0.4;
}
if (obstacle.y > 3000) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (!powerup.collected && player.intersects(powerup)) {
powerup.collected = true;
player.activateBoost();
LK.getSound('powerup').play();
LK.setScore(LK.getScore() + 50);
powerup.destroy();
powerups.splice(i, 1);
}
if (powerup.y > 3000) {
if (!powerup.collected) {
powerup.destroy();
powerups.splice(i, 1);
}
}
}
if (exit && player.intersects(exit)) {
gameActive = false;
LK.setScore(LK.getScore() + 1000 + score);
LK.showYouWin();
}
if (huggy.intersects(player)) {
gameActive = false;
LK.getSound('caught').play();
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
}
if (player.y > 500) {
var lastObstacleY = obstacles.length > 0 ? obstacles[0].y : player.y;
var nextSpawnY = lastObstacleY - 1000;
if (Math.random() < 0.7) {
spawnObstacle(nextSpawnY);
}
if (Math.random() < 0.15) {
spawnPowerUp(nextSpawnY);
}
}
};
initializeLevel();
LK.playMusic('bgmusic'); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Exit = Container.expand(function () {
var self = Container.call(this);
var exitGraphics = self.attachAsset('exit', {
anchorX: 0.5,
anchorY: 0.5
});
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Huggy = Container.expand(function () {
var self = Container.call(this);
var huggyGraphics = self.attachAsset('huggy', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseSpeed = 4;
self.currentSpeed = 4;
self.distanceToPlayer = 0;
self.lastY = 0;
self.dangerThreshold = 400;
self.warningActive = false;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.slowFactor = 0.5;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.isSpeedBoosted = false;
self.boostEndTime = 0;
self.lastX = 0;
self.activateBoost = function () {
self.isSpeedBoosted = true;
self.boostEndTime = LK.ticks + 300;
playerGraphics.tint = 0xFFFF00;
};
self.update = function () {
if (LK.ticks > self.boostEndTime && self.isSpeedBoosted) {
self.isSpeedBoosted = false;
playerGraphics.tint = 0xFFFFFF;
}
self.lastX = self.x;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.bobOffset = 0;
self.collected = false;
self.lastY = 0;
self.update = function () {
self.bobOffset += 0.1;
self.y = self.y + Math.sin(self.bobOffset) * 0.5;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 200;
player.y = 400;
var huggy = game.addChild(new Huggy());
huggy.x = 200;
huggy.y = -200;
var obstacles = [];
var powerups = [];
var exit = null;
var score = 0;
var gameActive = true;
var playerOnObstacle = false;
var playerMoving = false;
var playerTargetX = 200;
var scoreTxt = new Text2('Distance: 0m', {
size: 80,
fill: '#FFFFFF'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var dangerTxt = new Text2('DANGER!', {
size: 100,
fill: '#FF0000'
});
dangerTxt.anchor.set(0.5, 0.5);
dangerTxt.visible = false;
LK.gui.center.addChild(dangerTxt);
function spawnObstacle(yPos) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = 150 + Math.random() * 700;
obstacle.y = yPos;
obstacles.push(obstacle);
}
function spawnPowerUp(yPos) {
var powerup = game.addChild(new PowerUp());
powerup.x = 150 + Math.random() * 700;
powerup.y = yPos;
powerups.push(powerup);
}
function createExit(yPos) {
exit = game.addChild(new Exit());
exit.x = 1024;
exit.y = yPos;
}
function initializeLevel() {
score = 0;
player.y = 400;
huggy.y = -200;
huggy.currentSpeed = huggy.baseSpeed;
gameActive = true;
playerOnObstacle = false;
for (var i = 0; i < 15; i++) {
spawnObstacle(-500 + i * 400);
}
for (var i = 0; i < 5; i++) {
spawnPowerUp(-800 + i * 800 + Math.random() * 400);
}
createExit(-6000);
LK.playMusic('bgmusic', {
loop: true
});
}
game.down = function (x, y, obj) {
if (gameActive) {
playerMoving = true;
playerTargetX = x;
}
};
game.up = function (x, y, obj) {
playerMoving = false;
};
game.move = function (x, y, obj) {
if (gameActive && playerMoving) {
playerTargetX = x;
}
};
game.update = function () {
if (!gameActive) {
return;
}
var moveSpeed = player.speed;
if (playerMoving) {
var direction = playerTargetX > player.x ? 1 : -1;
player.x += direction * moveSpeed * 0.5;
if (player.x < 100) player.x = 100;
if (player.x > 1948) player.x = 1948;
}
player.y += moveSpeed;
if (playerOnObstacle) {
player.y += moveSpeed * (player.slowFactor - 1);
}
if (player.isSpeedBoosted) {
player.y += moveSpeed * 1.5;
}
huggy.y += huggy.currentSpeed;
var huggyDistance = Math.abs(huggy.y - player.y);
player.distanceToPlayer = huggyDistance;
if (huggyDistance < 600 && huggyDistance > 300) {
huggy.currentSpeed = huggy.baseSpeed + 1.5;
if (!huggy.warningActive) {
huggy.warningActive = true;
dangerTxt.visible = true;
LK.getSound('danger').play();
tween(dangerTxt, {
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
dangerTxt.visible = false;
dangerTxt.alpha = 1;
huggy.warningActive = false;
}
});
}
} else if (huggyDistance < 300) {
huggy.currentSpeed = huggy.baseSpeed + 3;
dangerTxt.visible = true;
} else {
huggy.currentSpeed = huggy.baseSpeed;
dangerTxt.visible = false;
}
score = Math.floor((player.y - 400) / 10);
if (score < 0) score = 0;
scoreTxt.setText('Distance: ' + score + 'm');
playerOnObstacle = false;
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.intersects(obstacle) && obstacle.lastY > player.lastY) {
playerOnObstacle = true;
obstacle.slowFactor = 0.4;
}
if (obstacle.y > 3000) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (!powerup.collected && player.intersects(powerup)) {
powerup.collected = true;
player.activateBoost();
LK.getSound('powerup').play();
LK.setScore(LK.getScore() + 50);
powerup.destroy();
powerups.splice(i, 1);
}
if (powerup.y > 3000) {
if (!powerup.collected) {
powerup.destroy();
powerups.splice(i, 1);
}
}
}
if (exit && player.intersects(exit)) {
gameActive = false;
LK.setScore(LK.getScore() + 1000 + score);
LK.showYouWin();
}
if (huggy.intersects(player)) {
gameActive = false;
LK.getSound('caught').play();
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
}
if (player.y > 500) {
var lastObstacleY = obstacles.length > 0 ? obstacles[0].y : player.y;
var nextSpawnY = lastObstacleY - 1000;
if (Math.random() < 0.7) {
spawnObstacle(nextSpawnY);
}
if (Math.random() < 0.15) {
spawnPowerUp(nextSpawnY);
}
}
};
initializeLevel();
LK.playMusic('bgmusic');