/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var CosmicObject = Container.expand(function (type, speed, pointValue) {
var self = Container.call(this);
// Set default values if not provided
self.type = type || 'cosmicGem';
self.speed = speed || 2;
self.pointValue = pointValue || 1;
// Create the cosmic object visual
var objectGraphics = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
// Apply random rotation for visual interest
objectGraphics.rotation = Math.random() * Math.PI * 2;
// Define movement properties
self.velocityX = 0;
self.velocityY = self.speed;
self.beingPulled = false;
self.captureProgress = 0; // 0 to 1, where 1 means captured
// Update method called every tick
self.update = function () {
if (!self.beingPulled) {
// Normal movement
self.x += self.velocityX;
self.y += self.velocityY;
}
};
// Apply gravitational pull from the well
self.applyGravity = function (well, deltaTime) {
if (!well.active) {
return;
}
// Calculate distance between object and gravity well
var dx = well.x - self.x;
var dy = well.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Only apply gravity if within the well's influence
if (distance < well.radius) {
self.beingPulled = true;
// Calculate pull strength based on distance and well power
var pullStrength = Math.min(0.1, (well.radius - distance) / well.radius * 0.2) * well.power;
// Apply gravitational pull
self.velocityX += dx * pullStrength;
self.velocityY += dy * pullStrength;
// Apply velocity with damping for stability
self.x += self.velocityX * deltaTime;
self.y += self.velocityY * deltaTime;
// Increase capture progress when very close to the well
if (distance < well.radius * 0.2) {
self.captureProgress += 0.03;
// Visual feedback - scale down as being captured
objectGraphics.scale.x = objectGraphics.scale.y = 1 - self.captureProgress * 0.2;
// Object is fully captured
if (self.captureProgress >= 1) {
return true; // Signal that object is captured
}
}
} else {
self.beingPulled = false;
}
return false; // Not captured yet
};
return self;
});
var GravityWell = Container.expand(function () {
var self = Container.call(this);
// Create the gravity well visuals
var wellGraphics = self.attachAsset('gravityWell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
// Create the core of the gravity well
var coreGraphics = self.attachAsset('wellCore', {
anchorX: 0.5,
anchorY: 0.5
});
self.power = 1; // Base gravitational pull power
self.radius = wellGraphics.width / 2; // Radius of influence
self.active = true; // Whether the gravity well is active
// Increase the gravity well's power
self.increasePower = function (amount) {
self.power += amount;
// Visual feedback - pulse the well
tween(wellGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(wellGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
};
// Deactivate the gravity well temporarily
self.deactivate = function (duration) {
self.active = false;
wellGraphics.alpha = 0.2;
coreGraphics.alpha = 0.2;
LK.setTimeout(function () {
self.active = true;
wellGraphics.alpha = 0.5;
coreGraphics.alpha = 1;
}, duration);
};
// Pulse animation for the well
self.pulse = function () {
tween(wellGraphics, {
alpha: 0.7
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(wellGraphics, {
alpha: 0.5
}, {
duration: 500,
easing: tween.easeInOut
});
}
});
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
// Create star visual
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
alpha: Math.random() * 0.7 + 0.3 // Random brightness
});
// Set random scale for varied star sizes
var starScale = Math.random() * 0.7 + 0.3;
starGraphics.scale.x = starGraphics.scale.y = starScale;
// Set random movement speed (for parallax effect)
self.speed = starScale * 0.5; // Larger stars move faster for parallax effect
// Update method called every tick
self.update = function () {
self.y += self.speed;
// Reset position when star goes off screen
if (self.y > 2732) {
self.y = 0;
self.x = Math.random() * 2048;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
// Create background with stars
var stars = [];
for (var i = 0; i < 100; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
// Game variables
var gravityWell;
var cosmicObjects = [];
var gameActive = true;
var spawnTimer;
var difficultyTimer;
var difficulty = 1;
var lastUpdateTime = Date.now();
// UI elements
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.setText('Score: ' + LK.getScore());
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var highScoreTxt = new Text2('High Score: ' + storage.highScore, {
size: 60,
fill: 0xAAAAFF
});
highScoreTxt.anchor.set(1, 0);
highScoreTxt.x = -20;
highScoreTxt.y = 100;
LK.gui.topRight.addChild(highScoreTxt);
var powerTxt = new Text2('Gravity Power: 1', {
size: 60,
fill: 0x44AAFF
});
powerTxt.anchor.set(0, 0);
powerTxt.y = 100;
LK.gui.topLeft.addChild(powerTxt);
// Initialize gravity well
function initializeGame() {
// Create the gravity well
gravityWell = new GravityWell();
gravityWell.x = 2048 / 2;
gravityWell.y = 2732 / 2;
game.addChild(gravityWell);
// Start cosmic object spawning
spawnTimer = LK.setInterval(spawnCosmicObject, 1000);
// Increase difficulty over time
difficultyTimer = LK.setInterval(function () {
difficulty += 0.2;
gravityWell.pulse(); // Visual cue that difficulty increased
}, 10000);
// Start background music
LK.playMusic('cosmicAmbience', {
fade: {
start: 0,
end: 0.4,
duration: 2000
}
});
}
// Spawn a cosmic object with random properties
function spawnCosmicObject() {
var rand = Math.random();
var type, speed, points;
if (rand < 0.6) {
// Common cosmic gem
type = 'cosmicGem';
speed = 1 + Math.random() * difficulty;
points = 1;
} else if (rand < 0.85) {
// Rare gem
type = 'rareGem';
speed = 1.5 + Math.random() * difficulty;
points = 3;
} else if (rand < 0.95) {
// Space debris (harmful)
type = 'spaceDebris';
speed = 2 + Math.random() * difficulty;
points = -2;
} else {
// Power up
type = 'powerUp';
speed = 1 + Math.random() * difficulty;
points = 0; // Special handling for power ups
}
// Create the object
var object = new CosmicObject(type, speed, points);
// Position randomly at the top of the screen
object.x = Math.random() * 2048;
object.y = -100;
// Add some horizontal velocity for more interesting movement
object.velocityX = (Math.random() - 0.5) * 2;
// Add to game
cosmicObjects.push(object);
game.addChild(object);
}
// Handle dragging the gravity well
var isDragging = false;
game.down = function (x, y) {
// Check if the click is on/near the gravity well
var dx = x - gravityWell.x;
var dy = y - gravityWell.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < gravityWell.radius * 0.5) {
isDragging = true;
}
};
game.up = function () {
isDragging = false;
};
game.move = function (x, y) {
if (isDragging && gameActive) {
gravityWell.x = x;
gravityWell.y = y;
// Keep gravity well within game bounds
gravityWell.x = Math.max(gravityWell.radius, Math.min(2048 - gravityWell.radius, gravityWell.x));
gravityWell.y = Math.max(gravityWell.radius, Math.min(2732 - gravityWell.radius, gravityWell.y));
}
};
// Handle object and gravity interactions
function updateObjects() {
var currentTime = Date.now();
var deltaTime = (currentTime - lastUpdateTime) / 16.67; // Normalize to 60fps
lastUpdateTime = currentTime;
for (var i = cosmicObjects.length - 1; i >= 0; i--) {
var object = cosmicObjects[i];
// Update object position
object.update();
// Check if object is off-screen
if (object.y > 2732 + 100) {
object.destroy();
cosmicObjects.splice(i, 1);
continue;
}
// Apply gravity pull and check for capture
if (object.applyGravity(gravityWell, deltaTime)) {
// Object is captured
if (object.type === 'powerUp') {
// Power up increases gravity well strength
gravityWell.increasePower(0.2);
powerTxt.setText('Gravity Power: ' + gravityWell.power.toFixed(1));
LK.getSound('powerup').play();
LK.effects.flashObject(gravityWell, 0x22ff44, 500);
} else if (object.type === 'spaceDebris') {
// Space debris damages the gravity well
gravityWell.deactivate(2000);
LK.getSound('danger').play();
LK.effects.flashObject(gravityWell, 0xff2222, 500);
// Decrease score
LK.setScore(Math.max(0, LK.getScore() + object.pointValue));
scoreTxt.setText('Score: ' + LK.getScore());
} else {
// Regular cosmic objects increase score
LK.setScore(LK.getScore() + object.pointValue);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('collect').play();
}
// Remove the captured object
object.destroy();
cosmicObjects.splice(i, 1);
// Check win condition
if (LK.getScore() >= 100) {
endGame(true);
}
}
}
}
// Update stars for parallax effect
function updateStars() {
for (var i = 0; i < stars.length; i++) {
stars[i].update();
}
}
// End the game
function endGame(isWin) {
gameActive = false;
// Update high score
if (LK.getScore() > storage.highScore) {
storage.highScore = LK.getScore();
highScoreTxt.setText('High Score: ' + storage.highScore);
}
// Clear timers
LK.clearInterval(spawnTimer);
LK.clearInterval(difficultyTimer);
if (isWin) {
LK.showYouWin();
} else {
LK.showGameOver();
}
}
// Main game update function
game.update = function () {
if (!gameActive) {
return;
}
updateStars();
updateObjects();
// Gradually increase spawn rate based on difficulty
if (LK.ticks % Math.max(30, Math.floor(120 / difficulty)) === 0) {
spawnCosmicObject();
}
};
// Initialize the game
initializeGame(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,383 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0
+});
+
+/****
+* Classes
+****/
+var CosmicObject = Container.expand(function (type, speed, pointValue) {
+ var self = Container.call(this);
+ // Set default values if not provided
+ self.type = type || 'cosmicGem';
+ self.speed = speed || 2;
+ self.pointValue = pointValue || 1;
+ // Create the cosmic object visual
+ var objectGraphics = self.attachAsset(self.type, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Apply random rotation for visual interest
+ objectGraphics.rotation = Math.random() * Math.PI * 2;
+ // Define movement properties
+ self.velocityX = 0;
+ self.velocityY = self.speed;
+ self.beingPulled = false;
+ self.captureProgress = 0; // 0 to 1, where 1 means captured
+ // Update method called every tick
+ self.update = function () {
+ if (!self.beingPulled) {
+ // Normal movement
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ }
+ };
+ // Apply gravitational pull from the well
+ self.applyGravity = function (well, deltaTime) {
+ if (!well.active) {
+ return;
+ }
+ // Calculate distance between object and gravity well
+ var dx = well.x - self.x;
+ var dy = well.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Only apply gravity if within the well's influence
+ if (distance < well.radius) {
+ self.beingPulled = true;
+ // Calculate pull strength based on distance and well power
+ var pullStrength = Math.min(0.1, (well.radius - distance) / well.radius * 0.2) * well.power;
+ // Apply gravitational pull
+ self.velocityX += dx * pullStrength;
+ self.velocityY += dy * pullStrength;
+ // Apply velocity with damping for stability
+ self.x += self.velocityX * deltaTime;
+ self.y += self.velocityY * deltaTime;
+ // Increase capture progress when very close to the well
+ if (distance < well.radius * 0.2) {
+ self.captureProgress += 0.03;
+ // Visual feedback - scale down as being captured
+ objectGraphics.scale.x = objectGraphics.scale.y = 1 - self.captureProgress * 0.2;
+ // Object is fully captured
+ if (self.captureProgress >= 1) {
+ return true; // Signal that object is captured
+ }
+ }
+ } else {
+ self.beingPulled = false;
+ }
+ return false; // Not captured yet
+ };
+ return self;
+});
+var GravityWell = Container.expand(function () {
+ var self = Container.call(this);
+ // Create the gravity well visuals
+ var wellGraphics = self.attachAsset('gravityWell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5
+ });
+ // Create the core of the gravity well
+ var coreGraphics = self.attachAsset('wellCore', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.power = 1; // Base gravitational pull power
+ self.radius = wellGraphics.width / 2; // Radius of influence
+ self.active = true; // Whether the gravity well is active
+ // Increase the gravity well's power
+ self.increasePower = function (amount) {
+ self.power += amount;
+ // Visual feedback - pulse the well
+ tween(wellGraphics, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(wellGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ };
+ // Deactivate the gravity well temporarily
+ self.deactivate = function (duration) {
+ self.active = false;
+ wellGraphics.alpha = 0.2;
+ coreGraphics.alpha = 0.2;
+ LK.setTimeout(function () {
+ self.active = true;
+ wellGraphics.alpha = 0.5;
+ coreGraphics.alpha = 1;
+ }, duration);
+ };
+ // Pulse animation for the well
+ self.pulse = function () {
+ tween(wellGraphics, {
+ alpha: 0.7
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(wellGraphics, {
+ alpha: 0.5
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ };
+ return self;
+});
+var Star = Container.expand(function () {
+ var self = Container.call(this);
+ // Create star visual
+ var starGraphics = self.attachAsset('star', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: Math.random() * 0.7 + 0.3 // Random brightness
+ });
+ // Set random scale for varied star sizes
+ var starScale = Math.random() * 0.7 + 0.3;
+ starGraphics.scale.x = starGraphics.scale.y = starScale;
+ // Set random movement speed (for parallax effect)
+ self.speed = starScale * 0.5; // Larger stars move faster for parallax effect
+ // Update method called every tick
+ self.update = function () {
+ self.y += self.speed;
+ // Reset position when star goes off screen
+ if (self.y > 2732) {
+ self.y = 0;
+ self.x = Math.random() * 2048;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022
+});
+
+/****
+* Game Code
+****/
+// Create background with stars
+var stars = [];
+for (var i = 0; i < 100; i++) {
+ var star = new Star();
+ star.x = Math.random() * 2048;
+ star.y = Math.random() * 2732;
+ stars.push(star);
+ game.addChild(star);
+}
+// Game variables
+var gravityWell;
+var cosmicObjects = [];
+var gameActive = true;
+var spawnTimer;
+var difficultyTimer;
+var difficulty = 1;
+var lastUpdateTime = Date.now();
+// UI elements
+var scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.setText('Score: ' + LK.getScore());
+scoreTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreTxt);
+var highScoreTxt = new Text2('High Score: ' + storage.highScore, {
+ size: 60,
+ fill: 0xAAAAFF
+});
+highScoreTxt.anchor.set(1, 0);
+highScoreTxt.x = -20;
+highScoreTxt.y = 100;
+LK.gui.topRight.addChild(highScoreTxt);
+var powerTxt = new Text2('Gravity Power: 1', {
+ size: 60,
+ fill: 0x44AAFF
+});
+powerTxt.anchor.set(0, 0);
+powerTxt.y = 100;
+LK.gui.topLeft.addChild(powerTxt);
+// Initialize gravity well
+function initializeGame() {
+ // Create the gravity well
+ gravityWell = new GravityWell();
+ gravityWell.x = 2048 / 2;
+ gravityWell.y = 2732 / 2;
+ game.addChild(gravityWell);
+ // Start cosmic object spawning
+ spawnTimer = LK.setInterval(spawnCosmicObject, 1000);
+ // Increase difficulty over time
+ difficultyTimer = LK.setInterval(function () {
+ difficulty += 0.2;
+ gravityWell.pulse(); // Visual cue that difficulty increased
+ }, 10000);
+ // Start background music
+ LK.playMusic('cosmicAmbience', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 2000
+ }
+ });
+}
+// Spawn a cosmic object with random properties
+function spawnCosmicObject() {
+ var rand = Math.random();
+ var type, speed, points;
+ if (rand < 0.6) {
+ // Common cosmic gem
+ type = 'cosmicGem';
+ speed = 1 + Math.random() * difficulty;
+ points = 1;
+ } else if (rand < 0.85) {
+ // Rare gem
+ type = 'rareGem';
+ speed = 1.5 + Math.random() * difficulty;
+ points = 3;
+ } else if (rand < 0.95) {
+ // Space debris (harmful)
+ type = 'spaceDebris';
+ speed = 2 + Math.random() * difficulty;
+ points = -2;
+ } else {
+ // Power up
+ type = 'powerUp';
+ speed = 1 + Math.random() * difficulty;
+ points = 0; // Special handling for power ups
+ }
+ // Create the object
+ var object = new CosmicObject(type, speed, points);
+ // Position randomly at the top of the screen
+ object.x = Math.random() * 2048;
+ object.y = -100;
+ // Add some horizontal velocity for more interesting movement
+ object.velocityX = (Math.random() - 0.5) * 2;
+ // Add to game
+ cosmicObjects.push(object);
+ game.addChild(object);
+}
+// Handle dragging the gravity well
+var isDragging = false;
+game.down = function (x, y) {
+ // Check if the click is on/near the gravity well
+ var dx = x - gravityWell.x;
+ var dy = y - gravityWell.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < gravityWell.radius * 0.5) {
+ isDragging = true;
+ }
+};
+game.up = function () {
+ isDragging = false;
+};
+game.move = function (x, y) {
+ if (isDragging && gameActive) {
+ gravityWell.x = x;
+ gravityWell.y = y;
+ // Keep gravity well within game bounds
+ gravityWell.x = Math.max(gravityWell.radius, Math.min(2048 - gravityWell.radius, gravityWell.x));
+ gravityWell.y = Math.max(gravityWell.radius, Math.min(2732 - gravityWell.radius, gravityWell.y));
+ }
+};
+// Handle object and gravity interactions
+function updateObjects() {
+ var currentTime = Date.now();
+ var deltaTime = (currentTime - lastUpdateTime) / 16.67; // Normalize to 60fps
+ lastUpdateTime = currentTime;
+ for (var i = cosmicObjects.length - 1; i >= 0; i--) {
+ var object = cosmicObjects[i];
+ // Update object position
+ object.update();
+ // Check if object is off-screen
+ if (object.y > 2732 + 100) {
+ object.destroy();
+ cosmicObjects.splice(i, 1);
+ continue;
+ }
+ // Apply gravity pull and check for capture
+ if (object.applyGravity(gravityWell, deltaTime)) {
+ // Object is captured
+ if (object.type === 'powerUp') {
+ // Power up increases gravity well strength
+ gravityWell.increasePower(0.2);
+ powerTxt.setText('Gravity Power: ' + gravityWell.power.toFixed(1));
+ LK.getSound('powerup').play();
+ LK.effects.flashObject(gravityWell, 0x22ff44, 500);
+ } else if (object.type === 'spaceDebris') {
+ // Space debris damages the gravity well
+ gravityWell.deactivate(2000);
+ LK.getSound('danger').play();
+ LK.effects.flashObject(gravityWell, 0xff2222, 500);
+ // Decrease score
+ LK.setScore(Math.max(0, LK.getScore() + object.pointValue));
+ scoreTxt.setText('Score: ' + LK.getScore());
+ } else {
+ // Regular cosmic objects increase score
+ LK.setScore(LK.getScore() + object.pointValue);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ LK.getSound('collect').play();
+ }
+ // Remove the captured object
+ object.destroy();
+ cosmicObjects.splice(i, 1);
+ // Check win condition
+ if (LK.getScore() >= 100) {
+ endGame(true);
+ }
+ }
+ }
+}
+// Update stars for parallax effect
+function updateStars() {
+ for (var i = 0; i < stars.length; i++) {
+ stars[i].update();
+ }
+}
+// End the game
+function endGame(isWin) {
+ gameActive = false;
+ // Update high score
+ if (LK.getScore() > storage.highScore) {
+ storage.highScore = LK.getScore();
+ highScoreTxt.setText('High Score: ' + storage.highScore);
+ }
+ // Clear timers
+ LK.clearInterval(spawnTimer);
+ LK.clearInterval(difficultyTimer);
+ if (isWin) {
+ LK.showYouWin();
+ } else {
+ LK.showGameOver();
+ }
+}
+// Main game update function
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ updateStars();
+ updateObjects();
+ // Gradually increase spawn rate based on difficulty
+ if (LK.ticks % Math.max(30, Math.floor(120 / difficulty)) === 0) {
+ spawnCosmicObject();
+ }
+};
+// Initialize the game
+initializeGame();
\ No newline at end of file