/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Butter = Container.expand(function () {
var self = Container.call(this);
var butterGraphics = self.attachAsset('butter', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
self.y += trackSpeed;
// Simple rotation animation
butterGraphics.rotation += 0.1;
};
return self;
});
var Kart = Container.expand(function () {
var self = Container.call(this);
var kartGraphics = self.attachAsset('kart', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.maxSpeed = 12;
self.steerSpeed = 6;
self.isShielded = false;
self.shieldTime = 0;
self.update = function () {
// Update shield effect
if (self.isShielded) {
self.shieldTime--;
if (self.shieldTime <= 0) {
self.isShielded = false;
kartGraphics.tint = 0xffffff;
}
}
};
self.activateShield = function () {
self.isShielded = true;
self.shieldTime = 180; // 3 seconds at 60fps
kartGraphics.tint = 0x00ffff;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += trackSpeed;
};
return self;
});
var SpeedBoost = Container.expand(function () {
var self = Container.call(this);
var boostGraphics = self.attachAsset('speedBoost', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
self.y += trackSpeed;
// Pulsing animation
var scale = 1 + Math.sin(LK.ticks * 0.2) * 0.2;
boostGraphics.scaleX = scale;
boostGraphics.scaleY = scale;
};
return self;
});
var TrackSegment = Container.expand(function () {
var self = Container.call(this);
var trackGraphics = self.attachAsset('track', {
anchorX: 0.5,
anchorY: 0.5
});
// Add lane dividers
for (var i = 1; i < 4; i++) {
var line = self.attachAsset('trackLine', {
anchorX: 0.5,
anchorY: 0.5,
x: i * 512 - 768,
// Position lines to create 4 lanes
y: 0
});
}
self.update = function () {
self.y += trackSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228b22
});
/****
* Game Code
****/
// Game variables
var labubu;
var trackSpeed = 6;
var butterItems = [];
var obstacles = [];
var speedBoosts = [];
var trackSegments = [];
var gameDistance = 0;
var targetDistance = 5000; // Distance to finish line
var isGameActive = true;
var spawnTimer = 0;
var trackTimer = 0;
// Lane positions (4 lanes)
var lanePositions = [384, 768, 1280, 1664];
var currentLane = 1; // Start in second lane
// UI Elements
var scoreTxt = new Text2('Butter: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreTxt);
scoreTxt.x = 120; // Avoid platform menu
var distanceTxt = new Text2('Distance: 0m', {
size: 60,
fill: 0xFFFFFF
});
distanceTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(distanceTxt);
var speedTxt = new Text2('SPEED BOOST!', {
size: 100,
fill: 0x00FF00
});
speedTxt.anchor.set(0.5, 0.5);
speedTxt.alpha = 0;
LK.gui.center.addChild(speedTxt);
// Initialize player kart
labubu = game.addChild(new Kart());
labubu.x = lanePositions[currentLane];
labubu.y = 2200;
// Initialize track segments
for (var i = 0; i < 5; i++) {
var segment = game.addChild(new TrackSegment());
segment.x = 1024;
segment.y = i * 200 - 400;
trackSegments.push(segment);
}
// Touch controls
var touchStartX = 0;
var isTouching = false;
game.down = function (x, y, obj) {
isTouching = true;
touchStartX = x;
};
game.up = function (x, y, obj) {
isTouching = false;
};
game.move = function (x, y, obj) {
if (isTouching && isGameActive) {
var deltaX = x - touchStartX;
// Steer left or right based on touch movement
if (Math.abs(deltaX) > 100) {
if (deltaX > 0 && currentLane < 3) {
currentLane++;
touchStartX = x;
} else if (deltaX < 0 && currentLane > 0) {
currentLane--;
touchStartX = x;
}
}
}
};
// Simple tap controls for lane switching
game.down = function (x, y, obj) {
if (!isGameActive) return;
if (x < 1024 && currentLane > 0) {
// Left side tap - move left
currentLane--;
} else if (x >= 1024 && currentLane < 3) {
// Right side tap - move right
currentLane++;
}
};
function spawnButter() {
var butter = game.addChild(new Butter());
var lane = Math.floor(Math.random() * 4);
butter.x = lanePositions[lane];
butter.y = -50;
butterItems.push(butter);
}
function spawnObstacle() {
var obstacle = game.addChild(new Obstacle());
var lane = Math.floor(Math.random() * 4);
obstacle.x = lanePositions[lane];
obstacle.y = -100;
obstacles.push(obstacle);
}
function spawnSpeedBoost() {
var boost = game.addChild(new SpeedBoost());
var lane = Math.floor(Math.random() * 4);
boost.x = lanePositions[lane];
boost.y = -80;
speedBoosts.push(boost);
}
function spawnTrackSegment() {
var segment = game.addChild(new TrackSegment());
segment.x = 1024;
segment.y = -100;
trackSegments.push(segment);
}
game.update = function () {
if (!isGameActive) return;
// Update distance
gameDistance += trackSpeed;
distanceTxt.setText('Distance: ' + Math.floor(gameDistance / 10) + 'm');
// Check win condition
if (gameDistance >= targetDistance) {
isGameActive = false;
LK.showYouWin();
return;
}
// Smooth kart movement to target lane
var targetX = lanePositions[currentLane];
var deltaX = targetX - labubu.x;
if (Math.abs(deltaX) > 5) {
labubu.x += deltaX * 0.15;
} else {
labubu.x = targetX;
}
// Increase difficulty over time
if (gameDistance > 1000) trackSpeed = 7;
if (gameDistance > 2500) trackSpeed = 8;
if (gameDistance > 4000) trackSpeed = 9;
// Spawn items
spawnTimer++;
if (spawnTimer % 90 == 0) spawnButter(); // Every 1.5 seconds
if (spawnTimer % 120 == 0) spawnObstacle(); // Every 2 seconds
if (spawnTimer % 300 == 0) spawnSpeedBoost(); // Every 5 seconds
// Spawn track segments
trackTimer++;
if (trackTimer % 60 == 0) spawnTrackSegment(); // Every second
// Update and check butter collection
for (var i = butterItems.length - 1; i >= 0; i--) {
var butter = butterItems[i];
if (butter.y > 2800) {
butter.destroy();
butterItems.splice(i, 1);
continue;
}
if (!butter.collected && butter.intersects(labubu)) {
butter.collected = true;
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Butter: ' + LK.getScore());
LK.getSound('collect').play();
// Butter collection effect
tween(butter, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
butter.destroy();
}
});
butterItems.splice(i, 1);
}
}
// Update and check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
if (obstacle.intersects(labubu)) {
if (!labubu.isShielded) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
trackSpeed = Math.max(3, trackSpeed - 2); // Slow down
// Crash effect
tween(labubu, {}, {
duration: 500,
onFinish: function onFinish() {
trackSpeed = Math.min(trackSpeed + 2, 9); // Recover speed
}
});
}
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Update and check speed boost collection
for (var i = speedBoosts.length - 1; i >= 0; i--) {
var boost = speedBoosts[i];
if (boost.y > 2800) {
boost.destroy();
speedBoosts.splice(i, 1);
continue;
}
if (!boost.collected && boost.intersects(labubu)) {
boost.collected = true;
LK.getSound('boost').play();
labubu.activateShield();
trackSpeed += 3;
// Show speed boost text
speedTxt.alpha = 1;
tween(speedTxt, {
alpha: 0
}, {
duration: 1000
});
// Return to normal speed after boost
LK.setTimeout(function () {
trackSpeed = Math.max(6, trackSpeed - 3);
}, 2000);
boost.destroy();
speedBoosts.splice(i, 1);
}
}
// Clean up track segments
for (var i = trackSegments.length - 1; i >= 0; i--) {
var segment = trackSegments[i];
if (segment.y > 2800) {
segment.destroy();
trackSegments.splice(i, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,339 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Butter = Container.expand(function () {
+ var self = Container.call(this);
+ var butterGraphics = self.attachAsset('butter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.update = function () {
+ self.y += trackSpeed;
+ // Simple rotation animation
+ butterGraphics.rotation += 0.1;
+ };
+ return self;
+});
+var Kart = Container.expand(function () {
+ var self = Container.call(this);
+ var kartGraphics = self.attachAsset('kart', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.maxSpeed = 12;
+ self.steerSpeed = 6;
+ self.isShielded = false;
+ self.shieldTime = 0;
+ self.update = function () {
+ // Update shield effect
+ if (self.isShielded) {
+ self.shieldTime--;
+ if (self.shieldTime <= 0) {
+ self.isShielded = false;
+ kartGraphics.tint = 0xffffff;
+ }
+ }
+ };
+ self.activateShield = function () {
+ self.isShielded = true;
+ self.shieldTime = 180; // 3 seconds at 60fps
+ kartGraphics.tint = 0x00ffff;
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ self.y += trackSpeed;
+ };
+ return self;
+});
+var SpeedBoost = Container.expand(function () {
+ var self = Container.call(this);
+ var boostGraphics = self.attachAsset('speedBoost', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.update = function () {
+ self.y += trackSpeed;
+ // Pulsing animation
+ var scale = 1 + Math.sin(LK.ticks * 0.2) * 0.2;
+ boostGraphics.scaleX = scale;
+ boostGraphics.scaleY = scale;
+ };
+ return self;
+});
+var TrackSegment = Container.expand(function () {
+ var self = Container.call(this);
+ var trackGraphics = self.attachAsset('track', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Add lane dividers
+ for (var i = 1; i < 4; i++) {
+ var line = self.attachAsset('trackLine', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: i * 512 - 768,
+ // Position lines to create 4 lanes
+ y: 0
+ });
+ }
+ self.update = function () {
+ self.y += trackSpeed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x228b22
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var labubu;
+var trackSpeed = 6;
+var butterItems = [];
+var obstacles = [];
+var speedBoosts = [];
+var trackSegments = [];
+var gameDistance = 0;
+var targetDistance = 5000; // Distance to finish line
+var isGameActive = true;
+var spawnTimer = 0;
+var trackTimer = 0;
+// Lane positions (4 lanes)
+var lanePositions = [384, 768, 1280, 1664];
+var currentLane = 1; // Start in second lane
+// UI Elements
+var scoreTxt = new Text2('Butter: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreTxt);
+scoreTxt.x = 120; // Avoid platform menu
+var distanceTxt = new Text2('Distance: 0m', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+distanceTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(distanceTxt);
+var speedTxt = new Text2('SPEED BOOST!', {
+ size: 100,
+ fill: 0x00FF00
+});
+speedTxt.anchor.set(0.5, 0.5);
+speedTxt.alpha = 0;
+LK.gui.center.addChild(speedTxt);
+// Initialize player kart
+labubu = game.addChild(new Kart());
+labubu.x = lanePositions[currentLane];
+labubu.y = 2200;
+// Initialize track segments
+for (var i = 0; i < 5; i++) {
+ var segment = game.addChild(new TrackSegment());
+ segment.x = 1024;
+ segment.y = i * 200 - 400;
+ trackSegments.push(segment);
+}
+// Touch controls
+var touchStartX = 0;
+var isTouching = false;
+game.down = function (x, y, obj) {
+ isTouching = true;
+ touchStartX = x;
+};
+game.up = function (x, y, obj) {
+ isTouching = false;
+};
+game.move = function (x, y, obj) {
+ if (isTouching && isGameActive) {
+ var deltaX = x - touchStartX;
+ // Steer left or right based on touch movement
+ if (Math.abs(deltaX) > 100) {
+ if (deltaX > 0 && currentLane < 3) {
+ currentLane++;
+ touchStartX = x;
+ } else if (deltaX < 0 && currentLane > 0) {
+ currentLane--;
+ touchStartX = x;
+ }
+ }
+ }
+};
+// Simple tap controls for lane switching
+game.down = function (x, y, obj) {
+ if (!isGameActive) return;
+ if (x < 1024 && currentLane > 0) {
+ // Left side tap - move left
+ currentLane--;
+ } else if (x >= 1024 && currentLane < 3) {
+ // Right side tap - move right
+ currentLane++;
+ }
+};
+function spawnButter() {
+ var butter = game.addChild(new Butter());
+ var lane = Math.floor(Math.random() * 4);
+ butter.x = lanePositions[lane];
+ butter.y = -50;
+ butterItems.push(butter);
+}
+function spawnObstacle() {
+ var obstacle = game.addChild(new Obstacle());
+ var lane = Math.floor(Math.random() * 4);
+ obstacle.x = lanePositions[lane];
+ obstacle.y = -100;
+ obstacles.push(obstacle);
+}
+function spawnSpeedBoost() {
+ var boost = game.addChild(new SpeedBoost());
+ var lane = Math.floor(Math.random() * 4);
+ boost.x = lanePositions[lane];
+ boost.y = -80;
+ speedBoosts.push(boost);
+}
+function spawnTrackSegment() {
+ var segment = game.addChild(new TrackSegment());
+ segment.x = 1024;
+ segment.y = -100;
+ trackSegments.push(segment);
+}
+game.update = function () {
+ if (!isGameActive) return;
+ // Update distance
+ gameDistance += trackSpeed;
+ distanceTxt.setText('Distance: ' + Math.floor(gameDistance / 10) + 'm');
+ // Check win condition
+ if (gameDistance >= targetDistance) {
+ isGameActive = false;
+ LK.showYouWin();
+ return;
+ }
+ // Smooth kart movement to target lane
+ var targetX = lanePositions[currentLane];
+ var deltaX = targetX - labubu.x;
+ if (Math.abs(deltaX) > 5) {
+ labubu.x += deltaX * 0.15;
+ } else {
+ labubu.x = targetX;
+ }
+ // Increase difficulty over time
+ if (gameDistance > 1000) trackSpeed = 7;
+ if (gameDistance > 2500) trackSpeed = 8;
+ if (gameDistance > 4000) trackSpeed = 9;
+ // Spawn items
+ spawnTimer++;
+ if (spawnTimer % 90 == 0) spawnButter(); // Every 1.5 seconds
+ if (spawnTimer % 120 == 0) spawnObstacle(); // Every 2 seconds
+ if (spawnTimer % 300 == 0) spawnSpeedBoost(); // Every 5 seconds
+ // Spawn track segments
+ trackTimer++;
+ if (trackTimer % 60 == 0) spawnTrackSegment(); // Every second
+ // Update and check butter collection
+ for (var i = butterItems.length - 1; i >= 0; i--) {
+ var butter = butterItems[i];
+ if (butter.y > 2800) {
+ butter.destroy();
+ butterItems.splice(i, 1);
+ continue;
+ }
+ if (!butter.collected && butter.intersects(labubu)) {
+ butter.collected = true;
+ LK.setScore(LK.getScore() + 10);
+ scoreTxt.setText('Butter: ' + LK.getScore());
+ LK.getSound('collect').play();
+ // Butter collection effect
+ tween(butter, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ butter.destroy();
+ }
+ });
+ butterItems.splice(i, 1);
+ }
+ }
+ // Update and check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (obstacle.y > 2800) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ continue;
+ }
+ if (obstacle.intersects(labubu)) {
+ if (!labubu.isShielded) {
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ trackSpeed = Math.max(3, trackSpeed - 2); // Slow down
+ // Crash effect
+ tween(labubu, {}, {
+ duration: 500,
+ onFinish: function onFinish() {
+ trackSpeed = Math.min(trackSpeed + 2, 9); // Recover speed
+ }
+ });
+ }
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ }
+ }
+ // Update and check speed boost collection
+ for (var i = speedBoosts.length - 1; i >= 0; i--) {
+ var boost = speedBoosts[i];
+ if (boost.y > 2800) {
+ boost.destroy();
+ speedBoosts.splice(i, 1);
+ continue;
+ }
+ if (!boost.collected && boost.intersects(labubu)) {
+ boost.collected = true;
+ LK.getSound('boost').play();
+ labubu.activateShield();
+ trackSpeed += 3;
+ // Show speed boost text
+ speedTxt.alpha = 1;
+ tween(speedTxt, {
+ alpha: 0
+ }, {
+ duration: 1000
+ });
+ // Return to normal speed after boost
+ LK.setTimeout(function () {
+ trackSpeed = Math.max(6, trackSpeed - 3);
+ }, 2000);
+ boost.destroy();
+ speedBoosts.splice(i, 1);
+ }
+ }
+ // Clean up track segments
+ for (var i = trackSegments.length - 1; i >= 0; i--) {
+ var segment = trackSegments[i];
+ if (segment.y > 2800) {
+ segment.destroy();
+ trackSegments.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file