/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var FeedbackEffect = Container.expand(function () {
var self = Container.call(this);
self.showEffect = function (type, x, y) {
var effectGraphics;
if (type === 'perfect') {
effectGraphics = self.attachAsset('perfectHit', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'good') {
effectGraphics = self.attachAsset('goodHit', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
effectGraphics = self.attachAsset('missHit', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.x = x;
self.y = y;
effectGraphics.alpha = 0.8;
effectGraphics.scaleX = 0.5;
effectGraphics.scaleY = 0.5;
tween(effectGraphics, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var MovingIndicator = Container.expand(function () {
var self = Container.call(this);
var indicatorGraphics = self.attachAsset('indicator', {
anchorX: 0.5,
anchorY: 0.5
});
self.angle = 0;
self.speed = 0.02;
self.radius = 350;
self.centerX = 1024;
self.centerY = 1366;
self.update = function () {
self.angle += self.speed;
if (self.angle > Math.PI * 2) {
self.angle = 0;
}
self.x = self.centerX + Math.cos(self.angle) * self.radius;
self.y = self.centerY + Math.sin(self.angle) * self.radius;
};
self.increaseSpeed = function () {
self.speed += 0.005;
if (self.speed > 0.08) {
self.speed = 0.08;
}
};
return self;
});
var TargetZone = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('targetZone', {
anchorX: 0.5,
anchorY: 0.5
});
targetGraphics.alpha = 0.8;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var gameScore = 0;
var missCount = 0;
var maxMisses = 3;
var level = 1;
var isGameRunning = true;
var lastTapTime = 0;
// Create track background
var trackBg = game.addChild(LK.getAsset('trackBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.3
}));
// Create target zone
var targetZone = game.addChild(new TargetZone());
targetZone.x = 1024 + 350; // Position on the right side of the circle
targetZone.y = 1366;
// Create moving indicator
var indicator = game.addChild(new MovingIndicator());
// Create UI elements
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0, 0);
levelText.x = 50;
levelText.y = 150;
LK.gui.topLeft.addChild(levelText);
var missesText = new Text2('Misses: 0/3', {
size: 60,
fill: 0xFF6B6B
});
missesText.anchor.set(1, 0);
LK.gui.topRight.addChild(missesText);
var instructionText = new Text2('Tap when the green circle hits the orange target!', {
size: 50,
fill: 0xCCCCCC
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
function updateUI() {
scoreText.setText('Score: ' + gameScore);
levelText.setText('Level: ' + level);
missesText.setText('Misses: ' + missCount + '/' + maxMisses);
}
function calculateDistance(x1, y1, x2, y2) {
var dx = x2 - x1;
var dy = y2 - y1;
return Math.sqrt(dx * dx + dy * dy);
}
function handleTap() {
if (!isGameRunning) return;
var currentTime = LK.ticks;
if (currentTime - lastTapTime < 10) return; // Prevent rapid tapping
lastTapTime = currentTime;
var distance = calculateDistance(indicator.x, indicator.y, targetZone.x, targetZone.y);
var targetRadius = 60; // Half of target zone width
var feedbackEffect = game.addChild(new FeedbackEffect());
if (distance <= 30) {
// Perfect hit
gameScore += 100;
feedbackEffect.showEffect('perfect', indicator.x, indicator.y);
LK.getSound('perfectSound').play();
LK.effects.flashObject(targetZone, 0x00FF00, 300);
} else if (distance <= targetRadius) {
// Good hit
gameScore += 50;
feedbackEffect.showEffect('good', indicator.x, indicator.y);
LK.getSound('goodSound').play();
LK.effects.flashObject(targetZone, 0xFFFF00, 300);
} else {
// Miss
missCount++;
feedbackEffect.showEffect('miss', indicator.x, indicator.y);
LK.getSound('missSound').play();
LK.effects.flashObject(targetZone, 0xFF0000, 500);
if (missCount >= maxMisses) {
isGameRunning = false;
LK.setScore(gameScore);
LK.showGameOver();
return;
}
}
// Level progression
if (gameScore > 0 && gameScore % 500 === 0) {
level++;
indicator.increaseSpeed();
LK.effects.flashScreen(0x4CAF50, 500);
}
updateUI();
}
game.down = function (x, y, obj) {
handleTap();
};
game.update = function () {
if (!isGameRunning) return;
// Check if indicator passed target zone without being tapped
var distance = calculateDistance(indicator.x, indicator.y, targetZone.x, targetZone.y);
if (indicator.lastDistance !== undefined) {
if (indicator.lastDistance > 60 && distance <= 60) {
// Indicator just entered target zone
indicator.inTargetZone = true;
} else if (indicator.lastDistance <= 60 && distance > 60 && indicator.inTargetZone) {
// Indicator just left target zone without being tapped
indicator.inTargetZone = false;
if (LK.ticks - lastTapTime > 30) {
// Only count as miss if no recent tap
missCount++;
var missEffect = game.addChild(new FeedbackEffect());
missEffect.showEffect('miss', targetZone.x, targetZone.y);
LK.getSound('missSound').play();
if (missCount >= maxMisses) {
isGameRunning = false;
LK.setScore(gameScore);
LK.showGameOver();
return;
}
updateUI();
}
}
}
indicator.lastDistance = distance;
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,224 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var FeedbackEffect = Container.expand(function () {
+ var self = Container.call(this);
+ self.showEffect = function (type, x, y) {
+ var effectGraphics;
+ if (type === 'perfect') {
+ effectGraphics = self.attachAsset('perfectHit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ } else if (type === 'good') {
+ effectGraphics = self.attachAsset('goodHit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ } else {
+ effectGraphics = self.attachAsset('missHit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ }
+ self.x = x;
+ self.y = y;
+ effectGraphics.alpha = 0.8;
+ effectGraphics.scaleX = 0.5;
+ effectGraphics.scaleY = 0.5;
+ tween(effectGraphics, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+var MovingIndicator = Container.expand(function () {
+ var self = Container.call(this);
+ var indicatorGraphics = self.attachAsset('indicator', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.angle = 0;
+ self.speed = 0.02;
+ self.radius = 350;
+ self.centerX = 1024;
+ self.centerY = 1366;
+ self.update = function () {
+ self.angle += self.speed;
+ if (self.angle > Math.PI * 2) {
+ self.angle = 0;
+ }
+ self.x = self.centerX + Math.cos(self.angle) * self.radius;
+ self.y = self.centerY + Math.sin(self.angle) * self.radius;
+ };
+ self.increaseSpeed = function () {
+ self.speed += 0.005;
+ if (self.speed > 0.08) {
+ self.speed = 0.08;
+ }
+ };
+ return self;
+});
+var TargetZone = Container.expand(function () {
+ var self = Container.call(this);
+ var targetGraphics = self.attachAsset('targetZone', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ targetGraphics.alpha = 0.8;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a1a1a
+});
+
+/****
+* Game Code
+****/
+var gameScore = 0;
+var missCount = 0;
+var maxMisses = 3;
+var level = 1;
+var isGameRunning = true;
+var lastTapTime = 0;
+// Create track background
+var trackBg = game.addChild(LK.getAsset('trackBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366,
+ alpha: 0.3
+}));
+// Create target zone
+var targetZone = game.addChild(new TargetZone());
+targetZone.x = 1024 + 350; // Position on the right side of the circle
+targetZone.y = 1366;
+// Create moving indicator
+var indicator = game.addChild(new MovingIndicator());
+// Create UI elements
+var scoreText = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var levelText = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelText.anchor.set(0, 0);
+levelText.x = 50;
+levelText.y = 150;
+LK.gui.topLeft.addChild(levelText);
+var missesText = new Text2('Misses: 0/3', {
+ size: 60,
+ fill: 0xFF6B6B
+});
+missesText.anchor.set(1, 0);
+LK.gui.topRight.addChild(missesText);
+var instructionText = new Text2('Tap when the green circle hits the orange target!', {
+ size: 50,
+ fill: 0xCCCCCC
+});
+instructionText.anchor.set(0.5, 1);
+LK.gui.bottom.addChild(instructionText);
+function updateUI() {
+ scoreText.setText('Score: ' + gameScore);
+ levelText.setText('Level: ' + level);
+ missesText.setText('Misses: ' + missCount + '/' + maxMisses);
+}
+function calculateDistance(x1, y1, x2, y2) {
+ var dx = x2 - x1;
+ var dy = y2 - y1;
+ return Math.sqrt(dx * dx + dy * dy);
+}
+function handleTap() {
+ if (!isGameRunning) return;
+ var currentTime = LK.ticks;
+ if (currentTime - lastTapTime < 10) return; // Prevent rapid tapping
+ lastTapTime = currentTime;
+ var distance = calculateDistance(indicator.x, indicator.y, targetZone.x, targetZone.y);
+ var targetRadius = 60; // Half of target zone width
+ var feedbackEffect = game.addChild(new FeedbackEffect());
+ if (distance <= 30) {
+ // Perfect hit
+ gameScore += 100;
+ feedbackEffect.showEffect('perfect', indicator.x, indicator.y);
+ LK.getSound('perfectSound').play();
+ LK.effects.flashObject(targetZone, 0x00FF00, 300);
+ } else if (distance <= targetRadius) {
+ // Good hit
+ gameScore += 50;
+ feedbackEffect.showEffect('good', indicator.x, indicator.y);
+ LK.getSound('goodSound').play();
+ LK.effects.flashObject(targetZone, 0xFFFF00, 300);
+ } else {
+ // Miss
+ missCount++;
+ feedbackEffect.showEffect('miss', indicator.x, indicator.y);
+ LK.getSound('missSound').play();
+ LK.effects.flashObject(targetZone, 0xFF0000, 500);
+ if (missCount >= maxMisses) {
+ isGameRunning = false;
+ LK.setScore(gameScore);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Level progression
+ if (gameScore > 0 && gameScore % 500 === 0) {
+ level++;
+ indicator.increaseSpeed();
+ LK.effects.flashScreen(0x4CAF50, 500);
+ }
+ updateUI();
+}
+game.down = function (x, y, obj) {
+ handleTap();
+};
+game.update = function () {
+ if (!isGameRunning) return;
+ // Check if indicator passed target zone without being tapped
+ var distance = calculateDistance(indicator.x, indicator.y, targetZone.x, targetZone.y);
+ if (indicator.lastDistance !== undefined) {
+ if (indicator.lastDistance > 60 && distance <= 60) {
+ // Indicator just entered target zone
+ indicator.inTargetZone = true;
+ } else if (indicator.lastDistance <= 60 && distance > 60 && indicator.inTargetZone) {
+ // Indicator just left target zone without being tapped
+ indicator.inTargetZone = false;
+ if (LK.ticks - lastTapTime > 30) {
+ // Only count as miss if no recent tap
+ missCount++;
+ var missEffect = game.addChild(new FeedbackEffect());
+ missEffect.showEffect('miss', targetZone.x, targetZone.y);
+ LK.getSound('missSound').play();
+ if (missCount >= maxMisses) {
+ isGameRunning = false;
+ LK.setScore(gameScore);
+ LK.showGameOver();
+ return;
+ }
+ updateUI();
+ }
+ }
+ }
+ indicator.lastDistance = distance;
+};
\ No newline at end of file