/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Heart = Container.expand(function () {
var self = Container.call(this);
var heartGraphics = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
self.driftX = 3;
self.driftY = 2;
self.baseSize = 1;
self.lettersCollected = 0;
self.update = function () {
self.x += self.driftX;
self.y += self.driftY;
// Wrap around screen edges
if (self.x < 0) self.x = 2048;
if (self.x > 2048) self.x = 0;
if (self.y < 0) self.y = 2732;
if (self.y > 2732) self.y = 0;
};
self.changeDriftDirection = function () {
self.driftX = -self.driftX;
self.driftY = -self.driftY;
};
self.collectLetter = function () {
self.lettersCollected++;
var newScale = self.baseSize + self.lettersCollected * 0.1;
tween(heartGraphics, {
scaleX: newScale,
scaleY: newScale
}, {
duration: 300,
easing: tween.easeOut
});
// Change color based on letters collected
var colors = [0xff69b4, 0xff1493, 0xdc143c, 0xb22222];
var colorIndex = Math.min(Math.floor(self.lettersCollected / 3), colors.length - 1);
tween(heartGraphics, {
tint: colors[colorIndex]
}, {
duration: 500
});
};
return self;
});
var LoveLetter = Container.expand(function () {
var self = Container.call(this);
var letterGraphics = self.attachAsset('loveLetter', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
letterGraphics.rotation += 0.05;
// Gentle floating animation
letterGraphics.y += Math.sin(LK.ticks * 0.1 + self.x * 0.01) * 0.5;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
var heart = game.addChild(new Heart());
heart.x = 1024;
heart.y = 1366;
var loveLetters = [];
var obstacles = [];
var targetLetters = 10;
var currentLevel = 1;
// UI Elements
var scoreTxt = new Text2('Letters: 0/' + targetLetters, {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level ' + currentLevel, {
size: 60,
fill: 0xFFB6C1
});
levelTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(levelTxt);
levelTxt.x -= 50;
levelTxt.y += 50;
// Generate initial love letters
function spawnLoveLetters() {
for (var i = 0; i < targetLetters; i++) {
var letter = new LoveLetter();
letter.x = Math.random() * 1800 + 124;
letter.y = Math.random() * 2400 + 166;
loveLetters.push(letter);
game.addChild(letter);
}
}
// Generate obstacles
function spawnObstacles() {
var obstacleCount = currentLevel + 2;
for (var i = 0; i < obstacleCount; i++) {
var obstacle = new Obstacle();
obstacle.x = Math.random() * 1800 + 124;
obstacle.y = Math.random() * 2400 + 166;
// Make sure obstacles don't spawn too close to heart or letters
var tooClose = true;
var attempts = 0;
while (tooClose && attempts < 20) {
tooClose = false;
// Check distance from heart
var heartDist = Math.sqrt(Math.pow(obstacle.x - heart.x, 2) + Math.pow(obstacle.y - heart.y, 2));
if (heartDist < 200) tooClose = true;
// Check distance from letters
for (var j = 0; j < loveLetters.length; j++) {
var letterDist = Math.sqrt(Math.pow(obstacle.x - loveLetters[j].x, 2) + Math.pow(obstacle.y - loveLetters[j].y, 2));
if (letterDist < 150) tooClose = true;
}
if (tooClose) {
obstacle.x = Math.random() * 1800 + 124;
obstacle.y = Math.random() * 2400 + 166;
}
attempts++;
}
obstacles.push(obstacle);
game.addChild(obstacle);
}
}
function nextLevel() {
currentLevel++;
targetLetters += 3;
// Clear existing letters and obstacles
for (var i = loveLetters.length - 1; i >= 0; i--) {
loveLetters[i].destroy();
}
loveLetters = [];
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].destroy();
}
obstacles = [];
// Reset heart position
heart.x = 1024;
heart.y = 1366;
heart.lettersCollected = 0;
// Update UI
scoreTxt.setText('Letters: 0/' + targetLetters);
levelTxt.setText('Level ' + currentLevel);
// Spawn new elements
spawnLoveLetters();
spawnObstacles();
// Flash screen to indicate level change
LK.effects.flashScreen(0x9370db, 800);
}
// Initialize first level
spawnLoveLetters();
spawnObstacles();
// Game input handling
game.down = function (x, y, obj) {
heart.changeDriftDirection();
};
// Main game loop
game.update = function () {
// Check collision with love letters
for (var i = loveLetters.length - 1; i >= 0; i--) {
var letter = loveLetters[i];
if (!letter.collected && heart.intersects(letter)) {
letter.collected = true;
heart.collectLetter();
LK.setScore(LK.getScore() + 10);
LK.getSound('collect').play();
// Remove letter with animation
tween(letter, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
letter.destroy();
}
});
loveLetters.splice(i, 1);
// Update score display
scoreTxt.setText('Letters: ' + heart.lettersCollected + '/' + targetLetters);
// Check if level complete
if (heart.lettersCollected >= targetLetters) {
LK.setTimeout(function () {
nextLevel();
}, 500);
}
}
}
// Check collision with obstacles
for (var i = 0; i < obstacles.length; i++) {
var obstacle = obstacles[i];
if (heart.intersects(obstacle)) {
LK.getSound('hit').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// Victory condition
if (currentLevel > 5) {
LK.showYouWin();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,226 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Heart = Container.expand(function () {
+ var self = Container.call(this);
+ var heartGraphics = self.attachAsset('heart', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.driftX = 3;
+ self.driftY = 2;
+ self.baseSize = 1;
+ self.lettersCollected = 0;
+ self.update = function () {
+ self.x += self.driftX;
+ self.y += self.driftY;
+ // Wrap around screen edges
+ if (self.x < 0) self.x = 2048;
+ if (self.x > 2048) self.x = 0;
+ if (self.y < 0) self.y = 2732;
+ if (self.y > 2732) self.y = 0;
+ };
+ self.changeDriftDirection = function () {
+ self.driftX = -self.driftX;
+ self.driftY = -self.driftY;
+ };
+ self.collectLetter = function () {
+ self.lettersCollected++;
+ var newScale = self.baseSize + self.lettersCollected * 0.1;
+ tween(heartGraphics, {
+ scaleX: newScale,
+ scaleY: newScale
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ // Change color based on letters collected
+ var colors = [0xff69b4, 0xff1493, 0xdc143c, 0xb22222];
+ var colorIndex = Math.min(Math.floor(self.lettersCollected / 3), colors.length - 1);
+ tween(heartGraphics, {
+ tint: colors[colorIndex]
+ }, {
+ duration: 500
+ });
+ };
+ return self;
+});
+var LoveLetter = Container.expand(function () {
+ var self = Container.call(this);
+ var letterGraphics = self.attachAsset('loveLetter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.update = function () {
+ letterGraphics.rotation += 0.05;
+ // Gentle floating animation
+ letterGraphics.y += Math.sin(LK.ticks * 0.1 + self.x * 0.01) * 0.5;
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022
+});
+
+/****
+* Game Code
+****/
+var heart = game.addChild(new Heart());
+heart.x = 1024;
+heart.y = 1366;
+var loveLetters = [];
+var obstacles = [];
+var targetLetters = 10;
+var currentLevel = 1;
+// UI Elements
+var scoreTxt = new Text2('Letters: 0/' + targetLetters, {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Level ' + currentLevel, {
+ size: 60,
+ fill: 0xFFB6C1
+});
+levelTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(levelTxt);
+levelTxt.x -= 50;
+levelTxt.y += 50;
+// Generate initial love letters
+function spawnLoveLetters() {
+ for (var i = 0; i < targetLetters; i++) {
+ var letter = new LoveLetter();
+ letter.x = Math.random() * 1800 + 124;
+ letter.y = Math.random() * 2400 + 166;
+ loveLetters.push(letter);
+ game.addChild(letter);
+ }
+}
+// Generate obstacles
+function spawnObstacles() {
+ var obstacleCount = currentLevel + 2;
+ for (var i = 0; i < obstacleCount; i++) {
+ var obstacle = new Obstacle();
+ obstacle.x = Math.random() * 1800 + 124;
+ obstacle.y = Math.random() * 2400 + 166;
+ // Make sure obstacles don't spawn too close to heart or letters
+ var tooClose = true;
+ var attempts = 0;
+ while (tooClose && attempts < 20) {
+ tooClose = false;
+ // Check distance from heart
+ var heartDist = Math.sqrt(Math.pow(obstacle.x - heart.x, 2) + Math.pow(obstacle.y - heart.y, 2));
+ if (heartDist < 200) tooClose = true;
+ // Check distance from letters
+ for (var j = 0; j < loveLetters.length; j++) {
+ var letterDist = Math.sqrt(Math.pow(obstacle.x - loveLetters[j].x, 2) + Math.pow(obstacle.y - loveLetters[j].y, 2));
+ if (letterDist < 150) tooClose = true;
+ }
+ if (tooClose) {
+ obstacle.x = Math.random() * 1800 + 124;
+ obstacle.y = Math.random() * 2400 + 166;
+ }
+ attempts++;
+ }
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+ }
+}
+function nextLevel() {
+ currentLevel++;
+ targetLetters += 3;
+ // Clear existing letters and obstacles
+ for (var i = loveLetters.length - 1; i >= 0; i--) {
+ loveLetters[i].destroy();
+ }
+ loveLetters = [];
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ obstacles[i].destroy();
+ }
+ obstacles = [];
+ // Reset heart position
+ heart.x = 1024;
+ heart.y = 1366;
+ heart.lettersCollected = 0;
+ // Update UI
+ scoreTxt.setText('Letters: 0/' + targetLetters);
+ levelTxt.setText('Level ' + currentLevel);
+ // Spawn new elements
+ spawnLoveLetters();
+ spawnObstacles();
+ // Flash screen to indicate level change
+ LK.effects.flashScreen(0x9370db, 800);
+}
+// Initialize first level
+spawnLoveLetters();
+spawnObstacles();
+// Game input handling
+game.down = function (x, y, obj) {
+ heart.changeDriftDirection();
+};
+// Main game loop
+game.update = function () {
+ // Check collision with love letters
+ for (var i = loveLetters.length - 1; i >= 0; i--) {
+ var letter = loveLetters[i];
+ if (!letter.collected && heart.intersects(letter)) {
+ letter.collected = true;
+ heart.collectLetter();
+ LK.setScore(LK.getScore() + 10);
+ LK.getSound('collect').play();
+ // Remove letter with animation
+ tween(letter, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ letter.destroy();
+ }
+ });
+ loveLetters.splice(i, 1);
+ // Update score display
+ scoreTxt.setText('Letters: ' + heart.lettersCollected + '/' + targetLetters);
+ // Check if level complete
+ if (heart.lettersCollected >= targetLetters) {
+ LK.setTimeout(function () {
+ nextLevel();
+ }, 500);
+ }
+ }
+ }
+ // Check collision with obstacles
+ for (var i = 0; i < obstacles.length; i++) {
+ var obstacle = obstacles[i];
+ if (heart.intersects(obstacle)) {
+ LK.getSound('hit').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Victory condition
+ if (currentLevel > 5) {
+ LK.showYouWin();
+ }
+};
\ No newline at end of file