User prompt
add gravity for sand and water
User prompt
add gravity
User prompt
add herobrine
User prompt
move inventory to left
User prompt
add inventory to bottom
User prompt
add more block options
User prompt
Please fix the bug: 'InventoryButton is not defined' in or related to this line: 'var btn = new InventoryButton();' Line Number: 116
User prompt
make steve
Code edit (1 edits merged)
Please save this source code
User prompt
MiniCraft: Block Builder
Initial prompt
minecraft
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Block class var Block = Container.expand(function () { var self = Container.call(this); // Properties: type ('grass', 'dirt', 'stone'), gridX, gridY self.type = 'grass'; self.gridX = 0; self.gridY = 0; self.asset = null; self.setType = function (type) { self.type = type; if (self.asset) { self.removeChild(self.asset); } var assetId = 'block_' + type; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; // For block selection highlight self.setSelected = function (selected) { if (selected) { if (!self.selector) { self.selector = self.attachAsset('selector', { anchorX: 0.5, anchorY: 0.5 }); self.selector.alpha = 0.3; self.setChildIndex(self.selector, self.children.length - 1); } } else { if (self.selector) { self.removeChild(self.selector); self.selector = null; } } }; // Remove block from world self.removeBlock = function () { self.destroy(); }; return self; }); // Sun/Moon class for day-night cycle var DayNightObject = Container.expand(function () { var self = Container.call(this); self.asset = null; self.setType = function (type) { if (self.asset) { self.removeChild(self.asset); } self.asset = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); }; return self; }); // Herobrine class var Herobrine = Container.expand(function () { var self = Container.call(this); // Use a unique color for Herobrine (white eyes, brown body) self.body = self.attachAsset('block_wood', { anchorX: 0.5, anchorY: 0.5 }); self.body.width = 120; self.body.height = 120; // Add white "eyes" as two small blocks self.eyeLeft = self.attachAsset('block_stone', { anchorX: 0.5, anchorY: 0.5 }); self.eyeLeft.width = 24; self.eyeLeft.height = 24; self.eyeLeft.x = -24; self.eyeLeft.y = -24; self.eyeLeft.tint = 0xffffff; self.eyeRight = self.attachAsset('block_stone', { anchorX: 0.5, anchorY: 0.5 }); self.eyeRight.width = 24; self.eyeRight.height = 24; self.eyeRight.x = 24; self.eyeRight.y = -24; self.eyeRight.tint = 0xffffff; return self; }); // InventoryButton class var InventoryButton = Container.expand(function () { var self = Container.call(this); self.type = 'grass'; self.asset = null; self.setType = function (type) { self.type = type; if (self.asset) { self.removeChild(self.asset); } var assetId = 'block_' + type; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.asset.width = 120; self.asset.height = 120; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb // Sky blue for day }); /**** * Game Code ****/ // --- World/grid setup --- // Block assets (3 types: grass, dirt, stone) // Selector highlight // Sun and moon for day-night cycle var GRID_COLS = 12; var GRID_ROWS = 16; var BLOCK_SIZE = 120; var GRID_OFFSET_X = Math.floor((2048 - GRID_COLS * BLOCK_SIZE) / 2); var GRID_OFFSET_Y = 350; var worldBlocks = []; // 2D array [row][col] of Block or null // --- Inventory setup --- var blockTypes = ['grass', 'dirt', 'stone', 'sand', 'wood', 'water']; var selectedBlockType = 'grass'; var inventoryButtons = []; var inventoryY = 80; // --- Selection --- var selectedBlock = null; var dragBlock = null; var dragStart = null; // --- Day-night cycle --- var isDay = true; var dayNightObj = new DayNightObject(); var dayNightTimer = 0; var DAY_DURATION = 1200; // ticks (20 seconds) var NIGHT_DURATION = 900; // ticks (15 seconds) var dayNightState = 'day'; // 'day' or 'night' // --- GUI: Inventory bar --- for (var i = 0; i < blockTypes.length; i++) { var btn = new InventoryButton(); btn.setType(blockTypes[i]); // Move inventory to the left side, vertically stacked, leaving top margin for menu btn.x = 100; // left margin, avoid top left 100x100 btn.y = 120 + i * 160; // start below top menu, vertical spacing btn.type = blockTypes[i]; // Highlight selected if (blockTypes[i] === selectedBlockType) { btn.asset.alpha = 1.0; } else { btn.asset.alpha = 0.5; } // Touch event (function (btn, i) { btn.down = function (x, y, obj) { selectedBlockType = btn.type; for (var j = 0; j < inventoryButtons.length; j++) { inventoryButtons[j].asset.alpha = inventoryButtons[j].type === selectedBlockType ? 1.0 : 0.5; } }; })(btn, i); LK.gui.top.addChild(btn); inventoryButtons.push(btn); } // --- World: Initialize grid with some blocks (ground layer) --- for (var row = 0; row < GRID_ROWS; row++) { worldBlocks[row] = []; for (var col = 0; col < GRID_COLS; col++) { if (row >= GRID_ROWS - 3) { // Bottom 3 rows: dirt, stone, stone var type = row === GRID_ROWS - 3 ? 'dirt' : 'stone'; var block = new Block(); block.setType(type); block.gridX = col; block.gridY = row; block.x = GRID_OFFSET_X + col * BLOCK_SIZE + BLOCK_SIZE / 2; block.y = GRID_OFFSET_Y + row * BLOCK_SIZE + BLOCK_SIZE / 2; worldBlocks[row][col] = block; game.addChild(block); } else if (row === GRID_ROWS - 4) { // Top of ground: grass var block = new Block(); block.setType('grass'); block.gridX = col; block.gridY = row; block.x = GRID_OFFSET_X + col * BLOCK_SIZE + BLOCK_SIZE / 2; block.y = GRID_OFFSET_Y + row * BLOCK_SIZE + BLOCK_SIZE / 2; worldBlocks[row][col] = block; game.addChild(block); } else { worldBlocks[row][col] = null; } } } // --- Day/Night object (sun/moon) --- dayNightObj.setType('sun'); dayNightObj.x = 2048 / 2; dayNightObj.y = 180; game.addChild(dayNightObj); // --- Herobrine: Add to world, standing on the ground --- var herobrine = new Herobrine(); herobrine.x = GRID_OFFSET_X + Math.floor(GRID_COLS / 2) * BLOCK_SIZE + BLOCK_SIZE / 2; herobrine.y = GRID_OFFSET_Y + (GRID_ROWS - 4) * BLOCK_SIZE + BLOCK_SIZE / 2 - 60; // Stand on grass game.addChild(herobrine); // --- Helper: Get grid cell from x,y --- function getGridCell(x, y) { var col = Math.floor((x - GRID_OFFSET_X) / BLOCK_SIZE); var row = Math.floor((y - GRID_OFFSET_Y) / BLOCK_SIZE); if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return null; return { col: col, row: row }; } // --- Helper: Place block --- function placeBlock(col, row, type) { if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return; if (worldBlocks[row][col]) return; // Occupied var block = new Block(); block.setType(type); block.gridX = col; block.gridY = row; block.x = GRID_OFFSET_X + col * BLOCK_SIZE + BLOCK_SIZE / 2; block.y = GRID_OFFSET_Y + row * BLOCK_SIZE + BLOCK_SIZE / 2; worldBlocks[row][col] = block; game.addChild(block); } // --- Helper: Remove block --- function removeBlock(col, row) { if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return; var block = worldBlocks[row][col]; if (block) { block.removeBlock(); worldBlocks[row][col] = null; } } // --- Helper: Move block --- function moveBlock(fromCol, fromRow, toCol, toRow) { if (fromCol < 0 || fromCol >= GRID_COLS || fromRow < 0 || fromRow >= GRID_ROWS) return; if (toCol < 0 || toCol >= GRID_COLS || toRow < 0 || toRow >= GRID_ROWS) return; if (worldBlocks[toRow][toCol]) return; // Target occupied var block = worldBlocks[fromRow][fromCol]; if (!block) return; worldBlocks[toRow][toCol] = block; worldBlocks[fromRow][fromCol] = null; block.gridX = toCol; block.gridY = toRow; var targetX = GRID_OFFSET_X + toCol * BLOCK_SIZE + BLOCK_SIZE / 2; var targetY = GRID_OFFSET_Y + toRow * BLOCK_SIZE + BLOCK_SIZE / 2; tween(block, { x: targetX, y: targetY }, { duration: 120, easing: tween.cubicOut }); } // --- Touch/drag logic --- game.down = function (x, y, obj) { // Ignore touches on inventory bar if (y < inventoryY + 160) return; var cell = getGridCell(x, y); if (!cell) return; var block = worldBlocks[cell.row][cell.col]; if (block) { // Select block for move or remove selectedBlock = block; dragBlock = block; dragStart = { col: cell.col, row: cell.row }; block.setSelected(true); } else { // Place block placeBlock(cell.col, cell.row, selectedBlockType); } }; game.move = function (x, y, obj) { if (!dragBlock) return; var cell = getGridCell(x, y); if (!cell) return; // Highlight block under finger for (var row = 0; row < GRID_ROWS; row++) { for (var col = 0; col < GRID_COLS; col++) { var b = worldBlocks[row][col]; if (b && b !== dragBlock) b.setSelected(false); } } var block = worldBlocks[cell.row][cell.col]; if (block && block === dragBlock) { block.setSelected(true); } }; game.up = function (x, y, obj) { if (!dragBlock) return; var cell = getGridCell(x, y); if (!cell) { dragBlock.setSelected(false); dragBlock = null; dragStart = null; return; } // If released on empty cell, move block if (!worldBlocks[cell.row][cell.col]) { moveBlock(dragStart.col, dragStart.row, cell.col, cell.row); } else if (cell.col === dragStart.col && cell.row === dragStart.row) { // If tap on same block, remove it removeBlock(cell.col, cell.row); } dragBlock.setSelected(false); dragBlock = null; dragStart = null; }; // --- Day/Night cycle logic --- function updateDayNightCycle() { dayNightTimer++; if (dayNightState === 'day' && dayNightTimer > DAY_DURATION) { // Switch to night dayNightState = 'night'; dayNightTimer = 0; // Animate sun out, moon in tween(dayNightObj, { y: 3200 }, { duration: 800, easing: tween.cubicIn, onFinish: function onFinish() { dayNightObj.setType('moon'); dayNightObj.y = -200; tween(dayNightObj, { y: 180 }, { duration: 800, easing: tween.cubicOut }); } }); // Darken background tween(game, { backgroundColor: 0x222244 }, { duration: 1200, easing: tween.linear }); } else if (dayNightState === 'night' && dayNightTimer > NIGHT_DURATION) { // Switch to day dayNightState = 'day'; dayNightTimer = 0; // Animate moon out, sun in tween(dayNightObj, { y: 3200 }, { duration: 800, easing: tween.cubicIn, onFinish: function onFinish() { dayNightObj.setType('sun'); dayNightObj.y = -200; tween(dayNightObj, { y: 180 }, { duration: 800, easing: tween.cubicOut }); } }); // Brighten background tween(game, { backgroundColor: 0x87ceeb }, { duration: 1200, easing: tween.linear }); } } // --- Game update loop --- game.update = function () { updateDayNightCycle(); // Gravity for sand and water blocks for (var row = GRID_ROWS - 2; row >= 0; row--) { for (var col = 0; col < GRID_COLS; col++) { var block = worldBlocks[row][col]; if (block && (block.type === 'sand' || block.type === 'water')) { var belowRow = row + 1; if (belowRow < GRID_ROWS && !worldBlocks[belowRow][col]) { moveBlock(col, row, col, belowRow); } } } } };
===================================================================
--- original.js
+++ change.js
@@ -125,12 +125,12 @@
/****
* Game Code
****/
-// Sun and moon for day-night cycle
-// Selector highlight
-// Block assets (3 types: grass, dirt, stone)
// --- World/grid setup ---
+// Block assets (3 types: grass, dirt, stone)
+// Selector highlight
+// Sun and moon for day-night cycle
var GRID_COLS = 12;
var GRID_ROWS = 16;
var BLOCK_SIZE = 120;
var GRID_OFFSET_X = Math.floor((2048 - GRID_COLS * BLOCK_SIZE) / 2);
@@ -391,16 +391,16 @@
}
// --- Game update loop ---
game.update = function () {
updateDayNightCycle();
- // Gravity: let unsupported blocks fall down
+ // Gravity for sand and water blocks
for (var row = GRID_ROWS - 2; row >= 0; row--) {
for (var col = 0; col < GRID_COLS; col++) {
var block = worldBlocks[row][col];
- if (block && !worldBlocks[row + 1][col]) {
- // Only move if not being dragged
- if (dragBlock !== block) {
- moveBlock(col, row, col, row + 1);
+ if (block && (block.type === 'sand' || block.type === 'water')) {
+ var belowRow = row + 1;
+ if (belowRow < GRID_ROWS && !worldBlocks[belowRow][col]) {
+ moveBlock(col, row, col, belowRow);
}
}
}
}
Modern App Store icon, high definition, square with rounded corners, for a game titled "MiniCraft: Block Builder" and with the description "A 2D sandbox game where you build, remove, and move blocks to create your own world, inspired by Minecraft.". No text on icon!
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "MiniCraft: Block Builder" and with the description "A 2D sandbox game where you build, remove, and move blocks to create your own world, inspired by Minecraft.". No text on banner!
sand. In-Game asset. 2d. High contrast. No shadows