/****
* 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
if (Math.random() < 0.02) {
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));
// Gradually slow down movement
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
function handleMove(x, y, obj) {
if (dragNode) {
var dx = x - dragNode.x;
var dy = y - dragNode.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var maxMoveForce = 0.8;
var moveForce = Math.min(distance / 100, maxMoveForce);
dragNode.moveDirection.x = dx / distance * moveForce;
dragNode.moveDirection.y = dy / distance * moveForce;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
// Check snow collection
for (var i = snowParticles.length - 1; i >= 0; i--) {
var snow = snowParticles[i];
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();
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
@@ -23,9 +23,9 @@
});
var Snowball = Container.expand(function () {
var self = Container.call(this);
self.size = 1;
- self.maxSpeed = 3;
+ self.maxSpeed = 100;
self.isPlayer = false;
self.moveDirection = {
x: 0,
y: 0
@@ -90,9 +90,9 @@
self.size = newSize;
var scale = Math.sqrt(newSize);
playerGraphics.scaleX = scale;
playerGraphics.scaleY = scale;
- self.maxSpeed = Math.max(1.5, 4 - scale * 0.5);
+ self.maxSpeed = Math.max(3, 8 - scale * 0.3);
};
return self;
});