/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.targetX = 0;
self.targetY = 0;
self.moveX = 0;
self.moveY = 0;
self.setTarget = function (targetX, targetY) {
self.targetX = targetX;
self.targetY = targetY;
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
self.moveX = dx / distance * self.speed;
self.moveY = dy / distance * self.speed;
};
self.update = function () {
self.x += self.moveX;
self.y += self.moveY;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.direction = 0; // 0=right, 1=down, 2=left, 3=up
self.directionVectors = [{
x: 1,
y: 0
},
// right
{
x: 0,
y: 1
},
// down
{
x: -1,
y: 0
},
// left
{
x: 0,
y: -1
} // up
];
self.changeDirection = function () {
self.direction = (self.direction + 1) % 4;
// Visual feedback
tween(playerGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 100
});
tween(playerGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
LK.getSound('changeDirection').play();
};
self.update = function () {
var vector = self.directionVectors[self.direction];
self.x += vector.x * self.speed;
self.y += vector.y * self.speed;
// Keep player within bounds
if (self.x < 40) self.x = 40;
if (self.x > 2008) self.x = 2008;
if (self.y < 40) self.y = 40;
if (self.y > 2692) self.y = 2692;
};
return self;
});
var TimerDisplay = Container.expand(function () {
var self = Container.call(this);
var timerBarBg = self.attachAsset('timerBarBg', {
anchorX: 0.5,
anchorY: 0.5
});
var timerBar = self.attachAsset('timerBar', {
anchorX: 0,
anchorY: 0.5
});
timerBar.x = -200;
self.maxWidth = 400;
self.timeLeft = 1000; // 1 second in ms
self.maxTime = 1000;
self.updateTimer = function (timeLeft) {
self.timeLeft = timeLeft;
var percentage = timeLeft / self.maxTime;
timerBar.width = self.maxWidth * percentage;
// Change color based on time left
if (percentage > 0.5) {
timerBar.tint = 0xFFC107; // Yellow
} else if (percentage > 0.2) {
timerBar.tint = 0xFF9800; // Orange
} else {
timerBar.tint = 0xF44336; // Red
}
};
self.reset = function () {
self.timeLeft = self.maxTime;
self.updateTimer(self.timeLeft);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x212121
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
var obstacles = [];
var gameSpeed = 1;
var survivalTime = 0;
var directionChangeTimer = 1000; // 1 second
var maxDirectionChangeTime = 1000;
var lastDirectionChange = 0;
var gameRunning = true;
// Create timer display
var timerDisplay = new TimerDisplay();
timerDisplay.x = 1024;
timerDisplay.y = 150;
LK.gui.addChild(timerDisplay);
// Score display
var scoreText = new Text2('0s', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
function spawnObstacle() {
var obstacle = new Obstacle();
var side = Math.floor(Math.random() * 4); // 0=top, 1=right, 2=bottom, 3=left
// Position obstacle on screen edge
switch (side) {
case 0:
// top
obstacle.x = Math.random() * 2048;
obstacle.y = -30;
break;
case 1:
// right
obstacle.x = 2078;
obstacle.y = Math.random() * 2732;
break;
case 2:
// bottom
obstacle.x = Math.random() * 2048;
obstacle.y = 2762;
break;
case 3:
// left
obstacle.x = -30;
obstacle.y = Math.random() * 2732;
break;
}
// Set target towards player with some randomness
var targetX = player.x + (Math.random() - 0.5) * 200;
var targetY = player.y + (Math.random() - 0.5) * 200;
obstacle.setTarget(targetX, targetY);
obstacle.speed = 2 + gameSpeed * 0.5;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn initial obstacles
for (var i = 0; i < 3; i++) {
spawnObstacle();
}
game.down = function (x, y, obj) {
if (gameRunning) {
player.changeDirection();
lastDirectionChange = LK.ticks;
directionChangeTimer = maxDirectionChangeTime;
}
};
game.update = function () {
if (!gameRunning) return;
survivalTime++;
// Update score every 60 ticks (1 second)
if (survivalTime % 60 === 0) {
var seconds = Math.floor(survivalTime / 60);
scoreText.setText(seconds + 's');
LK.setScore(seconds);
// Increase game speed gradually
gameSpeed += 0.1;
}
// Update direction change timer
directionChangeTimer -= 16.67; // Approximate ms per frame at 60fps
timerDisplay.updateTimer(Math.max(0, directionChangeTimer));
// Check if player failed to change direction in time
if (directionChangeTimer <= 0) {
gameRunning = false;
LK.getSound('hit').play();
LK.effects.flashScreen(0xFF0000, 500);
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
return;
}
// Spawn new obstacles
if (survivalTime % Math.max(60, 120 - Math.floor(gameSpeed * 10)) === 0) {
spawnObstacle();
}
// Update and check obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
// Check collision with player
if (obstacle.intersects(player)) {
gameRunning = false;
LK.getSound('hit').play();
LK.effects.flashScreen(0xFF0000, 500);
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
return;
}
// Remove obstacles that are too far off screen
if (obstacle.x < -100 || obstacle.x > 2148 || obstacle.y < -100 || obstacle.y > 2832) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Reset direction change timer when player changes direction
if (LK.ticks - lastDirectionChange < 5) {
directionChangeTimer = maxDirectionChangeTime;
timerDisplay.reset();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,255 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.moveX = 0;
+ self.moveY = 0;
+ self.setTarget = function (targetX, targetY) {
+ self.targetX = targetX;
+ self.targetY = targetY;
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ self.moveX = dx / distance * self.speed;
+ self.moveY = dy / distance * self.speed;
+ };
+ self.update = function () {
+ self.x += self.moveX;
+ self.y += self.moveY;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.direction = 0; // 0=right, 1=down, 2=left, 3=up
+ self.directionVectors = [{
+ x: 1,
+ y: 0
+ },
+ // right
+ {
+ x: 0,
+ y: 1
+ },
+ // down
+ {
+ x: -1,
+ y: 0
+ },
+ // left
+ {
+ x: 0,
+ y: -1
+ } // up
+ ];
+ self.changeDirection = function () {
+ self.direction = (self.direction + 1) % 4;
+ // Visual feedback
+ tween(playerGraphics, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 100
+ });
+ tween(playerGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 100
+ });
+ LK.getSound('changeDirection').play();
+ };
+ self.update = function () {
+ var vector = self.directionVectors[self.direction];
+ self.x += vector.x * self.speed;
+ self.y += vector.y * self.speed;
+ // Keep player within bounds
+ if (self.x < 40) self.x = 40;
+ if (self.x > 2008) self.x = 2008;
+ if (self.y < 40) self.y = 40;
+ if (self.y > 2692) self.y = 2692;
+ };
+ return self;
+});
+var TimerDisplay = Container.expand(function () {
+ var self = Container.call(this);
+ var timerBarBg = self.attachAsset('timerBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var timerBar = self.attachAsset('timerBar', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ timerBar.x = -200;
+ self.maxWidth = 400;
+ self.timeLeft = 1000; // 1 second in ms
+ self.maxTime = 1000;
+ self.updateTimer = function (timeLeft) {
+ self.timeLeft = timeLeft;
+ var percentage = timeLeft / self.maxTime;
+ timerBar.width = self.maxWidth * percentage;
+ // Change color based on time left
+ if (percentage > 0.5) {
+ timerBar.tint = 0xFFC107; // Yellow
+ } else if (percentage > 0.2) {
+ timerBar.tint = 0xFF9800; // Orange
+ } else {
+ timerBar.tint = 0xF44336; // Red
+ }
+ };
+ self.reset = function () {
+ self.timeLeft = self.maxTime;
+ self.updateTimer(self.timeLeft);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x212121
+});
+
+/****
+* Game Code
+****/
+var player = game.addChild(new Player());
+player.x = 1024;
+player.y = 1366;
+var obstacles = [];
+var gameSpeed = 1;
+var survivalTime = 0;
+var directionChangeTimer = 1000; // 1 second
+var maxDirectionChangeTime = 1000;
+var lastDirectionChange = 0;
+var gameRunning = true;
+// Create timer display
+var timerDisplay = new TimerDisplay();
+timerDisplay.x = 1024;
+timerDisplay.y = 150;
+LK.gui.addChild(timerDisplay);
+// Score display
+var scoreText = new Text2('0s', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+function spawnObstacle() {
+ var obstacle = new Obstacle();
+ var side = Math.floor(Math.random() * 4); // 0=top, 1=right, 2=bottom, 3=left
+ // Position obstacle on screen edge
+ switch (side) {
+ case 0:
+ // top
+ obstacle.x = Math.random() * 2048;
+ obstacle.y = -30;
+ break;
+ case 1:
+ // right
+ obstacle.x = 2078;
+ obstacle.y = Math.random() * 2732;
+ break;
+ case 2:
+ // bottom
+ obstacle.x = Math.random() * 2048;
+ obstacle.y = 2762;
+ break;
+ case 3:
+ // left
+ obstacle.x = -30;
+ obstacle.y = Math.random() * 2732;
+ break;
+ }
+ // Set target towards player with some randomness
+ var targetX = player.x + (Math.random() - 0.5) * 200;
+ var targetY = player.y + (Math.random() - 0.5) * 200;
+ obstacle.setTarget(targetX, targetY);
+ obstacle.speed = 2 + gameSpeed * 0.5;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+}
+// Spawn initial obstacles
+for (var i = 0; i < 3; i++) {
+ spawnObstacle();
+}
+game.down = function (x, y, obj) {
+ if (gameRunning) {
+ player.changeDirection();
+ lastDirectionChange = LK.ticks;
+ directionChangeTimer = maxDirectionChangeTime;
+ }
+};
+game.update = function () {
+ if (!gameRunning) return;
+ survivalTime++;
+ // Update score every 60 ticks (1 second)
+ if (survivalTime % 60 === 0) {
+ var seconds = Math.floor(survivalTime / 60);
+ scoreText.setText(seconds + 's');
+ LK.setScore(seconds);
+ // Increase game speed gradually
+ gameSpeed += 0.1;
+ }
+ // Update direction change timer
+ directionChangeTimer -= 16.67; // Approximate ms per frame at 60fps
+ timerDisplay.updateTimer(Math.max(0, directionChangeTimer));
+ // Check if player failed to change direction in time
+ if (directionChangeTimer <= 0) {
+ gameRunning = false;
+ LK.getSound('hit').play();
+ LK.effects.flashScreen(0xFF0000, 500);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 500);
+ return;
+ }
+ // Spawn new obstacles
+ if (survivalTime % Math.max(60, 120 - Math.floor(gameSpeed * 10)) === 0) {
+ spawnObstacle();
+ }
+ // Update and check obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ // Check collision with player
+ if (obstacle.intersects(player)) {
+ gameRunning = false;
+ LK.getSound('hit').play();
+ LK.effects.flashScreen(0xFF0000, 500);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 500);
+ return;
+ }
+ // Remove obstacles that are too far off screen
+ if (obstacle.x < -100 || obstacle.x > 2148 || obstacle.y < -100 || obstacle.y > 2832) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ }
+ }
+ // Reset direction change timer when player changes direction
+ if (LK.ticks - lastDirectionChange < 5) {
+ directionChangeTimer = maxDirectionChangeTime;
+ timerDisplay.reset();
+ }
+};
\ No newline at end of file