/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Snowball = Container.expand(function () { var self = Container.call(this); var snowballGraphics = self.attachAsset('snowball', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.friction = 0.95; self.isMoving = false; self.update = function () { // Apply velocity self.x += self.velocityX; self.y += self.velocityY; // Apply friction self.velocityX *= self.friction; self.velocityY *= self.friction; // Stop if moving very slowly if (Math.abs(self.velocityX) < 0.1 && Math.abs(self.velocityY) < 0.1) { self.velocityX = 0; self.velocityY = 0; self.isMoving = false; } else { self.isMoving = true; } // Rotate based on movement if (self.isMoving) { snowballGraphics.rotation += 0.1; } // Keep within bounds if (self.x < 100) self.x = 100; if (self.x > 1948) self.x = 1948; if (self.y < 100) self.y = 100; }; self.addForce = function (forceX, forceY) { self.velocityX += forceX; self.velocityY += forceY; }; return self; }); var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1.0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf0f8ff }); /**** * Game Code ****/ // Game variables var snowball; var trees = []; var fence; var gameWon = false; var lastTapTime = 0; // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Create snowball snowball = game.addChild(new Snowball()); snowball.x = 200; snowball.y = 2400; // Create trees in strategic positions var treePositions = [{ x: 400, y: 2100 }, { x: 800, y: 1900 }, { x: 1200, y: 2000 }, { x: 600, y: 1700 }, { x: 1000, y: 1500 }, { x: 1400, y: 1600 }, { x: 500, y: 1300 }, { x: 900, y: 1100 }, { x: 1300, y: 1200 }]; for (var i = 0; i < treePositions.length; i++) { var tree = game.addChild(new Tree()); tree.x = treePositions[i].x; tree.y = treePositions[i].y; trees.push(tree); } // Create fence at the end fence = game.addChild(LK.getAsset('fence', { anchorX: 0.5, anchorY: 1.0, x: 1024, y: 800 })); // Score display var instructionText = new Text2('Tap to roll the snowball to the fence!', { size: 60, fill: 0x2D5016 }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 150; // Game controls game.down = function (x, y, obj) { if (gameWon) return; var currentTime = Date.now(); if (currentTime - lastTapTime < 200) return; // Prevent rapid tapping lastTapTime = currentTime; // Convert tap position to direction var tapX = x; var tapY = y; // Calculate direction from snowball to tap var dirX = tapX - snowball.x; var dirY = tapY - snowball.y; // Normalize direction var distance = Math.sqrt(dirX * dirX + dirY * dirY); if (distance > 0) { dirX /= distance; dirY /= distance; } // Apply force in that direction snowball.addForce(dirX * 8, dirY * 8); // Play roll sound LK.getSound('roll').play(); }; // Game update loop game.update = function () { if (gameWon) return; // Check collision with trees for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (snowball.intersects(tree)) { // Stop the snowball snowball.velocityX *= -0.3; snowball.velocityY *= -0.3; // Push snowball away from tree var pushX = snowball.x - tree.x; var pushY = snowball.y - tree.y; var pushDistance = Math.sqrt(pushX * pushX + pushY * pushY); if (pushDistance > 0) { pushX /= pushDistance; pushY /= pushDistance; snowball.x = tree.x + pushX * 150; snowball.y = tree.y + pushY * 150; } LK.getSound('hit').play(); LK.effects.flashObject(tree, 0xff0000, 300); } } // Check if reached fence if (snowball.y <= 900 && !gameWon) { gameWon = true; LK.getSound('win').play(); LK.effects.flashScreen(0x00ff00, 1000); // Update instruction text instructionText.setText('Success! Snowball reached the fence!'); // Add score and show win LK.setScore(100); LK.setTimeout(function () { LK.showYouWin(); }, 1500); } // Game over if snowball gets stuck at bottom for too long if (snowball.y > 2500 && !snowball.isMoving) { var stuckTimer = snowball.stuckTimer || 0; snowball.stuckTimer = stuckTimer + 1; if (snowball.stuckTimer > 180) { // 3 seconds at 60fps LK.effects.flashScreen(0xff0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); } } else { snowball.stuckTimer = 0; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Snowball = Container.expand(function () {
var self = Container.call(this);
var snowballGraphics = self.attachAsset('snowball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.isMoving = false;
self.update = function () {
// Apply velocity
self.x += self.velocityX;
self.y += self.velocityY;
// Apply friction
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Stop if moving very slowly
if (Math.abs(self.velocityX) < 0.1 && Math.abs(self.velocityY) < 0.1) {
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
} else {
self.isMoving = true;
}
// Rotate based on movement
if (self.isMoving) {
snowballGraphics.rotation += 0.1;
}
// Keep within bounds
if (self.x < 100) self.x = 100;
if (self.x > 1948) self.x = 1948;
if (self.y < 100) self.y = 100;
};
self.addForce = function (forceX, forceY) {
self.velocityX += forceX;
self.velocityY += forceY;
};
return self;
});
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 1.0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf0f8ff
});
/****
* Game Code
****/
// Game variables
var snowball;
var trees = [];
var fence;
var gameWon = false;
var lastTapTime = 0;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Create snowball
snowball = game.addChild(new Snowball());
snowball.x = 200;
snowball.y = 2400;
// Create trees in strategic positions
var treePositions = [{
x: 400,
y: 2100
}, {
x: 800,
y: 1900
}, {
x: 1200,
y: 2000
}, {
x: 600,
y: 1700
}, {
x: 1000,
y: 1500
}, {
x: 1400,
y: 1600
}, {
x: 500,
y: 1300
}, {
x: 900,
y: 1100
}, {
x: 1300,
y: 1200
}];
for (var i = 0; i < treePositions.length; i++) {
var tree = game.addChild(new Tree());
tree.x = treePositions[i].x;
tree.y = treePositions[i].y;
trees.push(tree);
}
// Create fence at the end
fence = game.addChild(LK.getAsset('fence', {
anchorX: 0.5,
anchorY: 1.0,
x: 1024,
y: 800
}));
// Score display
var instructionText = new Text2('Tap to roll the snowball to the fence!', {
size: 60,
fill: 0x2D5016
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 150;
// Game controls
game.down = function (x, y, obj) {
if (gameWon) return;
var currentTime = Date.now();
if (currentTime - lastTapTime < 200) return; // Prevent rapid tapping
lastTapTime = currentTime;
// Convert tap position to direction
var tapX = x;
var tapY = y;
// Calculate direction from snowball to tap
var dirX = tapX - snowball.x;
var dirY = tapY - snowball.y;
// Normalize direction
var distance = Math.sqrt(dirX * dirX + dirY * dirY);
if (distance > 0) {
dirX /= distance;
dirY /= distance;
}
// Apply force in that direction
snowball.addForce(dirX * 8, dirY * 8);
// Play roll sound
LK.getSound('roll').play();
};
// Game update loop
game.update = function () {
if (gameWon) return;
// Check collision with trees
for (var i = 0; i < trees.length; i++) {
var tree = trees[i];
if (snowball.intersects(tree)) {
// Stop the snowball
snowball.velocityX *= -0.3;
snowball.velocityY *= -0.3;
// Push snowball away from tree
var pushX = snowball.x - tree.x;
var pushY = snowball.y - tree.y;
var pushDistance = Math.sqrt(pushX * pushX + pushY * pushY);
if (pushDistance > 0) {
pushX /= pushDistance;
pushY /= pushDistance;
snowball.x = tree.x + pushX * 150;
snowball.y = tree.y + pushY * 150;
}
LK.getSound('hit').play();
LK.effects.flashObject(tree, 0xff0000, 300);
}
}
// Check if reached fence
if (snowball.y <= 900 && !gameWon) {
gameWon = true;
LK.getSound('win').play();
LK.effects.flashScreen(0x00ff00, 1000);
// Update instruction text
instructionText.setText('Success! Snowball reached the fence!');
// Add score and show win
LK.setScore(100);
LK.setTimeout(function () {
LK.showYouWin();
}, 1500);
}
// Game over if snowball gets stuck at bottom for too long
if (snowball.y > 2500 && !snowball.isMoving) {
var stuckTimer = snowball.stuckTimer || 0;
snowball.stuckTimer = stuckTimer + 1;
if (snowball.stuckTimer > 180) {
// 3 seconds at 60fps
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
} else {
snowball.stuckTimer = 0;
}
};