/****
* 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