/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Obstacle = Container.expand(function (type) {
var self = Container.call(this);
if (type === 'spike') {
var obstacleGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
self.obstacleType = 'spike';
} else {
var obstacleGraphics = self.attachAsset('barrier', {
anchorX: 0.5,
anchorY: 1
});
self.obstacleType = 'barrier';
}
self.update = function () {
self.x -= gameSpeed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.groundY = 2500;
self.isOnGround = true;
self.isSliding = false;
self.isInvincible = false;
self.jumpPower = -25;
self.gravity = 1.5;
self.slideTimer = 0;
self.invincibleTimer = 0;
self.jump = function () {
if (self.isOnGround && !self.isSliding) {
self.velocityY = self.jumpPower;
self.isOnGround = false;
LK.getSound('jump').play();
}
};
self.slide = function () {
if (self.isOnGround && !self.isSliding) {
self.isSliding = true;
self.slideTimer = 30;
playerGraphics.scaleY = 0.5;
self.y += 20;
}
};
self.update = function () {
// Handle gravity and jumping
if (!self.isOnGround) {
self.velocityY += self.gravity;
self.y += self.velocityY;
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isOnGround = true;
}
}
// Handle sliding
if (self.isSliding) {
self.slideTimer--;
if (self.slideTimer <= 0) {
self.isSliding = false;
playerGraphics.scaleY = 1;
self.y = self.groundY;
}
}
// Handle invincibility
if (self.isInvincible) {
self.invincibleTimer--;
playerGraphics.alpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.5);
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
playerGraphics.alpha = 1;
}
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
powerGraphics.rotation += 0.15;
powerGraphics.scaleX = 1 + 0.2 * Math.sin(LK.ticks * 0.2);
powerGraphics.scaleY = 1 + 0.2 * Math.sin(LK.ticks * 0.2);
self.x -= gameSpeed;
};
return self;
});
var Ring = Container.expand(function () {
var self = Container.call(this);
var ringGraphics = self.attachAsset('ring', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
ringGraphics.rotation += 0.1;
self.x -= gameSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var player;
var rings = [];
var obstacles = [];
var powerups = [];
var gameSpeed = 8;
var baseSpeed = 8;
var maxSpeed = 20;
var speedIncrement = 0.01;
var spawnTimer = 0;
var ringSpawnTimer = 0;
var powerupSpawnTimer = 0;
var distance = 0;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 0
}));
ground.x = 0;
ground.y = 2600;
// Create player
player = game.addChild(new Player());
player.x = 300;
player.y = player.groundY;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 150;
scoreText.y = 50;
LK.gui.topLeft.addChild(scoreText);
var speedText = new Text2('Speed: ' + Math.floor(gameSpeed), {
size: 50,
fill: 0xFFFFFF
});
speedText.anchor.set(1, 0);
speedText.x = -50;
speedText.y = 50;
LK.gui.topRight.addChild(speedText);
// Input handling
game.down = function (x, y, obj) {
if (y > 2732 / 2) {
player.slide();
} else {
player.jump();
}
};
function spawnRing() {
var ring = new Ring();
ring.x = 2200;
ring.y = player.groundY - 50 - Math.random() * 200;
rings.push(ring);
game.addChild(ring);
}
function spawnObstacle() {
var type = Math.random() < 0.6 ? 'spike' : 'barrier';
var obstacle = new Obstacle(type);
obstacle.x = 2200;
if (type === 'spike') {
obstacle.y = player.groundY;
} else {
obstacle.y = player.groundY - 60;
}
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerup() {
var powerup = new PowerUp();
powerup.x = 2200;
powerup.y = player.groundY - 100 - Math.random() * 150;
powerups.push(powerup);
game.addChild(powerup);
}
game.update = function () {
// Increase speed over time
gameSpeed = Math.min(maxSpeed, baseSpeed + distance * speedIncrement);
distance += gameSpeed;
// Update UI
scoreText.setText('Score: ' + LK.getScore());
speedText.setText('Speed: ' + Math.floor(gameSpeed));
// Spawn rings
ringSpawnTimer++;
if (ringSpawnTimer > 40 - gameSpeed) {
ringSpawnTimer = 0;
if (Math.random() < 0.7) {
spawnRing();
}
}
// Spawn obstacles
spawnTimer++;
if (spawnTimer > 80 - gameSpeed * 2) {
spawnTimer = 0;
spawnObstacle();
}
// Spawn powerups
powerupSpawnTimer++;
if (powerupSpawnTimer > 600) {
powerupSpawnTimer = 0;
if (Math.random() < 0.3) {
spawnPowerup();
}
}
// Check ring collisions
for (var i = rings.length - 1; i >= 0; i--) {
var ring = rings[i];
if (ring.x < -100) {
ring.destroy();
rings.splice(i, 1);
continue;
}
if (!ring.collected && player.intersects(ring)) {
ring.collected = true;
LK.setScore(LK.getScore() + 10);
LK.getSound('ring').play();
ring.destroy();
rings.splice(i, 1);
}
}
// Check obstacle collisions
for (var j = obstacles.length - 1; j >= 0; j--) {
var obstacle = obstacles[j];
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(j, 1);
continue;
}
if (!player.isInvincible && player.intersects(obstacle)) {
// Check collision type
var collision = false;
if (obstacle.obstacleType === 'spike' && !player.isSliding) {
collision = true;
} else if (obstacle.obstacleType === 'barrier' && !player.isSliding) {
collision = true;
}
if (collision) {
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
}
}
// Check powerup collisions
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
if (powerup.x < -100) {
powerup.destroy();
powerups.splice(k, 1);
continue;
}
if (!powerup.collected && player.intersects(powerup)) {
powerup.collected = true;
player.isInvincible = true;
player.invincibleTimer = 180;
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0xffff00, 500);
powerup.destroy();
powerups.splice(k, 1);
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Obstacle = Container.expand(function (type) {
var self = Container.call(this);
if (type === 'spike') {
var obstacleGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
self.obstacleType = 'spike';
} else {
var obstacleGraphics = self.attachAsset('barrier', {
anchorX: 0.5,
anchorY: 1
});
self.obstacleType = 'barrier';
}
self.update = function () {
self.x -= gameSpeed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.groundY = 2500;
self.isOnGround = true;
self.isSliding = false;
self.isInvincible = false;
self.jumpPower = -25;
self.gravity = 1.5;
self.slideTimer = 0;
self.invincibleTimer = 0;
self.jump = function () {
if (self.isOnGround && !self.isSliding) {
self.velocityY = self.jumpPower;
self.isOnGround = false;
LK.getSound('jump').play();
}
};
self.slide = function () {
if (self.isOnGround && !self.isSliding) {
self.isSliding = true;
self.slideTimer = 30;
playerGraphics.scaleY = 0.5;
self.y += 20;
}
};
self.update = function () {
// Handle gravity and jumping
if (!self.isOnGround) {
self.velocityY += self.gravity;
self.y += self.velocityY;
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isOnGround = true;
}
}
// Handle sliding
if (self.isSliding) {
self.slideTimer--;
if (self.slideTimer <= 0) {
self.isSliding = false;
playerGraphics.scaleY = 1;
self.y = self.groundY;
}
}
// Handle invincibility
if (self.isInvincible) {
self.invincibleTimer--;
playerGraphics.alpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.5);
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
playerGraphics.alpha = 1;
}
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
powerGraphics.rotation += 0.15;
powerGraphics.scaleX = 1 + 0.2 * Math.sin(LK.ticks * 0.2);
powerGraphics.scaleY = 1 + 0.2 * Math.sin(LK.ticks * 0.2);
self.x -= gameSpeed;
};
return self;
});
var Ring = Container.expand(function () {
var self = Container.call(this);
var ringGraphics = self.attachAsset('ring', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
ringGraphics.rotation += 0.1;
self.x -= gameSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var player;
var rings = [];
var obstacles = [];
var powerups = [];
var gameSpeed = 8;
var baseSpeed = 8;
var maxSpeed = 20;
var speedIncrement = 0.01;
var spawnTimer = 0;
var ringSpawnTimer = 0;
var powerupSpawnTimer = 0;
var distance = 0;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 0
}));
ground.x = 0;
ground.y = 2600;
// Create player
player = game.addChild(new Player());
player.x = 300;
player.y = player.groundY;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 150;
scoreText.y = 50;
LK.gui.topLeft.addChild(scoreText);
var speedText = new Text2('Speed: ' + Math.floor(gameSpeed), {
size: 50,
fill: 0xFFFFFF
});
speedText.anchor.set(1, 0);
speedText.x = -50;
speedText.y = 50;
LK.gui.topRight.addChild(speedText);
// Input handling
game.down = function (x, y, obj) {
if (y > 2732 / 2) {
player.slide();
} else {
player.jump();
}
};
function spawnRing() {
var ring = new Ring();
ring.x = 2200;
ring.y = player.groundY - 50 - Math.random() * 200;
rings.push(ring);
game.addChild(ring);
}
function spawnObstacle() {
var type = Math.random() < 0.6 ? 'spike' : 'barrier';
var obstacle = new Obstacle(type);
obstacle.x = 2200;
if (type === 'spike') {
obstacle.y = player.groundY;
} else {
obstacle.y = player.groundY - 60;
}
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerup() {
var powerup = new PowerUp();
powerup.x = 2200;
powerup.y = player.groundY - 100 - Math.random() * 150;
powerups.push(powerup);
game.addChild(powerup);
}
game.update = function () {
// Increase speed over time
gameSpeed = Math.min(maxSpeed, baseSpeed + distance * speedIncrement);
distance += gameSpeed;
// Update UI
scoreText.setText('Score: ' + LK.getScore());
speedText.setText('Speed: ' + Math.floor(gameSpeed));
// Spawn rings
ringSpawnTimer++;
if (ringSpawnTimer > 40 - gameSpeed) {
ringSpawnTimer = 0;
if (Math.random() < 0.7) {
spawnRing();
}
}
// Spawn obstacles
spawnTimer++;
if (spawnTimer > 80 - gameSpeed * 2) {
spawnTimer = 0;
spawnObstacle();
}
// Spawn powerups
powerupSpawnTimer++;
if (powerupSpawnTimer > 600) {
powerupSpawnTimer = 0;
if (Math.random() < 0.3) {
spawnPowerup();
}
}
// Check ring collisions
for (var i = rings.length - 1; i >= 0; i--) {
var ring = rings[i];
if (ring.x < -100) {
ring.destroy();
rings.splice(i, 1);
continue;
}
if (!ring.collected && player.intersects(ring)) {
ring.collected = true;
LK.setScore(LK.getScore() + 10);
LK.getSound('ring').play();
ring.destroy();
rings.splice(i, 1);
}
}
// Check obstacle collisions
for (var j = obstacles.length - 1; j >= 0; j--) {
var obstacle = obstacles[j];
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(j, 1);
continue;
}
if (!player.isInvincible && player.intersects(obstacle)) {
// Check collision type
var collision = false;
if (obstacle.obstacleType === 'spike' && !player.isSliding) {
collision = true;
} else if (obstacle.obstacleType === 'barrier' && !player.isSliding) {
collision = true;
}
if (collision) {
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
}
}
// Check powerup collisions
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
if (powerup.x < -100) {
powerup.destroy();
powerups.splice(k, 1);
continue;
}
if (!powerup.collected && player.intersects(powerup)) {
powerup.collected = true;
player.isInvincible = true;
player.invincibleTimer = 180;
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0xffff00, 500);
powerup.destroy();
powerups.splice(k, 1);
}
}
};