/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Block = Container.expand(function (blockType) { var self = Container.call(this); var blockAssets = ['blockRed', 'blockBlue', 'blockGreen', 'blockYellow', 'blockPurple']; var assetId = blockAssets[blockType || 0]; var blockGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.blockType = blockType || 0; self.isPlaced = false; self.isStable = false; self.velocityY = 0; self.velocityX = 0; self.gravity = 0.5; self.friction = 0.98; self.lastY = 0; self.stableTimer = 0; self.requiredStableTime = 30; // 0.5 seconds at 60fps self.update = function () { if (self.isPlaced && !self.isStable) { // Apply gravity self.velocityY += self.gravity; // Apply velocity self.x += self.velocityX; self.y += self.velocityY; // Ground collision if (self.y > 2732 - 30) { self.y = 2732 - 30; self.velocityY = 0; self.velocityX *= self.friction; } // Check collision with other blocks self.checkBlockCollisions(); // Check if block is stable if (Math.abs(self.velocityY) < 0.1 && Math.abs(self.velocityX) < 0.1) { self.stableTimer++; if (self.stableTimer >= self.requiredStableTime) { self.isStable = true; self.flashStable(); } } else { self.stableTimer = 0; } // Check if block fell off screen if (self.y > 2800) { self.triggerCollapse(); } } self.lastY = self.y; }; self.checkBlockCollisions = function () { for (var i = 0; i < placedBlocks.length; i++) { var otherBlock = placedBlocks[i]; if (otherBlock !== self && self.intersects(otherBlock)) { // Simple collision response if (self.y < otherBlock.y) { self.y = otherBlock.y - 60; self.velocityY = 0; self.velocityX *= self.friction; } } } }; self.flashStable = function () { var originalTint = blockGraphics.tint; tween(blockGraphics, { tint: 0xffffff }, { duration: 200 }); tween(blockGraphics, { tint: originalTint }, { duration: 200 }); LK.getSound('place').play(); // Award points LK.setScore(LK.getScore() + 10); scoreTxt.setText(LK.getScore()); }; self.triggerCollapse = function () { gameOver = true; LK.getSound('collapse').play(); LK.effects.flashScreen(0xff0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var placedBlocks = []; var draggedBlock = null; var spawnTimer = 0; var spawnInterval = 180; // 3 seconds at 60fps var gameOver = false; // Create spawn area var spawnAreaGraphics = game.attachAsset('spawnArea', { anchorX: 0, anchorY: 0, x: 0, y: 2532 }); spawnAreaGraphics.alpha = 0.3; // Score display var scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Instructions var instructionTxt = new Text2('Drag blocks to build stable structures!', { size: 50, fill: 0xFFFFFF }); instructionTxt.anchor.set(0.5, 0); instructionTxt.y = 100; LK.gui.top.addChild(instructionTxt); function spawnNewBlock() { if (gameOver) return; var blockType = Math.floor(Math.random() * 5); var newBlock = new Block(blockType); // Random position in spawn area newBlock.x = 200 + Math.random() * (2048 - 400); newBlock.y = 2632; game.addChild(newBlock); // Remove old blocks from spawn area if too many var spawnBlocks = []; for (var i = 0; i < game.children.length; i++) { var child = game.children[i]; if (child instanceof Block && !child.isPlaced && child.y > 2500) { spawnBlocks.push(child); } } if (spawnBlocks.length > 5) { var oldestBlock = spawnBlocks[0]; oldestBlock.destroy(); } } function handleMove(x, y, obj) { if (draggedBlock && !gameOver) { draggedBlock.x = x; draggedBlock.y = y; } } game.move = handleMove; game.down = function (x, y, obj) { if (gameOver) return; // Check if touching a block in spawn area for (var i = game.children.length - 1; i >= 0; i--) { var child = game.children[i]; if (child instanceof Block && !child.isPlaced) { var localPos = child.toLocal({ x: x, y: y }); if (Math.abs(localPos.x) < 60 && Math.abs(localPos.y) < 30) { draggedBlock = child; break; } } } }; game.up = function (x, y, obj) { if (draggedBlock && !gameOver) { // Place the block draggedBlock.isPlaced = true; placedBlocks.push(draggedBlock); // Give initial downward velocity draggedBlock.velocityY = 2; draggedBlock = null; } }; // Spawn first block spawnNewBlock(); game.update = function () { if (gameOver) return; // Spawn new blocks spawnTimer++; if (spawnTimer >= spawnInterval) { spawnNewBlock(); spawnTimer = 0; // Gradually increase spawn rate if (spawnInterval > 60) { spawnInterval -= 2; } } // Check for unstable structures for (var i = placedBlocks.length - 1; i >= 0; i--) { var block = placedBlocks[i]; if (block.y > 2800) { // Remove from array placedBlocks.splice(i, 1); } } // Update score display scoreTxt.setText('Score: ' + LK.getScore()); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,217 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Block = Container.expand(function (blockType) {
+ var self = Container.call(this);
+ var blockAssets = ['blockRed', 'blockBlue', 'blockGreen', 'blockYellow', 'blockPurple'];
+ var assetId = blockAssets[blockType || 0];
+ var blockGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.blockType = blockType || 0;
+ self.isPlaced = false;
+ self.isStable = false;
+ self.velocityY = 0;
+ self.velocityX = 0;
+ self.gravity = 0.5;
+ self.friction = 0.98;
+ self.lastY = 0;
+ self.stableTimer = 0;
+ self.requiredStableTime = 30; // 0.5 seconds at 60fps
+ self.update = function () {
+ if (self.isPlaced && !self.isStable) {
+ // Apply gravity
+ self.velocityY += self.gravity;
+ // Apply velocity
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Ground collision
+ if (self.y > 2732 - 30) {
+ self.y = 2732 - 30;
+ self.velocityY = 0;
+ self.velocityX *= self.friction;
+ }
+ // Check collision with other blocks
+ self.checkBlockCollisions();
+ // Check if block is stable
+ if (Math.abs(self.velocityY) < 0.1 && Math.abs(self.velocityX) < 0.1) {
+ self.stableTimer++;
+ if (self.stableTimer >= self.requiredStableTime) {
+ self.isStable = true;
+ self.flashStable();
+ }
+ } else {
+ self.stableTimer = 0;
+ }
+ // Check if block fell off screen
+ if (self.y > 2800) {
+ self.triggerCollapse();
+ }
+ }
+ self.lastY = self.y;
+ };
+ self.checkBlockCollisions = function () {
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var otherBlock = placedBlocks[i];
+ if (otherBlock !== self && self.intersects(otherBlock)) {
+ // Simple collision response
+ if (self.y < otherBlock.y) {
+ self.y = otherBlock.y - 60;
+ self.velocityY = 0;
+ self.velocityX *= self.friction;
+ }
+ }
+ }
+ };
+ self.flashStable = function () {
+ var originalTint = blockGraphics.tint;
+ tween(blockGraphics, {
+ tint: 0xffffff
+ }, {
+ duration: 200
+ });
+ tween(blockGraphics, {
+ tint: originalTint
+ }, {
+ duration: 200
+ });
+ LK.getSound('place').play();
+ // Award points
+ LK.setScore(LK.getScore() + 10);
+ scoreTxt.setText(LK.getScore());
+ };
+ self.triggerCollapse = function () {
+ gameOver = true;
+ LK.getSound('collapse').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87ceeb
+});
+
+/****
+* Game Code
+****/
+var placedBlocks = [];
+var draggedBlock = null;
+var spawnTimer = 0;
+var spawnInterval = 180; // 3 seconds at 60fps
+var gameOver = false;
+// Create spawn area
+var spawnAreaGraphics = game.attachAsset('spawnArea', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 2532
+});
+spawnAreaGraphics.alpha = 0.3;
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Instructions
+var instructionTxt = new Text2('Drag blocks to build stable structures!', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+instructionTxt.anchor.set(0.5, 0);
+instructionTxt.y = 100;
+LK.gui.top.addChild(instructionTxt);
+function spawnNewBlock() {
+ if (gameOver) return;
+ var blockType = Math.floor(Math.random() * 5);
+ var newBlock = new Block(blockType);
+ // Random position in spawn area
+ newBlock.x = 200 + Math.random() * (2048 - 400);
+ newBlock.y = 2632;
+ game.addChild(newBlock);
+ // Remove old blocks from spawn area if too many
+ var spawnBlocks = [];
+ for (var i = 0; i < game.children.length; i++) {
+ var child = game.children[i];
+ if (child instanceof Block && !child.isPlaced && child.y > 2500) {
+ spawnBlocks.push(child);
+ }
+ }
+ if (spawnBlocks.length > 5) {
+ var oldestBlock = spawnBlocks[0];
+ oldestBlock.destroy();
+ }
+}
+function handleMove(x, y, obj) {
+ if (draggedBlock && !gameOver) {
+ draggedBlock.x = x;
+ draggedBlock.y = y;
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ if (gameOver) return;
+ // Check if touching a block in spawn area
+ for (var i = game.children.length - 1; i >= 0; i--) {
+ var child = game.children[i];
+ if (child instanceof Block && !child.isPlaced) {
+ var localPos = child.toLocal({
+ x: x,
+ y: y
+ });
+ if (Math.abs(localPos.x) < 60 && Math.abs(localPos.y) < 30) {
+ draggedBlock = child;
+ break;
+ }
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ if (draggedBlock && !gameOver) {
+ // Place the block
+ draggedBlock.isPlaced = true;
+ placedBlocks.push(draggedBlock);
+ // Give initial downward velocity
+ draggedBlock.velocityY = 2;
+ draggedBlock = null;
+ }
+};
+// Spawn first block
+spawnNewBlock();
+game.update = function () {
+ if (gameOver) return;
+ // Spawn new blocks
+ spawnTimer++;
+ if (spawnTimer >= spawnInterval) {
+ spawnNewBlock();
+ spawnTimer = 0;
+ // Gradually increase spawn rate
+ if (spawnInterval > 60) {
+ spawnInterval -= 2;
+ }
+ }
+ // Check for unstable structures
+ for (var i = placedBlocks.length - 1; i >= 0; i--) {
+ var block = placedBlocks[i];
+ if (block.y > 2800) {
+ // Remove from array
+ placedBlocks.splice(i, 1);
+ }
+ }
+ // Update score display
+ scoreTxt.setText('Score: ' + LK.getScore());
+};
\ No newline at end of file