/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Collectible class
var Collectible = Container.expand(function () {
var self = Container.call(this);
var colSprite = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10; // Will be set dynamically
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Will be set dynamically
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// For collision, use the container itself
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Collectible: gold ellipse
// Obstacle: red ellipse
// Player character: blue box
// Game area: 2048x2732
// Player start position: bottom center
var player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 220;
game.addChild(player);
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Arrays for obstacles and collectibles
var obstacles = [];
var collectibles = [];
// Difficulty variables
var obstacleInterval = 60; // ticks between obstacles
var collectibleInterval = 180; // ticks between collectibles
var minObstacleInterval = 20;
var minCollectibleInterval = 80;
var obstacleSpeed = 12;
var collectibleSpeed = 10;
var maxObstacleSpeed = 32;
var maxCollectibleSpeed = 24;
var ticksSinceLastObstacle = 0;
var ticksSinceLastCollectible = 0;
var difficultyTimer = 0;
// Dragging
var dragNode = null;
// For collision detection
var lastPlayerHit = false;
// Move handler for dragging player
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp player within game area
var px = Math.max(player.width / 2, Math.min(2048 - player.width / 2, x));
var py = Math.max(player.height / 2 + 100, Math.min(2732 - player.height / 2, y));
player.x = px;
player.y = py;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on player
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game update loop
game.update = function () {
// Difficulty increases over time
difficultyTimer++;
if (difficultyTimer % 300 === 0) {
// every 5 seconds
if (obstacleInterval > minObstacleInterval) obstacleInterval -= 4;
if (collectibleInterval > minCollectibleInterval) collectibleInterval -= 4;
if (obstacleSpeed < maxObstacleSpeed) obstacleSpeed += 1.5;
if (collectibleSpeed < maxCollectibleSpeed) collectibleSpeed += 1;
}
// Spawn obstacles
ticksSinceLastObstacle++;
if (ticksSinceLastObstacle >= obstacleInterval) {
ticksSinceLastObstacle = 0;
var obs = new Obstacle();
obs.x = Math.random() * (2048 - 180) + 90;
obs.y = -80;
obs.speed = obstacleSpeed + Math.random() * 2;
obstacles.push(obs);
game.addChild(obs);
}
// Spawn collectibles
ticksSinceLastCollectible++;
if (ticksSinceLastCollectible >= collectibleInterval) {
ticksSinceLastCollectible = 0;
var col = new Collectible();
col.x = Math.random() * (2048 - 140) + 70;
col.y = -60;
col.speed = collectibleSpeed + Math.random() * 2;
collectibles.push(col);
game.addChild(col);
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
// Remove if off screen
if (obs.y - obs.height / 2 > 2732 + 40) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with player
var hit = player.intersects(obs);
if (!lastPlayerHit && hit) {
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Game over
LK.showGameOver();
return;
}
lastPlayerHit = hit;
}
// Update collectibles
for (var j = collectibles.length - 1; j >= 0; j--) {
var col = collectibles[j];
col.update();
// Remove if off screen
if (col.y - col.height / 2 > 2732 + 40) {
col.destroy();
collectibles.splice(j, 1);
continue;
}
// Collision with player
if (player.intersects(col)) {
// Add score
LK.setScore(LK.getScore() + 5);
scoreTxt.setText(LK.getScore());
// Flash collectible
LK.effects.flashObject(col, 0xffffff, 200);
col.destroy();
collectibles.splice(j, 1);
continue;
}
}
// Update score display
scoreTxt.setText(LK.getScore());
};
// Reset score on game start
LK.setScore(0);
scoreTxt.setText('0'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,197 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Collectible class
+var Collectible = Container.expand(function () {
+ var self = Container.call(this);
+ var colSprite = self.attachAsset('collectible', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10; // Will be set dynamically
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Obstacle class
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obsSprite = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12; // Will be set dynamically
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player class
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerSprite = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // For collision, use the container itself
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x181818
+});
+
+/****
+* Game Code
+****/
+// Collectible: gold ellipse
+// Obstacle: red ellipse
+// Player character: blue box
+// Game area: 2048x2732
+// Player start position: bottom center
+var player = new Player();
+player.x = 2048 / 2;
+player.y = 2732 - 220;
+game.addChild(player);
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Arrays for obstacles and collectibles
+var obstacles = [];
+var collectibles = [];
+// Difficulty variables
+var obstacleInterval = 60; // ticks between obstacles
+var collectibleInterval = 180; // ticks between collectibles
+var minObstacleInterval = 20;
+var minCollectibleInterval = 80;
+var obstacleSpeed = 12;
+var collectibleSpeed = 10;
+var maxObstacleSpeed = 32;
+var maxCollectibleSpeed = 24;
+var ticksSinceLastObstacle = 0;
+var ticksSinceLastCollectible = 0;
+var difficultyTimer = 0;
+// Dragging
+var dragNode = null;
+// For collision detection
+var lastPlayerHit = false;
+// Move handler for dragging player
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ // Clamp player within game area
+ var px = Math.max(player.width / 2, Math.min(2048 - player.width / 2, x));
+ var py = Math.max(player.height / 2 + 100, Math.min(2732 - player.height / 2, y));
+ player.x = px;
+ player.y = py;
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only start drag if touch is on player
+ var local = player.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
+ dragNode = player;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game update loop
+game.update = function () {
+ // Difficulty increases over time
+ difficultyTimer++;
+ if (difficultyTimer % 300 === 0) {
+ // every 5 seconds
+ if (obstacleInterval > minObstacleInterval) obstacleInterval -= 4;
+ if (collectibleInterval > minCollectibleInterval) collectibleInterval -= 4;
+ if (obstacleSpeed < maxObstacleSpeed) obstacleSpeed += 1.5;
+ if (collectibleSpeed < maxCollectibleSpeed) collectibleSpeed += 1;
+ }
+ // Spawn obstacles
+ ticksSinceLastObstacle++;
+ if (ticksSinceLastObstacle >= obstacleInterval) {
+ ticksSinceLastObstacle = 0;
+ var obs = new Obstacle();
+ obs.x = Math.random() * (2048 - 180) + 90;
+ obs.y = -80;
+ obs.speed = obstacleSpeed + Math.random() * 2;
+ obstacles.push(obs);
+ game.addChild(obs);
+ }
+ // Spawn collectibles
+ ticksSinceLastCollectible++;
+ if (ticksSinceLastCollectible >= collectibleInterval) {
+ ticksSinceLastCollectible = 0;
+ var col = new Collectible();
+ col.x = Math.random() * (2048 - 140) + 70;
+ col.y = -60;
+ col.speed = collectibleSpeed + Math.random() * 2;
+ collectibles.push(col);
+ game.addChild(col);
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obs = obstacles[i];
+ obs.update();
+ // Remove if off screen
+ if (obs.y - obs.height / 2 > 2732 + 40) {
+ obs.destroy();
+ obstacles.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ var hit = player.intersects(obs);
+ if (!lastPlayerHit && hit) {
+ // Flash screen red
+ LK.effects.flashScreen(0xff0000, 800);
+ // Game over
+ LK.showGameOver();
+ return;
+ }
+ lastPlayerHit = hit;
+ }
+ // Update collectibles
+ for (var j = collectibles.length - 1; j >= 0; j--) {
+ var col = collectibles[j];
+ col.update();
+ // Remove if off screen
+ if (col.y - col.height / 2 > 2732 + 40) {
+ col.destroy();
+ collectibles.splice(j, 1);
+ continue;
+ }
+ // Collision with player
+ if (player.intersects(col)) {
+ // Add score
+ LK.setScore(LK.getScore() + 5);
+ scoreTxt.setText(LK.getScore());
+ // Flash collectible
+ LK.effects.flashObject(col, 0xffffff, 200);
+ col.destroy();
+ collectibles.splice(j, 1);
+ continue;
+ }
+ }
+ // Update score display
+ scoreTxt.setText(LK.getScore());
+};
+// Reset score on game start
+LK.setScore(0);
+scoreTxt.setText('0');
\ No newline at end of file