/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -5;
self.update = function () {
self.x += self.speed;
};
return self;
});
var Character = Container.expand(function () {
var self = Container.call(this);
var characterGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 1.0
});
self.velocityY = 0;
self.gravity = 0.8;
self.jumpPower = -20;
self.isGrounded = false;
self.groundY = 2652; // Ground level
self.jump = function () {
if (self.isGrounded) {
self.velocityY = self.jumpPower;
self.isGrounded = false;
LK.getSound('jump').play();
}
};
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
self.y += self.velocityY;
// Ground collision
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isGrounded = true;
}
};
return self;
});
var LuckyBlock = Container.expand(function () {
var self = Container.call(this);
var luckyBlockGraphics = self.attachAsset('luckyBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var character;
var blocks = [];
var gameSpeed = 8;
var blockSpawnTimer = 0;
var blockSpawnInterval = 90; // frames between spawns
var distance = 0;
var lastGroundCheck = true;
var lastDistanceMilestone = 0;
var dayNightTimer = 0;
var isDayTime = true;
var health = 5;
var maxHealth = 5;
var healthBars = [];
var bestDistance = storage.bestDistance || 0;
var luckyBlock = null;
var lives = 5;
var maxLives = 10;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1.0,
x: 0,
y: 2732
}));
// Create character
character = game.addChild(new Character());
character.x = 300;
character.y = character.groundY;
// Create score display
var scoreText = new Text2('Distance: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create best distance display in top-right corner
var bestDistanceText = new Text2('Best: ' + bestDistance, {
size: 50,
fill: 0xFFD700
});
bestDistanceText.anchor.set(1.0, 0);
LK.gui.topRight.addChild(bestDistanceText);
// Create health bars in top-left corner
for (var h = 0; h < 5; h++) {
var healthBar = LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 150 + h * 70,
// Space them out horizontally
y: 100
});
healthBars.push(healthBar);
LK.gui.topLeft.addChild(healthBar);
}
// Function to update health bar display
function updateHealthBars() {
for (var i = 0; i < healthBars.length; i++) {
if (i < health) {
healthBars[i].alpha = 1.0; // Show full health
} else {
healthBars[i].alpha = 0.3; // Show dimmed for lost health
}
}
}
// Initialize health bars display
updateHealthBars();
// Touch controls
game.down = function (x, y, obj) {
character.jump();
};
// Game update loop
game.update = function () {
// Update distance
distance += gameSpeed;
LK.setScore(Math.floor(distance / 10));
scoreText.setText('Distance: ' + Math.floor(distance / 10));
// Spawn blocks
blockSpawnTimer++;
// Random spawn interval for varied timing with gaps
var randomSpawnInterval = blockSpawnInterval + Math.floor(Math.random() * 40) - 20; // ±20 frames variation
if (blockSpawnTimer >= randomSpawnInterval) {
blockSpawnTimer = 0;
// 50% chance to spawn a block (creates gaps)
if (Math.random() < 0.5) {
// Create new block on top of ground
var newBlock = new Block();
newBlock.x = 2200; // Spawn off-screen right
// Spawn blocks on top of the ground surface
newBlock.y = 2652; // Ground surface level (2732 - 80)
// Set speed based on current distance milestone
var currentMilestone = Math.floor(distance / 1000);
var speedMultiplier = 1 + currentMilestone * 0.5;
newBlock.speed = -5 * speedMultiplier;
blocks.push(newBlock);
game.addChild(newBlock);
}
// Spawn lucky block occasionally above character's head level
if (Math.random() < 0.1 && !luckyBlock) {
// 10% chance and only if no lucky block exists
luckyBlock = new LuckyBlock();
luckyBlock.x = 2200; // Spawn off-screen right
luckyBlock.y = character.y - 150; // Above character's head level
luckyBlock.lastIntersecting = false;
game.addChild(luckyBlock);
// Display "Lucky Blok has a spawned" message
var luckyMessage = new Text2('Lucky Blok has a spawned', {
size: 80,
fill: 0xFFFF00,
// Yellow color
stroke: 0x000000,
// Black outline
strokeThickness: 4
});
luckyMessage.anchor.set(0.5, 0.5);
luckyMessage.x = 1024; // Center of screen
luckyMessage.y = 400; // Upper part of screen
game.addChild(luckyMessage);
// Animate the message to fade out after 2 seconds
tween(luckyMessage, {
alpha: 0
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
luckyMessage.destroy();
}
});
}
}
// Update blocks
for (var i = blocks.length - 1; i >= 0; i--) {
var block = blocks[i];
// Track previous position for collision detection
if (block.lastIntersecting === undefined) {
block.lastIntersecting = false;
}
// Remove blocks that have moved off-screen
if (block.x < -200) {
block.destroy();
blocks.splice(i, 1);
continue;
}
// Check collision with character
var currentIntersecting = character.intersects(block);
if (!block.lastIntersecting && currentIntersecting) {
// Collision detected
LK.getSound('collision').play();
LK.effects.flashScreen(0xff0000, 500);
// Reduce health
health--;
// Update health bar display
updateHealthBars();
// Check if game over
if (health <= 0) {
// Update best distance if current is higher
var currentDistance = Math.floor(distance / 10);
if (currentDistance > bestDistance) {
bestDistance = currentDistance;
storage.bestDistance = bestDistance;
}
LK.showGameOver();
return;
}
}
block.lastIntersecting = currentIntersecting;
}
// Update lucky block
if (luckyBlock) {
// Move lucky block left
luckyBlock.x -= gameSpeed;
// Remove if off-screen
if (luckyBlock.x < -200) {
luckyBlock.destroy();
luckyBlock = null;
} else {
// Check collision with character for life bonus
var luckyIntersecting = character.intersects(luckyBlock);
if (!luckyBlock.lastIntersecting && luckyIntersecting && !luckyBlock.collected) {
// Lucky block collected - add life
luckyBlock.collected = true;
lives++;
if (lives > maxLives) lives = maxLives;
// Increase health up to maximum 1 bonus
var healthBonus = Math.min(1, maxHealth - health);
health += healthBonus;
// Update health bar display
updateHealthBars();
// Play sound and visual effect
LK.getSound('powerup').play();
LK.effects.flashScreen(0x00FF00, 300); // Green flash
// Remove lucky block
luckyBlock.destroy();
luckyBlock = null;
}
if (luckyBlock) {
luckyBlock.lastIntersecting = luckyIntersecting;
}
}
}
// Check if character fell off screen
var currentGroundCheck = character.y <= character.groundY + 10;
if (lastGroundCheck && !currentGroundCheck && character.y > 2800) {
// Character fell off screen
// Update best distance if current is higher
var currentDistance = Math.floor(distance / 10);
if (currentDistance > bestDistance) {
bestDistance = currentDistance;
storage.bestDistance = bestDistance;
}
LK.showGameOver();
return;
}
lastGroundCheck = currentGroundCheck;
// Speed up blocks every 1000 distance
var currentDistanceMilestone = Math.floor(distance / 1000);
if (currentDistanceMilestone > (lastDistanceMilestone || 0)) {
// Calculate new speed multiplier (0.5x faster each 1000 distance)
var speedMultiplier = 1 + currentDistanceMilestone * 0.5;
var newBlockSpeed = -5 * speedMultiplier;
// Update speed for all existing blocks
for (var k = 0; k < blocks.length; k++) {
blocks[k].speed = newBlockSpeed;
}
// Update the milestone tracker
lastDistanceMilestone = currentDistanceMilestone;
}
// Day/Night cycle - every 2 minutes (7200 ticks at 60fps)
dayNightTimer++;
if (dayNightTimer >= 7200) {
dayNightTimer = 0;
isDayTime = !isDayTime;
var targetColor = isDayTime ? 0x87CEEB : 0x191970; // Day blue vs Night dark blue
tween(game, {
backgroundColor: targetColor
}, {
duration: 2000,
easing: tween.easeInOut
});
}
// Increase difficulty over time
if (LK.ticks % 600 === 0) {
// Every 10 seconds
if (blockSpawnInterval > 45) {
blockSpawnInterval -= 5;
}
if (gameSpeed < 12) {
gameSpeed += 0.5;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -5;
self.update = function () {
self.x += self.speed;
};
return self;
});
var Character = Container.expand(function () {
var self = Container.call(this);
var characterGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 1.0
});
self.velocityY = 0;
self.gravity = 0.8;
self.jumpPower = -20;
self.isGrounded = false;
self.groundY = 2652; // Ground level
self.jump = function () {
if (self.isGrounded) {
self.velocityY = self.jumpPower;
self.isGrounded = false;
LK.getSound('jump').play();
}
};
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
self.y += self.velocityY;
// Ground collision
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isGrounded = true;
}
};
return self;
});
var LuckyBlock = Container.expand(function () {
var self = Container.call(this);
var luckyBlockGraphics = self.attachAsset('luckyBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var character;
var blocks = [];
var gameSpeed = 8;
var blockSpawnTimer = 0;
var blockSpawnInterval = 90; // frames between spawns
var distance = 0;
var lastGroundCheck = true;
var lastDistanceMilestone = 0;
var dayNightTimer = 0;
var isDayTime = true;
var health = 5;
var maxHealth = 5;
var healthBars = [];
var bestDistance = storage.bestDistance || 0;
var luckyBlock = null;
var lives = 5;
var maxLives = 10;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1.0,
x: 0,
y: 2732
}));
// Create character
character = game.addChild(new Character());
character.x = 300;
character.y = character.groundY;
// Create score display
var scoreText = new Text2('Distance: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create best distance display in top-right corner
var bestDistanceText = new Text2('Best: ' + bestDistance, {
size: 50,
fill: 0xFFD700
});
bestDistanceText.anchor.set(1.0, 0);
LK.gui.topRight.addChild(bestDistanceText);
// Create health bars in top-left corner
for (var h = 0; h < 5; h++) {
var healthBar = LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 150 + h * 70,
// Space them out horizontally
y: 100
});
healthBars.push(healthBar);
LK.gui.topLeft.addChild(healthBar);
}
// Function to update health bar display
function updateHealthBars() {
for (var i = 0; i < healthBars.length; i++) {
if (i < health) {
healthBars[i].alpha = 1.0; // Show full health
} else {
healthBars[i].alpha = 0.3; // Show dimmed for lost health
}
}
}
// Initialize health bars display
updateHealthBars();
// Touch controls
game.down = function (x, y, obj) {
character.jump();
};
// Game update loop
game.update = function () {
// Update distance
distance += gameSpeed;
LK.setScore(Math.floor(distance / 10));
scoreText.setText('Distance: ' + Math.floor(distance / 10));
// Spawn blocks
blockSpawnTimer++;
// Random spawn interval for varied timing with gaps
var randomSpawnInterval = blockSpawnInterval + Math.floor(Math.random() * 40) - 20; // ±20 frames variation
if (blockSpawnTimer >= randomSpawnInterval) {
blockSpawnTimer = 0;
// 50% chance to spawn a block (creates gaps)
if (Math.random() < 0.5) {
// Create new block on top of ground
var newBlock = new Block();
newBlock.x = 2200; // Spawn off-screen right
// Spawn blocks on top of the ground surface
newBlock.y = 2652; // Ground surface level (2732 - 80)
// Set speed based on current distance milestone
var currentMilestone = Math.floor(distance / 1000);
var speedMultiplier = 1 + currentMilestone * 0.5;
newBlock.speed = -5 * speedMultiplier;
blocks.push(newBlock);
game.addChild(newBlock);
}
// Spawn lucky block occasionally above character's head level
if (Math.random() < 0.1 && !luckyBlock) {
// 10% chance and only if no lucky block exists
luckyBlock = new LuckyBlock();
luckyBlock.x = 2200; // Spawn off-screen right
luckyBlock.y = character.y - 150; // Above character's head level
luckyBlock.lastIntersecting = false;
game.addChild(luckyBlock);
// Display "Lucky Blok has a spawned" message
var luckyMessage = new Text2('Lucky Blok has a spawned', {
size: 80,
fill: 0xFFFF00,
// Yellow color
stroke: 0x000000,
// Black outline
strokeThickness: 4
});
luckyMessage.anchor.set(0.5, 0.5);
luckyMessage.x = 1024; // Center of screen
luckyMessage.y = 400; // Upper part of screen
game.addChild(luckyMessage);
// Animate the message to fade out after 2 seconds
tween(luckyMessage, {
alpha: 0
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
luckyMessage.destroy();
}
});
}
}
// Update blocks
for (var i = blocks.length - 1; i >= 0; i--) {
var block = blocks[i];
// Track previous position for collision detection
if (block.lastIntersecting === undefined) {
block.lastIntersecting = false;
}
// Remove blocks that have moved off-screen
if (block.x < -200) {
block.destroy();
blocks.splice(i, 1);
continue;
}
// Check collision with character
var currentIntersecting = character.intersects(block);
if (!block.lastIntersecting && currentIntersecting) {
// Collision detected
LK.getSound('collision').play();
LK.effects.flashScreen(0xff0000, 500);
// Reduce health
health--;
// Update health bar display
updateHealthBars();
// Check if game over
if (health <= 0) {
// Update best distance if current is higher
var currentDistance = Math.floor(distance / 10);
if (currentDistance > bestDistance) {
bestDistance = currentDistance;
storage.bestDistance = bestDistance;
}
LK.showGameOver();
return;
}
}
block.lastIntersecting = currentIntersecting;
}
// Update lucky block
if (luckyBlock) {
// Move lucky block left
luckyBlock.x -= gameSpeed;
// Remove if off-screen
if (luckyBlock.x < -200) {
luckyBlock.destroy();
luckyBlock = null;
} else {
// Check collision with character for life bonus
var luckyIntersecting = character.intersects(luckyBlock);
if (!luckyBlock.lastIntersecting && luckyIntersecting && !luckyBlock.collected) {
// Lucky block collected - add life
luckyBlock.collected = true;
lives++;
if (lives > maxLives) lives = maxLives;
// Increase health up to maximum 1 bonus
var healthBonus = Math.min(1, maxHealth - health);
health += healthBonus;
// Update health bar display
updateHealthBars();
// Play sound and visual effect
LK.getSound('powerup').play();
LK.effects.flashScreen(0x00FF00, 300); // Green flash
// Remove lucky block
luckyBlock.destroy();
luckyBlock = null;
}
if (luckyBlock) {
luckyBlock.lastIntersecting = luckyIntersecting;
}
}
}
// Check if character fell off screen
var currentGroundCheck = character.y <= character.groundY + 10;
if (lastGroundCheck && !currentGroundCheck && character.y > 2800) {
// Character fell off screen
// Update best distance if current is higher
var currentDistance = Math.floor(distance / 10);
if (currentDistance > bestDistance) {
bestDistance = currentDistance;
storage.bestDistance = bestDistance;
}
LK.showGameOver();
return;
}
lastGroundCheck = currentGroundCheck;
// Speed up blocks every 1000 distance
var currentDistanceMilestone = Math.floor(distance / 1000);
if (currentDistanceMilestone > (lastDistanceMilestone || 0)) {
// Calculate new speed multiplier (0.5x faster each 1000 distance)
var speedMultiplier = 1 + currentDistanceMilestone * 0.5;
var newBlockSpeed = -5 * speedMultiplier;
// Update speed for all existing blocks
for (var k = 0; k < blocks.length; k++) {
blocks[k].speed = newBlockSpeed;
}
// Update the milestone tracker
lastDistanceMilestone = currentDistanceMilestone;
}
// Day/Night cycle - every 2 minutes (7200 ticks at 60fps)
dayNightTimer++;
if (dayNightTimer >= 7200) {
dayNightTimer = 0;
isDayTime = !isDayTime;
var targetColor = isDayTime ? 0x87CEEB : 0x191970; // Day blue vs Night dark blue
tween(game, {
backgroundColor: targetColor
}, {
duration: 2000,
easing: tween.easeInOut
});
}
// Increase difficulty over time
if (LK.ticks % 600 === 0) {
// Every 10 seconds
if (blockSpawnInterval > 45) {
blockSpawnInterval -= 5;
}
if (gameSpeed < 12) {
gameSpeed += 0.5;
}
}
};
make a mario lucky bloks. In-Game asset. 2d. High contrast. No shadows
make a mario bros. In-Game asset. 2d. High contrast. No shadows
make a mario 8-bit ant. In-Game asset. 2d. High contrast. No shadows
make a mario ground. In-Game asset. 2d. High contrast. No shadows
red heart 8-bit mario. In-Game asset. 2d. High contrast. No shadows