/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.driftAngle = 0;
self.targetDriftAngle = 0;
self.isDrifting = false;
self.driftDuration = 0;
self.driftIntensity = 0;
self.rotation = 0;
self.update = function () {
self.y += self.speed;
self.driftAngle += (self.targetDriftAngle - self.driftAngle) * 0.1;
self.rotation = self.driftAngle;
if (self.isDrifting) {
self.driftDuration++;
self.driftIntensity = Math.min(1, self.driftDuration / 30);
}
};
return self;
});
var DriftParticle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('driftParticle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.life = 30;
self.maxLife = 30;
self.update = function () {
self.life--;
self.x += self.velocityX;
self.y += self.velocityY;
self.alpha = self.life / self.maxLife;
if (self.life <= 0) {
self.shouldDestroy = true;
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lastY = self.y;
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
};
return self;
});
var TrackSegment = Container.expand(function () {
var self = Container.call(this);
var trackGraphics = self.attachAsset('track', {
anchorX: 0.5,
anchorY: 0
});
self.speed = 8;
self.curveOffset = 0;
self.leftBound = 0;
self.rightBound = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var car = null;
var trackSegments = [];
var obstacles = [];
var driftParticles = [];
var score = 0;
var driftMultiplier = 1;
var driftCombo = 0;
var gameSpeed = 8;
var speedIncrement = 0;
var isGameActive = true;
var scoreTxt = new Text2('Score: 0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var comboTxt = new Text2('Combo: 0x', {
size: 100,
fill: 0xFFFF00
});
comboTxt.anchor.set(0.5, 0);
comboTxt.x = 0;
comboTxt.y = 150;
LK.gui.top.addChild(comboTxt);
var speedTxt = new Text2('Speed: 1x', {
size: 100,
fill: 0x00FF00
});
speedTxt.anchor.set(0.5, 0);
speedTxt.x = 0;
speedTxt.y = 250;
LK.gui.top.addChild(speedTxt);
function initializeCar() {
car = game.addChild(new Car());
car.x = 1024;
car.y = 2300;
car.speed = gameSpeed;
}
function createTrackSegment(yPos) {
var segment = game.addChild(new TrackSegment());
segment.x = 1024;
segment.y = yPos;
segment.speed = gameSpeed;
var randomCurve = Math.random() - 0.5;
segment.curveOffset = randomCurve * 200;
segment.x += segment.curveOffset;
segment.leftBound = segment.x - 300;
segment.rightBound = segment.x + 300;
trackSegments.push(segment);
}
function createObstacle(yPos, xOffset) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = xOffset;
obstacle.y = yPos;
obstacle.speed = gameSpeed;
obstacle.lastY = yPos;
obstacles.push(obstacle);
}
function createDriftParticle(x, y) {
var particle = game.addChild(new DriftParticle());
particle.x = x;
particle.y = y;
particle.velocityX = (Math.random() - 0.5) * 6;
particle.velocityY = Math.random() * 3 + 2;
driftParticles.push(particle);
}
function updateScore() {
var driftBonus = Math.floor(car.driftIntensity * driftCombo * 10);
score += driftBonus;
LK.setScore(score);
scoreTxt.setText('Score: ' + score);
}
function endDrift() {
if (car.isDrifting && car.driftDuration > 10) {
var bonusScore = Math.floor(car.driftDuration * driftMultiplier * 2);
score += bonusScore;
driftCombo++;
driftMultiplier = 1 + driftCombo * 0.1;
LK.getSound('combo').play();
}
car.isDrifting = false;
car.driftDuration = 0;
car.driftIntensity = 0;
car.targetDriftAngle = 0;
comboTxt.setText('Combo: ' + driftCombo + 'x');
updateScore();
}
function resetDriftCombo() {
driftCombo = 0;
driftMultiplier = 1;
comboTxt.setText('Combo: 0x');
}
var dragNode = null;
var lastCarX = 1024;
game.down = function (x, y, obj) {
dragNode = car;
lastCarX = car.x;
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = function (x, y, obj) {
if (!isGameActive) return;
if (dragNode) {
var newX = x;
newX = Math.max(200, Math.min(1848, newX));
dragNode.x = newX;
var movementDelta = Math.abs(newX - lastCarX);
if (movementDelta > 5) {
dragNode.isDrifting = true;
dragNode.targetDriftAngle = (newX - lastCarX) * 0.02;
if (!car.isDrifting) {
LK.getSound('drift').play();
}
for (var p = 0; p < 2; p++) {
createDriftParticle(dragNode.x + (Math.random() - 0.5) * 60, dragNode.y);
}
} else {
dragNode.isDrifting = false;
dragNode.driftDuration = 0;
}
lastCarX = newX;
}
};
var trackCreateTimer = LK.setInterval(function () {
if (isGameActive) {
createTrackSegment(-200);
if (LK.ticks % 120 === 0) {
createObstacle(-300, 1024 + (Math.random() - 0.5) * 400);
}
}
}, 100);
var comboResetTimer = LK.setInterval(function () {
if (isGameActive && car.isDrifting === false && driftCombo > 0) {
var timeSinceLastDrift = 0;
if (timeSinceLastDrift > 60) {
resetDriftCombo();
}
}
}, 500);
game.update = function () {
if (!isGameActive) return;
speedIncrement++;
if (speedIncrement > 3000) {
gameSpeed = Math.min(14, gameSpeed + 0.5);
speedIncrement = 0;
}
car.speed = gameSpeed;
for (var i = trackSegments.length - 1; i >= 0; i--) {
var segment = trackSegments[i];
segment.speed = gameSpeed;
if (segment.y > 2800) {
segment.destroy();
trackSegments.splice(i, 1);
}
}
for (var o = obstacles.length - 1; o >= 0; o--) {
var obstacle = obstacles[o];
obstacle.speed = gameSpeed;
if (obstacle.lastY >= -100 && obstacle.y < -100) {
obstacle.destroy();
obstacles.splice(o, 1);
continue;
}
var carLeft = car.x - 40;
var carRight = car.x + 40;
var carTop = car.y - 60;
var carBottom = car.y + 60;
var obstacleLeft = obstacle.x - 30;
var obstacleRight = obstacle.x + 30;
var obstacleTop = obstacle.y - 30;
var obstacleBottom = obstacle.y + 30;
if (carRight > obstacleLeft && carLeft < obstacleRight && carBottom > obstacleTop && carTop < obstacleBottom) {
isGameActive = false;
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
obstacle.lastY = obstacle.y;
}
for (var d = driftParticles.length - 1; d >= 0; d--) {
var particle = driftParticles[d];
if (particle.shouldDestroy) {
particle.destroy();
driftParticles.splice(d, 1);
}
}
var trackBoundaryLeft = 150;
var trackBoundaryRight = 1898;
if (car.x < trackBoundaryLeft || car.x > trackBoundaryRight) {
isGameActive = false;
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
updateScore();
speedTxt.setText('Speed: ' + (1 + (gameSpeed - 8) / 6).toFixed(1) + 'x');
};
initializeCar();
for (var t = 0; t < 8; t++) {
createTrackSegment(-200 + t * 400);
}
LK.playMusic('bgmusic', {
loop: true,
volume: 0.5
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,300 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Car = Container.expand(function () {
+ var self = Container.call(this);
+ var carGraphics = self.attachAsset('car', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.driftAngle = 0;
+ self.targetDriftAngle = 0;
+ self.isDrifting = false;
+ self.driftDuration = 0;
+ self.driftIntensity = 0;
+ self.rotation = 0;
+ self.update = function () {
+ self.y += self.speed;
+ self.driftAngle += (self.targetDriftAngle - self.driftAngle) * 0.1;
+ self.rotation = self.driftAngle;
+ if (self.isDrifting) {
+ self.driftDuration++;
+ self.driftIntensity = Math.min(1, self.driftDuration / 30);
+ }
+ };
+ return self;
+});
+var DriftParticle = Container.expand(function () {
+ var self = Container.call(this);
+ var particleGraphics = self.attachAsset('driftParticle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.life = 30;
+ self.maxLife = 30;
+ self.update = function () {
+ self.life--;
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ self.alpha = self.life / self.maxLife;
+ if (self.life <= 0) {
+ self.shouldDestroy = true;
+ }
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.lastY = self.y;
+ self.update = function () {
+ self.lastY = self.y;
+ self.y += self.speed;
+ };
+ return self;
+});
+var TrackSegment = Container.expand(function () {
+ var self = Container.call(this);
+ var trackGraphics = self.attachAsset('track', {
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ self.speed = 8;
+ self.curveOffset = 0;
+ self.leftBound = 0;
+ self.rightBound = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x1a1a1a
+});
+
+/****
+* Game Code
+****/
+var car = null;
+var trackSegments = [];
+var obstacles = [];
+var driftParticles = [];
+var score = 0;
+var driftMultiplier = 1;
+var driftCombo = 0;
+var gameSpeed = 8;
+var speedIncrement = 0;
+var isGameActive = true;
+var scoreTxt = new Text2('Score: 0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var comboTxt = new Text2('Combo: 0x', {
+ size: 100,
+ fill: 0xFFFF00
+});
+comboTxt.anchor.set(0.5, 0);
+comboTxt.x = 0;
+comboTxt.y = 150;
+LK.gui.top.addChild(comboTxt);
+var speedTxt = new Text2('Speed: 1x', {
+ size: 100,
+ fill: 0x00FF00
+});
+speedTxt.anchor.set(0.5, 0);
+speedTxt.x = 0;
+speedTxt.y = 250;
+LK.gui.top.addChild(speedTxt);
+function initializeCar() {
+ car = game.addChild(new Car());
+ car.x = 1024;
+ car.y = 2300;
+ car.speed = gameSpeed;
+}
+function createTrackSegment(yPos) {
+ var segment = game.addChild(new TrackSegment());
+ segment.x = 1024;
+ segment.y = yPos;
+ segment.speed = gameSpeed;
+ var randomCurve = Math.random() - 0.5;
+ segment.curveOffset = randomCurve * 200;
+ segment.x += segment.curveOffset;
+ segment.leftBound = segment.x - 300;
+ segment.rightBound = segment.x + 300;
+ trackSegments.push(segment);
+}
+function createObstacle(yPos, xOffset) {
+ var obstacle = game.addChild(new Obstacle());
+ obstacle.x = xOffset;
+ obstacle.y = yPos;
+ obstacle.speed = gameSpeed;
+ obstacle.lastY = yPos;
+ obstacles.push(obstacle);
+}
+function createDriftParticle(x, y) {
+ var particle = game.addChild(new DriftParticle());
+ particle.x = x;
+ particle.y = y;
+ particle.velocityX = (Math.random() - 0.5) * 6;
+ particle.velocityY = Math.random() * 3 + 2;
+ driftParticles.push(particle);
+}
+function updateScore() {
+ var driftBonus = Math.floor(car.driftIntensity * driftCombo * 10);
+ score += driftBonus;
+ LK.setScore(score);
+ scoreTxt.setText('Score: ' + score);
+}
+function endDrift() {
+ if (car.isDrifting && car.driftDuration > 10) {
+ var bonusScore = Math.floor(car.driftDuration * driftMultiplier * 2);
+ score += bonusScore;
+ driftCombo++;
+ driftMultiplier = 1 + driftCombo * 0.1;
+ LK.getSound('combo').play();
+ }
+ car.isDrifting = false;
+ car.driftDuration = 0;
+ car.driftIntensity = 0;
+ car.targetDriftAngle = 0;
+ comboTxt.setText('Combo: ' + driftCombo + 'x');
+ updateScore();
+}
+function resetDriftCombo() {
+ driftCombo = 0;
+ driftMultiplier = 1;
+ comboTxt.setText('Combo: 0x');
+}
+var dragNode = null;
+var lastCarX = 1024;
+game.down = function (x, y, obj) {
+ dragNode = car;
+ lastCarX = car.x;
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.move = function (x, y, obj) {
+ if (!isGameActive) return;
+ if (dragNode) {
+ var newX = x;
+ newX = Math.max(200, Math.min(1848, newX));
+ dragNode.x = newX;
+ var movementDelta = Math.abs(newX - lastCarX);
+ if (movementDelta > 5) {
+ dragNode.isDrifting = true;
+ dragNode.targetDriftAngle = (newX - lastCarX) * 0.02;
+ if (!car.isDrifting) {
+ LK.getSound('drift').play();
+ }
+ for (var p = 0; p < 2; p++) {
+ createDriftParticle(dragNode.x + (Math.random() - 0.5) * 60, dragNode.y);
+ }
+ } else {
+ dragNode.isDrifting = false;
+ dragNode.driftDuration = 0;
+ }
+ lastCarX = newX;
+ }
+};
+var trackCreateTimer = LK.setInterval(function () {
+ if (isGameActive) {
+ createTrackSegment(-200);
+ if (LK.ticks % 120 === 0) {
+ createObstacle(-300, 1024 + (Math.random() - 0.5) * 400);
+ }
+ }
+}, 100);
+var comboResetTimer = LK.setInterval(function () {
+ if (isGameActive && car.isDrifting === false && driftCombo > 0) {
+ var timeSinceLastDrift = 0;
+ if (timeSinceLastDrift > 60) {
+ resetDriftCombo();
+ }
+ }
+}, 500);
+game.update = function () {
+ if (!isGameActive) return;
+ speedIncrement++;
+ if (speedIncrement > 3000) {
+ gameSpeed = Math.min(14, gameSpeed + 0.5);
+ speedIncrement = 0;
+ }
+ car.speed = gameSpeed;
+ for (var i = trackSegments.length - 1; i >= 0; i--) {
+ var segment = trackSegments[i];
+ segment.speed = gameSpeed;
+ if (segment.y > 2800) {
+ segment.destroy();
+ trackSegments.splice(i, 1);
+ }
+ }
+ for (var o = obstacles.length - 1; o >= 0; o--) {
+ var obstacle = obstacles[o];
+ obstacle.speed = gameSpeed;
+ if (obstacle.lastY >= -100 && obstacle.y < -100) {
+ obstacle.destroy();
+ obstacles.splice(o, 1);
+ continue;
+ }
+ var carLeft = car.x - 40;
+ var carRight = car.x + 40;
+ var carTop = car.y - 60;
+ var carBottom = car.y + 60;
+ var obstacleLeft = obstacle.x - 30;
+ var obstacleRight = obstacle.x + 30;
+ var obstacleTop = obstacle.y - 30;
+ var obstacleBottom = obstacle.y + 30;
+ if (carRight > obstacleLeft && carLeft < obstacleRight && carBottom > obstacleTop && carTop < obstacleBottom) {
+ isGameActive = false;
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
+ }
+ obstacle.lastY = obstacle.y;
+ }
+ for (var d = driftParticles.length - 1; d >= 0; d--) {
+ var particle = driftParticles[d];
+ if (particle.shouldDestroy) {
+ particle.destroy();
+ driftParticles.splice(d, 1);
+ }
+ }
+ var trackBoundaryLeft = 150;
+ var trackBoundaryRight = 1898;
+ if (car.x < trackBoundaryLeft || car.x > trackBoundaryRight) {
+ isGameActive = false;
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
+ }
+ updateScore();
+ speedTxt.setText('Speed: ' + (1 + (gameSpeed - 8) / 6).toFixed(1) + 'x');
+};
+initializeCar();
+for (var t = 0; t < 8; t++) {
+ createTrackSegment(-200 + t * 400);
+}
+LK.playMusic('bgmusic', {
+ loop: true,
+ volume: 0.5
});
\ No newline at end of file