/****
* 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;
particle.shouldDestroy = false;
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();
lastDriftTime = LK.ticks;
}
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) {
if (dragNode && dragNode.isDrifting) {
endDrift();
}
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 {
if (dragNode.isDrifting) {
endDrift();
}
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 lastDriftTime = 0;
var comboResetTimer = LK.setInterval(function () {
if (isGameActive && driftCombo > 0) {
if (car.isDrifting) {
lastDriftTime = LK.ticks;
} else {
var timeSinceLastDrift = LK.ticks - lastDriftTime;
if (timeSinceLastDrift > 120) {
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
@@ -155,8 +155,9 @@
particle.x = x;
particle.y = y;
particle.velocityX = (Math.random() - 0.5) * 6;
particle.velocityY = Math.random() * 3 + 2;
+ particle.shouldDestroy = false;
driftParticles.push(particle);
}
function updateScore() {
var driftBonus = Math.floor(car.driftIntensity * driftCombo * 10);
@@ -170,8 +171,9 @@
score += bonusScore;
driftCombo++;
driftMultiplier = 1 + driftCombo * 0.1;
LK.getSound('combo').play();
+ lastDriftTime = LK.ticks;
}
car.isDrifting = false;
car.driftDuration = 0;
car.driftIntensity = 0;
@@ -190,8 +192,11 @@
dragNode = car;
lastCarX = car.x;
};
game.up = function (x, y, obj) {
+ if (dragNode && dragNode.isDrifting) {
+ endDrift();
+ }
dragNode = null;
};
game.move = function (x, y, obj) {
if (!isGameActive) return;
@@ -209,8 +214,11 @@
for (var p = 0; p < 2; p++) {
createDriftParticle(dragNode.x + (Math.random() - 0.5) * 60, dragNode.y);
}
} else {
+ if (dragNode.isDrifting) {
+ endDrift();
+ }
dragNode.isDrifting = false;
dragNode.driftDuration = 0;
}
lastCarX = newX;
@@ -223,13 +231,18 @@
createObstacle(-300, 1024 + (Math.random() - 0.5) * 400);
}
}
}, 100);
+var lastDriftTime = 0;
var comboResetTimer = LK.setInterval(function () {
- if (isGameActive && car.isDrifting === false && driftCombo > 0) {
- var timeSinceLastDrift = 0;
- if (timeSinceLastDrift > 60) {
- resetDriftCombo();
+ if (isGameActive && driftCombo > 0) {
+ if (car.isDrifting) {
+ lastDriftTime = LK.ticks;
+ } else {
+ var timeSinceLastDrift = LK.ticks - lastDriftTime;
+ if (timeSinceLastDrift > 120) {
+ resetDriftCombo();
+ }
}
}
}, 500);
game.update = function () {