/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Obstacle class: spikes or blocks
var Obstacle = Container.expand(function () {
var self = Container.call(this);
// Randomly choose obstacle type: spike or block
var type = Math.random() < 0.5 ? 'spike' : 'block';
if (type === 'spike') {
// Spike: triangle (use box asset, scale to triangle shape)
var spikeAsset = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
// width: 80, height: 120, color: 0xff4444, shape: 'box'
// We'll visually "fake" a triangle by scaling Y and X
spikeAsset.scaleX = 1;
spikeAsset.scaleY = 1.2;
} else {
// Block: rectangle
var blockAsset = self.attachAsset('obstacleBlock', {
anchorX: 0.5,
anchorY: 1
});
// width: 120, height: 120, color: 0x888888, shape: 'box'
}
self.type = type;
// Update method: move left
self.update = function () {
self.x -= obstacleSpeed;
};
return self;
});
// Player class: geometric box that auto-runs and jumps
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach player asset (box)
var playerAsset = self.attachAsset('playerBox', {
anchorX: 0.5,
anchorY: 1
});
// Physics properties
self.vy = 0; // vertical velocity
self.isJumping = false;
self.grounded = true;
// Constants
self.jumpVelocity = -48; // negative is up
self.gravity = 5; // gravity per frame
// Set initial size and color
// (Asset will be created automatically)
// width: 120, height: 120, color: 0x2eccff
// Update method called every tick
self.update = function () {
// Apply gravity
if (!self.grounded) {
self.vy += self.gravity;
self.y += self.vy;
// Check for landing on ground
if (self.y >= groundY) {
self.y = groundY;
self.vy = 0;
self.grounded = true;
self.isJumping = false;
}
}
};
// Jump method
self.jump = function () {
if (self.grounded && !self.isJumping) {
self.vy = self.jumpVelocity;
self.grounded = false;
self.isJumping = true;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181c2c
});
/****
* Game Code
****/
// Tween plugin for jump and obstacle animations
// --- Constants ---
var groundY = 2200; // Y position of ground (player stands here)
var playerStartX = 500;
var playerStartY = groundY;
var obstacleStartX = 2200; // Obstacles spawn off-screen right
var obstacleSpeed = 28; // How fast obstacles move left
var minObstacleGap = 500; // Minimum distance between obstacles
var maxObstacleGap = 900; // Maximum distance between obstacles
// --- Asset Initialization (auto by LK, but for clarity) ---
// --- Game State ---
var player;
var obstacles = [];
var score = 0;
var scoreTxt;
var lastObstacleX = 0;
var gameStarted = false;
// --- Ground ---
var ground = LK.getAsset('ground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: groundY + 1
});
game.addChild(ground);
// --- Player ---
player = new Player();
player.x = playerStartX;
player.y = playerStartY;
game.addChild(player);
// --- Score Display ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Start State ---
resetGame();
function resetGame() {
// Remove all obstacles
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
obstacles = [];
// Reset player
player.x = playerStartX;
player.y = playerStartY;
player.vy = 0;
player.grounded = true;
player.isJumping = false;
// Reset score
score = 0;
LK.setScore(0);
scoreTxt.setText('0');
// Reset obstacle spawn
lastObstacleX = 1600;
// Spawn initial obstacles
for (var i = 0; i < 3; i++) {
spawnObstacle(lastObstacleX + 800 * i);
}
gameStarted = true;
}
// --- Obstacle Spawning ---
function spawnObstacle(x) {
var obs = new Obstacle();
obs.x = x;
obs.y = groundY;
obstacles.push(obs);
game.addChild(obs);
lastObstacleX = x;
}
// --- Collision Detection ---
function checkCollision(a, b) {
// Simple AABB collision
var ab = a.getBounds();
var bb = b.getBounds();
return ab.x < bb.x + bb.width && ab.x + ab.width > bb.x && ab.y < bb.y + bb.height && ab.y + ab.height > bb.y;
}
// --- Game Update Loop ---
game.update = function () {
if (!gameStarted) return;
// Update player
player.update();
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
// Remove obstacles that have gone off screen
if (obs.x < -200) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with player
if (checkCollision(player, obs)) {
// Flash screen and show game over
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
gameStarted = false;
return;
}
}
// Spawn new obstacles if needed
if (obstacles.length === 0 || obstacles.length > 0 && obstacles[obstacles.length - 1].x < 2048 - minObstacleGap) {
var gap = minObstacleGap + Math.floor(Math.random() * (maxObstacleGap - minObstacleGap));
spawnObstacle(2048 + gap);
}
// Score: increase as player passes obstacles
for (var j = 0; j < obstacles.length; j++) {
var obs2 = obstacles[j];
if (!obs2.passed && obs2.x + 60 < player.x) {
obs2.passed = true;
score += 1;
LK.setScore(score);
scoreTxt.setText(score + '');
}
}
};
// --- Input: Tap to Jump ---
game.down = function (x, y, obj) {
if (!gameStarted) return;
player.jump();
};
// --- Reset on Game Over ---
LK.on('gameover', function () {
// Wait a short moment before reset to allow flash
LK.setTimeout(function () {
resetGame();
}, 400);
});
// --- Prevent drag/scroll on mobile (handled by LK) ---
// --- Center score text ---
scoreTxt.setText('0');
scoreTxt.anchor.set(0.5, 0);
// --- End of file --- ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,228 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Obstacle class: spikes or blocks
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ // Randomly choose obstacle type: spike or block
+ var type = Math.random() < 0.5 ? 'spike' : 'block';
+ if (type === 'spike') {
+ // Spike: triangle (use box asset, scale to triangle shape)
+ var spikeAsset = self.attachAsset('spike', {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ // width: 80, height: 120, color: 0xff4444, shape: 'box'
+ // We'll visually "fake" a triangle by scaling Y and X
+ spikeAsset.scaleX = 1;
+ spikeAsset.scaleY = 1.2;
+ } else {
+ // Block: rectangle
+ var blockAsset = self.attachAsset('obstacleBlock', {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ // width: 120, height: 120, color: 0x888888, shape: 'box'
+ }
+ self.type = type;
+ // Update method: move left
+ self.update = function () {
+ self.x -= obstacleSpeed;
+ };
+ return self;
+});
+// Player class: geometric box that auto-runs and jumps
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach player asset (box)
+ var playerAsset = self.attachAsset('playerBox', {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ // Physics properties
+ self.vy = 0; // vertical velocity
+ self.isJumping = false;
+ self.grounded = true;
+ // Constants
+ self.jumpVelocity = -48; // negative is up
+ self.gravity = 5; // gravity per frame
+ // Set initial size and color
+ // (Asset will be created automatically)
+ // width: 120, height: 120, color: 0x2eccff
+ // Update method called every tick
+ self.update = function () {
+ // Apply gravity
+ if (!self.grounded) {
+ self.vy += self.gravity;
+ self.y += self.vy;
+ // Check for landing on ground
+ if (self.y >= groundY) {
+ self.y = groundY;
+ self.vy = 0;
+ self.grounded = true;
+ self.isJumping = false;
+ }
+ }
+ };
+ // Jump method
+ self.jump = function () {
+ if (self.grounded && !self.isJumping) {
+ self.vy = self.jumpVelocity;
+ self.grounded = false;
+ self.isJumping = true;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x181c2c
+});
+
+/****
+* Game Code
+****/
+// Tween plugin for jump and obstacle animations
+// --- Constants ---
+var groundY = 2200; // Y position of ground (player stands here)
+var playerStartX = 500;
+var playerStartY = groundY;
+var obstacleStartX = 2200; // Obstacles spawn off-screen right
+var obstacleSpeed = 28; // How fast obstacles move left
+var minObstacleGap = 500; // Minimum distance between obstacles
+var maxObstacleGap = 900; // Maximum distance between obstacles
+// --- Asset Initialization (auto by LK, but for clarity) ---
+// --- Game State ---
+var player;
+var obstacles = [];
+var score = 0;
+var scoreTxt;
+var lastObstacleX = 0;
+var gameStarted = false;
+// --- Ground ---
+var ground = LK.getAsset('ground', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: groundY + 1
+});
+game.addChild(ground);
+// --- Player ---
+player = new Player();
+player.x = playerStartX;
+player.y = playerStartY;
+game.addChild(player);
+// --- Score Display ---
+scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// --- Start State ---
+resetGame();
+function resetGame() {
+ // Remove all obstacles
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].destroy();
+ }
+ obstacles = [];
+ // Reset player
+ player.x = playerStartX;
+ player.y = playerStartY;
+ player.vy = 0;
+ player.grounded = true;
+ player.isJumping = false;
+ // Reset score
+ score = 0;
+ LK.setScore(0);
+ scoreTxt.setText('0');
+ // Reset obstacle spawn
+ lastObstacleX = 1600;
+ // Spawn initial obstacles
+ for (var i = 0; i < 3; i++) {
+ spawnObstacle(lastObstacleX + 800 * i);
+ }
+ gameStarted = true;
+}
+// --- Obstacle Spawning ---
+function spawnObstacle(x) {
+ var obs = new Obstacle();
+ obs.x = x;
+ obs.y = groundY;
+ obstacles.push(obs);
+ game.addChild(obs);
+ lastObstacleX = x;
+}
+// --- Collision Detection ---
+function checkCollision(a, b) {
+ // Simple AABB collision
+ var ab = a.getBounds();
+ var bb = b.getBounds();
+ return ab.x < bb.x + bb.width && ab.x + ab.width > bb.x && ab.y < bb.y + bb.height && ab.y + ab.height > bb.y;
+}
+// --- Game Update Loop ---
+game.update = function () {
+ if (!gameStarted) return;
+ // Update player
+ player.update();
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obs = obstacles[i];
+ obs.update();
+ // Remove obstacles that have gone off screen
+ if (obs.x < -200) {
+ obs.destroy();
+ obstacles.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (checkCollision(player, obs)) {
+ // Flash screen and show game over
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ gameStarted = false;
+ return;
+ }
+ }
+ // Spawn new obstacles if needed
+ if (obstacles.length === 0 || obstacles.length > 0 && obstacles[obstacles.length - 1].x < 2048 - minObstacleGap) {
+ var gap = minObstacleGap + Math.floor(Math.random() * (maxObstacleGap - minObstacleGap));
+ spawnObstacle(2048 + gap);
+ }
+ // Score: increase as player passes obstacles
+ for (var j = 0; j < obstacles.length; j++) {
+ var obs2 = obstacles[j];
+ if (!obs2.passed && obs2.x + 60 < player.x) {
+ obs2.passed = true;
+ score += 1;
+ LK.setScore(score);
+ scoreTxt.setText(score + '');
+ }
+ }
+};
+// --- Input: Tap to Jump ---
+game.down = function (x, y, obj) {
+ if (!gameStarted) return;
+ player.jump();
+};
+// --- Reset on Game Over ---
+LK.on('gameover', function () {
+ // Wait a short moment before reset to allow flash
+ LK.setTimeout(function () {
+ resetGame();
+ }, 400);
+});
+// --- Prevent drag/scroll on mobile (handled by LK) ---
+// --- Center score text ---
+scoreTxt.setText('0');
+scoreTxt.anchor.set(0.5, 0);
+// --- End of file ---
\ No newline at end of file