/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BeatMarker = Container.expand(function () {
var self = Container.call(this);
var markerGraphics = self.attachAsset('beatMarker', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetX = 0;
self.targetY = 0;
self.speed = 3;
self.isActive = true;
self.hasBeenHit = false;
self.update = function () {
if (!self.isActive) return;
// Move toward target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
self.down = function (x, y, obj) {
if (!self.isActive || self.hasBeenHit) return;
var distance = Math.sqrt(Math.pow(self.x - self.targetX, 2) + Math.pow(self.y - self.targetY, 2));
if (distance < 60) {
self.hit();
}
};
self.hit = function () {
if (self.hasBeenHit) return;
self.hasBeenHit = true;
self.isActive = false;
// Perfect hit effect
var hitEffect = game.addChild(LK.getAsset('perfectHit', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
alpha: 1
}));
tween(hitEffect, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
hitEffect.destroy();
}
});
// Score and combo
combo++;
var points = 100 * combo;
LK.setScore(LK.getScore() + points);
// Update UI
scoreTxt.setText(LK.getScore());
comboTxt.setText('Combo: ' + combo);
// Caveman dance animation
cavemanDance();
LK.getSound('hit').play();
self.destroy();
};
return self;
});
var Caveman = Container.expand(function () {
var self = Container.call(this);
var cavemanGraphics = self.attachAsset('caveman', {
anchorX: 0.5,
anchorY: 1.0
});
self.isIdle = true;
self.danceTimer = 0;
self.update = function () {
if (self.isIdle) {
self.danceTimer++;
if (self.danceTimer % 30 === 0) {
self.idleDance();
}
}
};
self.idleDance = function () {
tween(cavemanGraphics, {
scaleX: 1.1,
rotation: 0.1
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(cavemanGraphics, {
scaleX: 1.0,
rotation: -0.1
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(cavemanGraphics, {
rotation: 0
}, {
duration: 100
});
}
});
}
});
};
self.performDance = function () {
self.isIdle = false;
tween(cavemanGraphics, {
scaleY: 0.8,
rotation: 0.3
}, {
duration: 150,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(cavemanGraphics, {
scaleY: 1.2,
rotation: -0.3
}, {
duration: 150,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(cavemanGraphics, {
scaleY: 1.0,
rotation: 0
}, {
duration: 200,
onFinish: function onFinish() {
self.isIdle = true;
}
});
}
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C1810
});
/****
* Game Code
****/
var caveman;
var targetArea;
var beatMarkers = [];
var combo = 0;
var lives = 3;
var markerSpawnTimer = 0;
var gameSpeed = 1;
var scoreTxt, comboTxt, livesTxt;
// Create target area in center
targetArea = game.addChild(LK.getAsset('targetArea', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
alpha: 0.7
}));
// Create caveman
caveman = game.addChild(new Caveman());
caveman.x = 2048 / 2;
caveman.y = 2732 / 2 + 100;
// UI Elements
scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFD700
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
comboTxt = new Text2('Combo: 0', {
size: 60,
fill: 0xFF6B35
});
comboTxt.anchor.set(0, 0);
comboTxt.x = 150;
comboTxt.y = 100;
LK.gui.topLeft.addChild(comboTxt);
livesTxt = new Text2('Lives: 3', {
size: 60,
fill: 0xFF4444
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
function spawnBeatMarker() {
var marker = new BeatMarker();
// Random spawn position from edges
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
marker.x = Math.random() * 2048;
marker.y = -100;
break;
case 1:
// Right
marker.x = 2148;
marker.y = Math.random() * 2732;
break;
case 2:
// Bottom
marker.x = Math.random() * 2048;
marker.y = 2832;
break;
case 3:
// Left
marker.x = -100;
marker.y = Math.random() * 2732;
break;
}
marker.targetX = targetArea.x;
marker.targetY = targetArea.y;
marker.speed = 2 + gameSpeed;
beatMarkers.push(marker);
game.addChild(marker);
}
function cavemanDance() {
caveman.performDance();
}
function checkMissedMarkers() {
for (var i = beatMarkers.length - 1; i >= 0; i--) {
var marker = beatMarkers[i];
if (!marker.isActive || marker.hasBeenHit) continue;
var distance = Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2));
// Check if marker passed the target without being hit
if (distance < 10 && !marker.hasBeenHit) {
// Miss!
combo = 0;
lives--;
comboTxt.setText('Combo: 0');
livesTxt.setText('Lives: ' + lives);
// Flash screen red
LK.effects.flashScreen(0xFF0000, 300);
LK.getSound('miss').play();
marker.destroy();
beatMarkers.splice(i, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
// Remove markers that are too far past the target
else if (distance > 200 && Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2)) > Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2))) {
marker.destroy();
beatMarkers.splice(i, 1);
}
}
}
game.down = function (x, y, obj) {
// Check if any marker was hit
var hit = false;
for (var i = 0; i < beatMarkers.length; i++) {
var marker = beatMarkers[i];
if (marker.isActive && !marker.hasBeenHit) {
var distance = Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2));
if (distance < 80) {
marker.hit();
hit = true;
break;
}
}
}
if (!hit) {
// Missed tap
combo = Math.max(0, combo - 1);
comboTxt.setText('Combo: ' + combo);
}
};
game.update = function () {
markerSpawnTimer++;
// Spawn markers based on beat (every 60 ticks = 1 second at 60fps)
if (markerSpawnTimer >= Math.max(30, 90 - LK.ticks / 300)) {
spawnBeatMarker();
markerSpawnTimer = 0;
}
// Gradually increase difficulty
if (LK.ticks % 600 === 0) {
gameSpeed += 0.1;
}
checkMissedMarkers();
// Clean up destroyed markers
for (var i = beatMarkers.length - 1; i >= 0; i--) {
if (beatMarkers[i].hasBeenHit) {
beatMarkers.splice(i, 1);
}
}
// Update UI
scoreTxt.setText(LK.getScore());
};
// Start the music
LK.playMusic('danceMusic'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,305 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var BeatMarker = Container.expand(function () {
+ var self = Container.call(this);
+ var markerGraphics = self.attachAsset('beatMarker', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.targetX = 0;
+ self.targetY = 0;
+ self.speed = 3;
+ self.isActive = true;
+ self.hasBeenHit = false;
+ self.update = function () {
+ if (!self.isActive) return;
+ // Move toward target
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 5) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (!self.isActive || self.hasBeenHit) return;
+ var distance = Math.sqrt(Math.pow(self.x - self.targetX, 2) + Math.pow(self.y - self.targetY, 2));
+ if (distance < 60) {
+ self.hit();
+ }
+ };
+ self.hit = function () {
+ if (self.hasBeenHit) return;
+ self.hasBeenHit = true;
+ self.isActive = false;
+ // Perfect hit effect
+ var hitEffect = game.addChild(LK.getAsset('perfectHit', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: self.x,
+ y: self.y,
+ alpha: 1
+ }));
+ tween(hitEffect, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ hitEffect.destroy();
+ }
+ });
+ // Score and combo
+ combo++;
+ var points = 100 * combo;
+ LK.setScore(LK.getScore() + points);
+ // Update UI
+ scoreTxt.setText(LK.getScore());
+ comboTxt.setText('Combo: ' + combo);
+ // Caveman dance animation
+ cavemanDance();
+ LK.getSound('hit').play();
+ self.destroy();
+ };
+ return self;
+});
+var Caveman = Container.expand(function () {
+ var self = Container.call(this);
+ var cavemanGraphics = self.attachAsset('caveman', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.isIdle = true;
+ self.danceTimer = 0;
+ self.update = function () {
+ if (self.isIdle) {
+ self.danceTimer++;
+ if (self.danceTimer % 30 === 0) {
+ self.idleDance();
+ }
+ }
+ };
+ self.idleDance = function () {
+ tween(cavemanGraphics, {
+ scaleX: 1.1,
+ rotation: 0.1
+ }, {
+ duration: 200,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(cavemanGraphics, {
+ scaleX: 1.0,
+ rotation: -0.1
+ }, {
+ duration: 200,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(cavemanGraphics, {
+ rotation: 0
+ }, {
+ duration: 100
+ });
+ }
+ });
+ }
+ });
+ };
+ self.performDance = function () {
+ self.isIdle = false;
+ tween(cavemanGraphics, {
+ scaleY: 0.8,
+ rotation: 0.3
+ }, {
+ duration: 150,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ tween(cavemanGraphics, {
+ scaleY: 1.2,
+ rotation: -0.3
+ }, {
+ duration: 150,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ tween(cavemanGraphics, {
+ scaleY: 1.0,
+ rotation: 0
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ self.isIdle = true;
+ }
+ });
+ }
+ });
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2C1810
+});
+
+/****
+* Game Code
+****/
+var caveman;
+var targetArea;
+var beatMarkers = [];
+var combo = 0;
+var lives = 3;
+var markerSpawnTimer = 0;
+var gameSpeed = 1;
+var scoreTxt, comboTxt, livesTxt;
+// Create target area in center
+targetArea = game.addChild(LK.getAsset('targetArea', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 2732 / 2,
+ alpha: 0.7
+}));
+// Create caveman
+caveman = game.addChild(new Caveman());
+caveman.x = 2048 / 2;
+caveman.y = 2732 / 2 + 100;
+// UI Elements
+scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0xFFD700
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+comboTxt = new Text2('Combo: 0', {
+ size: 60,
+ fill: 0xFF6B35
+});
+comboTxt.anchor.set(0, 0);
+comboTxt.x = 150;
+comboTxt.y = 100;
+LK.gui.topLeft.addChild(comboTxt);
+livesTxt = new Text2('Lives: 3', {
+ size: 60,
+ fill: 0xFF4444
+});
+livesTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(livesTxt);
+function spawnBeatMarker() {
+ var marker = new BeatMarker();
+ // Random spawn position from edges
+ var side = Math.floor(Math.random() * 4);
+ switch (side) {
+ case 0:
+ // Top
+ marker.x = Math.random() * 2048;
+ marker.y = -100;
+ break;
+ case 1:
+ // Right
+ marker.x = 2148;
+ marker.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ marker.x = Math.random() * 2048;
+ marker.y = 2832;
+ break;
+ case 3:
+ // Left
+ marker.x = -100;
+ marker.y = Math.random() * 2732;
+ break;
+ }
+ marker.targetX = targetArea.x;
+ marker.targetY = targetArea.y;
+ marker.speed = 2 + gameSpeed;
+ beatMarkers.push(marker);
+ game.addChild(marker);
+}
+function cavemanDance() {
+ caveman.performDance();
+}
+function checkMissedMarkers() {
+ for (var i = beatMarkers.length - 1; i >= 0; i--) {
+ var marker = beatMarkers[i];
+ if (!marker.isActive || marker.hasBeenHit) continue;
+ var distance = Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2));
+ // Check if marker passed the target without being hit
+ if (distance < 10 && !marker.hasBeenHit) {
+ // Miss!
+ combo = 0;
+ lives--;
+ comboTxt.setText('Combo: 0');
+ livesTxt.setText('Lives: ' + lives);
+ // Flash screen red
+ LK.effects.flashScreen(0xFF0000, 300);
+ LK.getSound('miss').play();
+ marker.destroy();
+ beatMarkers.splice(i, 1);
+ if (lives <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Remove markers that are too far past the target
+ else if (distance > 200 && Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2)) > Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2))) {
+ marker.destroy();
+ beatMarkers.splice(i, 1);
+ }
+ }
+}
+game.down = function (x, y, obj) {
+ // Check if any marker was hit
+ var hit = false;
+ for (var i = 0; i < beatMarkers.length; i++) {
+ var marker = beatMarkers[i];
+ if (marker.isActive && !marker.hasBeenHit) {
+ var distance = Math.sqrt(Math.pow(marker.x - marker.targetX, 2) + Math.pow(marker.y - marker.targetY, 2));
+ if (distance < 80) {
+ marker.hit();
+ hit = true;
+ break;
+ }
+ }
+ }
+ if (!hit) {
+ // Missed tap
+ combo = Math.max(0, combo - 1);
+ comboTxt.setText('Combo: ' + combo);
+ }
+};
+game.update = function () {
+ markerSpawnTimer++;
+ // Spawn markers based on beat (every 60 ticks = 1 second at 60fps)
+ if (markerSpawnTimer >= Math.max(30, 90 - LK.ticks / 300)) {
+ spawnBeatMarker();
+ markerSpawnTimer = 0;
+ }
+ // Gradually increase difficulty
+ if (LK.ticks % 600 === 0) {
+ gameSpeed += 0.1;
+ }
+ checkMissedMarkers();
+ // Clean up destroyed markers
+ for (var i = beatMarkers.length - 1; i >= 0; i--) {
+ if (beatMarkers[i].hasBeenHit) {
+ beatMarkers.splice(i, 1);
+ }
+ }
+ // Update UI
+ scoreTxt.setText(LK.getScore());
+};
+// Start the music
+LK.playMusic('danceMusic');
\ No newline at end of file