/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var SnowParticle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('snow', { anchorX: 0.5, anchorY: 0.5 }); // Add slight animation tween(graphics, { rotation: Math.PI * 2 }, { duration: 3000 + Math.random() * 2000, easing: tween.linear }); return self; }); var Snowball = Container.expand(function () { var self = Container.call(this); self.size = 1; self.maxSpeed = 100; self.isPlayer = false; self.moveDirection = { x: 0, y: 0 }; self.targetX = 0; self.targetY = 0; var graphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); self.setSize = function (newSize) { self.size = newSize; var scale = Math.sqrt(newSize); graphics.scaleX = scale; graphics.scaleY = scale; self.maxSpeed = Math.max(1, 4 - scale * 0.5); }; self.grow = function (amount) { self.setSize(self.size + amount); }; self.update = function () { if (!self.isPlayer) { // AI movement for enemy snowballs - look for snow particles var closestSnow = null; var closestDistance = Infinity; // Find closest snow particle for (var s = 0; s < snowParticles.length; s++) { var snow = snowParticles[s]; var dx = snow.x - self.x; var dy = snow.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestSnow = snow; } } // Move towards closest snow if found and within range if (closestSnow && closestDistance < 300) { self.targetX = closestSnow.x; self.targetY = closestSnow.y; } else if (Math.random() < 0.02) { // Random movement if no snow nearby self.targetX = Math.random() * 2048; self.targetY = Math.random() * 2732; } var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 10) { self.moveDirection.x = dx / distance * 0.3; self.moveDirection.y = dy / distance * 0.3; } } // Apply movement self.x += self.moveDirection.x * self.maxSpeed; self.y += self.moveDirection.y * self.maxSpeed; // Keep within bounds self.x = Math.max(40, Math.min(2008, self.x)); self.y = Math.max(40, Math.min(2692, self.y)); // Only apply slowdown to AI enemies, not player if (!self.isPlayer) { self.moveDirection.x *= 0.95; self.moveDirection.y *= 0.95; } }; return self; }); var PlayerSnowball = Snowball.expand(function () { var self = Snowball.call(this); self.isPlayer = true; // Override graphics for player self.removeChild(self.children[0]); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); self.setSize = function (newSize) { self.size = newSize; var scale = Math.sqrt(newSize); playerGraphics.scaleX = scale; playerGraphics.scaleY = scale; self.maxSpeed = Math.max(3, 8 - scale * 0.3); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var player; var enemies = []; var snowParticles = []; var dragNode = null; // UI Elements var scoreTxt = new Text2('Size: 1.0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create player snowball player = game.addChild(new PlayerSnowball()); player.x = 1024; player.y = 1366; player.setSize(1); // Create enemy snowballs for (var i = 0; i < 8; i++) { var enemy = game.addChild(new Snowball()); enemy.x = Math.random() * 1800 + 124; enemy.y = Math.random() * 2400 + 166; enemy.setSize(0.5 + Math.random() * 2); enemy.targetX = enemy.x; enemy.targetY = enemy.y; enemies.push(enemy); } // Create initial snow particles for (var i = 0; i < 25; i++) { var snow = game.addChild(new SnowParticle()); snow.x = Math.random() * 1800 + 124; snow.y = Math.random() * 2400 + 166; snowParticles.push(snow); } // Movement handling - mouse following function handleMove(x, y, obj) { var dx = x - player.x; var dy = y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { var moveForce = Math.min(distance / 50, 1.0); player.moveDirection.x = dx / distance * moveForce; player.moveDirection.y = dy / distance * moveForce; } else { // Stop when very close to target to prevent jittering player.moveDirection.x = 0; player.moveDirection.y = 0; } } game.move = handleMove; game.down = function (x, y, obj) { handleMove(x, y, obj); }; game.up = function (x, y, obj) { // No need to stop following on mouse up }; game.update = function () { // Check snow collection for (var i = snowParticles.length - 1; i >= 0; i--) { var snow = snowParticles[i]; var collected = false; // Check player collection var playerRadius = Math.sqrt(player.size) * 40; var dx = player.x - snow.x; var dy = player.y - snow.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < playerRadius) { player.grow(0.1); scoreTxt.setText('Size: ' + player.size.toFixed(1)); LK.getSound('collect').play(); collected = true; } // Check enemy collection if (!collected) { for (var e = 0; e < enemies.length; e++) { var enemy = enemies[e]; var enemyRadius = Math.sqrt(enemy.size) * 30; var dx = enemy.x - snow.x; var dy = enemy.y - snow.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < enemyRadius) { enemy.grow(0.08); collected = true; break; } } } if (collected) { snow.destroy(); snowParticles.splice(i, 1); } } // Check snowball collisions for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var playerRadius = Math.sqrt(player.size) * 40; var enemyRadius = Math.sqrt(enemy.size) * 30; var dx = player.x - enemy.x; var dy = player.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); var collisionDistance = (playerRadius + enemyRadius) * 0.7; if (distance < collisionDistance) { if (player.size > enemy.size * 1.2) { // Player absorbs enemy player.grow(enemy.size * 0.5); scoreTxt.setText('Size: ' + player.size.toFixed(1)); LK.getSound('absorb').play(); LK.effects.flashObject(player, 0x00ff00, 300); enemy.destroy(); enemies.splice(i, 1); // Check win condition if (enemies.length === 0) { LK.setScore(Math.floor(player.size * 10)); LK.showYouWin(); } } else if (enemy.size > player.size * 1.2) { // Enemy absorbs player - game over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } } // Enemy vs enemy collisions for (var i = 0; i < enemies.length; i++) { for (var j = i + 1; j < enemies.length; j++) { var enemy1 = enemies[i]; var enemy2 = enemies[j]; var radius1 = Math.sqrt(enemy1.size) * 30; var radius2 = Math.sqrt(enemy2.size) * 30; var dx = enemy1.x - enemy2.x; var dy = enemy1.y - enemy2.y; var distance = Math.sqrt(dx * dx + dy * dy); var collisionDistance = (radius1 + radius2) * 0.7; if (distance < collisionDistance) { if (enemy1.size > enemy2.size * 1.3) { enemy1.grow(enemy2.size * 0.3); enemy2.destroy(); enemies.splice(j, 1); j--; } else if (enemy2.size > enemy1.size * 1.3) { enemy2.grow(enemy1.size * 0.3); enemy1.destroy(); enemies.splice(i, 1); i--; break; } } } } // Spawn new snow particles if (LK.ticks % 90 === 0 && snowParticles.length < 30) { var newSnow = game.addChild(new SnowParticle()); newSnow.x = Math.random() * 1800 + 124; newSnow.y = Math.random() * 2400 + 166; snowParticles.push(newSnow); } // Occasionally spawn new enemies if (LK.ticks % 600 === 0 && enemies.length < 6) { var newEnemy = game.addChild(new Snowball()); newEnemy.x = Math.random() * 1800 + 124; newEnemy.y = Math.random() * 2400 + 166; newEnemy.setSize(0.3 + Math.random() * 1.5); newEnemy.targetX = newEnemy.x; newEnemy.targetY = newEnemy.y; enemies.push(newEnemy); } };
===================================================================
--- original.js
+++ change.js
@@ -86,11 +86,13 @@
self.y += self.moveDirection.y * self.maxSpeed;
// Keep within bounds
self.x = Math.max(40, Math.min(2008, self.x));
self.y = Math.max(40, Math.min(2692, self.y));
- // Gradually slow down movement
- self.moveDirection.x *= 0.95;
- self.moveDirection.y *= 0.95;
+ // Only apply slowdown to AI enemies, not player
+ if (!self.isPlayer) {
+ self.moveDirection.x *= 0.95;
+ self.moveDirection.y *= 0.95;
+ }
};
return self;
});
var PlayerSnowball = Snowball.expand(function () {
@@ -161,13 +163,16 @@
function handleMove(x, y, obj) {
var dx = x - player.x;
var dy = y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance > 0) {
- var maxMoveForce = 0.8;
- var moveForce = Math.min(distance / 100, maxMoveForce);
+ if (distance > 5) {
+ var moveForce = Math.min(distance / 50, 1.0);
player.moveDirection.x = dx / distance * moveForce;
player.moveDirection.y = dy / distance * moveForce;
+ } else {
+ // Stop when very close to target to prevent jittering
+ player.moveDirection.x = 0;
+ player.moveDirection.y = 0;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {