/****
* Classes
****/
//var tween = LK.import("@upit/tween.v1");
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyAsset = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemyAsset.width / 2;
self.speedY = 14 + Math.random() * 10; // Random fall speed
// Set initial position
self.x = 150 + Math.random() * (2048 - 300);
self.y = -enemyAsset.height / 2;
self.update = function () {
self.y += self.speedY;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerAsset = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerAsset.width / 2;
self.groundY = 2400; // Y position of the ground (bottom margin)
// Set initial position
self.x = 2048 / 2;
self.y = self.groundY;
// Call every frame
self.update = function () {
// No jump or gravity, player stays on ground
};
// Move left by a fixed amount, clamp to screen
self.moveLeft = function () {
self.x -= 180;
if (self.x < self.radius + 20) self.x = self.radius + 20;
};
// Move right by a fixed amount, clamp to screen
self.moveRight = function () {
self.x += 180;
if (self.x > 2048 - self.radius - 20) self.x = 2048 - self.radius - 20;
};
return self;
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
var starAsset = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = starAsset.width / 2;
self.speedY = 12 + Math.random() * 8; // Random fall speed
// Set initial position
self.x = 150 + Math.random() * (2048 - 300);
self.y = -starAsset.height / 2;
self.update = function () {
self.y += self.speedY;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x888888
});
/****
* Game Code
****/
// Enemy: red box
// Star: smaller white ellipse
// Player character: yellow ellipse (star jumper)
// Score display (top left, avoid 100x100 area)
var scoreTxt = new Text2('0', {
size: 110,
fill: 0xFFF700
});
scoreTxt.anchor.set(0, 0); // Top left
scoreTxt.x = 120; // Leave margin for menu
scoreTxt.y = 40;
LK.gui.top.addChild(scoreTxt);
// Player instance
var player = new Player();
game.addChild(player);
// Add 'Left' and 'Right' text labels
var leftLabel = new Text2('Left', {
size: 100,
fill: 0xffffff
});
leftLabel.anchor.set(0.5, 1);
leftLabel.x = 2048 * 0.18;
leftLabel.y = 2732 - 80;
game.addChild(leftLabel);
var rightLabel = new Text2('Right', {
size: 100,
fill: 0xffffff
});
rightLabel.anchor.set(0.5, 1);
rightLabel.x = 2048 * 0.82;
rightLabel.y = 2732 - 80;
game.addChild(rightLabel);
// Arrays for stars and enemies
var stars = [];
var enemies = [];
// Timers for spawning
var starSpawnTimer = 0;
var enemySpawnTimer = 0;
// Helper: spawn a star
function spawnStar() {
var star = new Star();
stars.push(star);
game.addChild(star);
}
// Helper: spawn an enemy
function spawnEnemy() {
// Spawn two enemies
for (var i = 0; i < 2; i++) {
var enemy = new Enemy();
enemies.push(enemy);
game.addChild(enemy);
}
}
// Tap left/right screen to move player
game.down = function (x, y, obj) {
if (x < 2048 / 2) {
player.moveLeft();
} else {
player.moveRight();
}
};
// Main update loop
game.update = function () {
// Update player
player.update();
// Spawn stars
starSpawnTimer--;
if (starSpawnTimer <= 0) {
spawnStar();
starSpawnTimer = 36 + Math.floor(Math.random() * 24); // 0.6-1.0s at 60fps
}
// Spawn enemies
enemySpawnTimer--;
if (enemySpawnTimer <= 0) {
spawnEnemy();
enemySpawnTimer = 60 + Math.floor(Math.random() * 40); // 1.0-1.7s at 60fps
}
// Update and check stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
star.update();
// Off screen
if (star.y - star.radius > 2732) {
star.destroy();
stars.splice(i, 1);
continue;
}
// Collision with player
if (player.intersects(star)) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
star.destroy();
stars.splice(i, 1);
continue;
}
}
// Update and check enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
enemy.update();
// Off screen
if (enemy.y - enemy.radius > 2732) {
enemy.destroy();
enemies.splice(j, 1);
continue;
}
// Collision with player
if (player.intersects(enemy)) {
if (player.extraLife && player.extraLife > 0) {
player.extraLife--;
LK.effects.flashScreen(0x00ff00, 600);
// Remove enemy and continue
enemy.destroy();
enemies.splice(j, 1);
continue;
} else {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
}
};
// Set initial score
LK.setScore(0);
scoreTxt.setText('0'); /****
* Classes
****/
//var tween = LK.import("@upit/tween.v1");
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyAsset = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemyAsset.width / 2;
self.speedY = 14 + Math.random() * 10; // Random fall speed
// Set initial position
self.x = 150 + Math.random() * (2048 - 300);
self.y = -enemyAsset.height / 2;
self.update = function () {
self.y += self.speedY;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerAsset = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerAsset.width / 2;
self.groundY = 2400; // Y position of the ground (bottom margin)
// Set initial position
self.x = 2048 / 2;
self.y = self.groundY;
// Call every frame
self.update = function () {
// No jump or gravity, player stays on ground
};
// Move left by a fixed amount, clamp to screen
self.moveLeft = function () {
self.x -= 180;
if (self.x < self.radius + 20) self.x = self.radius + 20;
};
// Move right by a fixed amount, clamp to screen
self.moveRight = function () {
self.x += 180;
if (self.x > 2048 - self.radius - 20) self.x = 2048 - self.radius - 20;
};
return self;
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
var starAsset = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = starAsset.width / 2;
self.speedY = 12 + Math.random() * 8; // Random fall speed
// Set initial position
self.x = 150 + Math.random() * (2048 - 300);
self.y = -starAsset.height / 2;
self.update = function () {
self.y += self.speedY;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x888888
});
/****
* Game Code
****/
// Enemy: red box
// Star: smaller white ellipse
// Player character: yellow ellipse (star jumper)
// Score display (top left, avoid 100x100 area)
var scoreTxt = new Text2('0', {
size: 110,
fill: 0xFFF700
});
scoreTxt.anchor.set(0, 0); // Top left
scoreTxt.x = 120; // Leave margin for menu
scoreTxt.y = 40;
LK.gui.top.addChild(scoreTxt);
// Player instance
var player = new Player();
game.addChild(player);
// Add 'Left' and 'Right' text labels
var leftLabel = new Text2('Left', {
size: 100,
fill: 0xffffff
});
leftLabel.anchor.set(0.5, 1);
leftLabel.x = 2048 * 0.18;
leftLabel.y = 2732 - 80;
game.addChild(leftLabel);
var rightLabel = new Text2('Right', {
size: 100,
fill: 0xffffff
});
rightLabel.anchor.set(0.5, 1);
rightLabel.x = 2048 * 0.82;
rightLabel.y = 2732 - 80;
game.addChild(rightLabel);
// Arrays for stars and enemies
var stars = [];
var enemies = [];
// Timers for spawning
var starSpawnTimer = 0;
var enemySpawnTimer = 0;
// Helper: spawn a star
function spawnStar() {
var star = new Star();
stars.push(star);
game.addChild(star);
}
// Helper: spawn an enemy
function spawnEnemy() {
// Spawn two enemies
for (var i = 0; i < 2; i++) {
var enemy = new Enemy();
enemies.push(enemy);
game.addChild(enemy);
}
}
// Tap left/right screen to move player
game.down = function (x, y, obj) {
if (x < 2048 / 2) {
player.moveLeft();
} else {
player.moveRight();
}
};
// Main update loop
game.update = function () {
// Update player
player.update();
// Spawn stars
starSpawnTimer--;
if (starSpawnTimer <= 0) {
spawnStar();
starSpawnTimer = 36 + Math.floor(Math.random() * 24); // 0.6-1.0s at 60fps
}
// Spawn enemies
enemySpawnTimer--;
if (enemySpawnTimer <= 0) {
spawnEnemy();
enemySpawnTimer = 60 + Math.floor(Math.random() * 40); // 1.0-1.7s at 60fps
}
// Update and check stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
star.update();
// Off screen
if (star.y - star.radius > 2732) {
star.destroy();
stars.splice(i, 1);
continue;
}
// Collision with player
if (player.intersects(star)) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
star.destroy();
stars.splice(i, 1);
continue;
}
}
// Update and check enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
enemy.update();
// Off screen
if (enemy.y - enemy.radius > 2732) {
enemy.destroy();
enemies.splice(j, 1);
continue;
}
// Collision with player
if (player.intersects(enemy)) {
if (player.extraLife && player.extraLife > 0) {
player.extraLife--;
LK.effects.flashScreen(0x00ff00, 600);
// Remove enemy and continue
enemy.destroy();
enemies.splice(j, 1);
continue;
} else {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
}
};
// Set initial score
LK.setScore(0);
scoreTxt.setText('0');