/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { savedDrawings: [], currentDrawing: undefined }); /**** * Classes ****/ var ActionButton = Container.expand(function () { var self = Container.call(this); var buttonBg = self.attachAsset('button', { anchorX: 0, anchorY: 0 }); var buttonLabel = new Text2('', { size: 36, fill: 0xFFFFFF }); buttonLabel.anchor.set(0.5, 0.5); buttonLabel.position.set(100, 40); self.addChild(buttonLabel); self.action = ''; self.setAction = function (actionName, label) { self.action = actionName; buttonLabel.setText(label); }; self.down = function (x, y, obj) { pixelEditor.performAction(self.action); LK.getSound('click').play(); }; return self; }); var ColorButton = Container.expand(function () { var self = Container.call(this); var colorSquare = self.attachAsset('colorSquare', { anchorX: 0, anchorY: 0 }); self.colorValue = 0xFFFFFF; self.setColor = function (color) { self.colorValue = color; colorSquare.tint = color; }; self.down = function (x, y, obj) { pixelEditor.selectColor(self.colorValue); LK.getSound('click').play(); }; return self; }); var GridCell = Container.expand(function () { var self = Container.call(this); var cellGraphics = self.attachAsset('gridCell', { anchorX: 0, anchorY: 0, alpha: 1 }); self.color = 0xFFFFFF; self.isEmpty = true; self.setColor = function (newColor) { self.color = newColor; cellGraphics.tint = newColor; self.isEmpty = newColor === 0xFFFFFF; }; self.clear = function () { self.setColor(0xFFFFFF); }; self.down = function (x, y, obj) { pixelEditor.setPixel(self); }; self.move = function (x, y, obj) { if (pixelEditor.isDrawing) { pixelEditor.setPixel(self); } }; return self; }); var PixelEditor = Container.expand(function () { var self = Container.call(this); self.gridSize = 16; // 16x16 grid self.cellSize = 32; self.selectedColor = 0x000000; // Default black self.currentTool = 'draw'; // Default tool self.isDrawing = false; self.grid = []; self.history = []; self.historyIndex = -1; self.maxHistory = 30; self.initialize = function () { self.createGrid(); self.createColorPalette(); self.createTools(); self.createActionButtons(); // Load drawing if it exists if (storage.currentDrawing) { self.loadDrawing(storage.currentDrawing); } }; self.createGrid = function () { var gridContainer = new Container(); self.addChild(gridContainer); // Center the grid var gridWidth = self.gridSize * self.cellSize; var gridX = (2048 - gridWidth) / 2; var gridY = 300; // Position below UI elements gridContainer.position.set(gridX, gridY); for (var y = 0; y < self.gridSize; y++) { self.grid[y] = []; for (var x = 0; x < self.gridSize; x++) { var cell = new GridCell(); cell.position.set(x * self.cellSize, y * self.cellSize); cell.gridX = x; cell.gridY = y; self.grid[y][x] = cell; gridContainer.addChild(cell); } } }; self.createColorPalette = function () { var colors = [0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0x808080, 0xC0C0C0]; var paletteContainer = new Container(); self.addChild(paletteContainer); // Position palette on the top paletteContainer.position.set(224, 100); for (var i = 0; i < colors.length; i++) { var colorBtn = new ColorButton(); colorBtn.setColor(colors[i]); colorBtn.position.set(i % 8 * 120, Math.floor(i / 8) * 120); paletteContainer.addChild(colorBtn); } }; self.createTools = function () { var tools = ['draw', 'fill', 'erase']; var toolsContainer = new Container(); self.addChild(toolsContainer); // Position tools to the left of the canvas toolsContainer.position.set(100, 400); for (var i = 0; i < tools.length; i++) { var toolBtn = new ToolButton(); toolBtn.setTool(tools[i]); toolBtn.position.set(0, i * 120); if (tools[i] === self.currentTool) { toolBtn.setSelected(true); } toolsContainer.addChild(toolBtn); } }; self.createActionButtons = function () { var actions = [{ name: 'clear', label: 'Clear' }, { name: 'undo', label: 'Undo' }, { name: 'redo', label: 'Redo' }, { name: 'save', label: 'Save' }, { name: 'load', label: 'Load' }]; var actionsContainer = new Container(); self.addChild(actionsContainer); // Position actions to the right of the canvas actionsContainer.position.set(1648, 400); for (var i = 0; i < actions.length; i++) { var actionBtn = new ActionButton(); actionBtn.setAction(actions[i].name, actions[i].label); actionBtn.position.set(0, i * 100); actionsContainer.addChild(actionBtn); } }; self.selectColor = function (color) { self.selectedColor = color; }; self.selectTool = function (toolName) { self.currentTool = toolName; // Update tool buttons visually var toolsContainer = self.children[2]; // Assuming tools are the 3rd child for (var i = 0; i < toolsContainer.children.length; i++) { var toolBtn = toolsContainer.children[i]; toolBtn.setSelected(toolBtn.toolName === toolName); } }; self.setPixel = function (cell) { if (self.currentTool === 'draw') { if (cell.color !== self.selectedColor) { self.saveState(); cell.setColor(self.selectedColor); LK.getSound('draw').play(); } } else if (self.currentTool === 'erase') { if (!cell.isEmpty) { self.saveState(); cell.clear(); LK.getSound('draw').play(); } } else if (self.currentTool === 'fill') { self.saveState(); self.floodFill(cell.gridX, cell.gridY, cell.color); LK.getSound('fill').play(); } }; self.floodFill = function (x, y, targetColor) { if (x < 0 || x >= self.gridSize || y < 0 || y >= self.gridSize) { return; } if (self.grid[y][x].color !== targetColor) { return; } if (self.grid[y][x].color === self.selectedColor) { return; } self.grid[y][x].setColor(self.selectedColor); self.floodFill(x + 1, y, targetColor); self.floodFill(x - 1, y, targetColor); self.floodFill(x, y + 1, targetColor); self.floodFill(x, y - 1, targetColor); }; self.saveState = function () { // If we've gone back in history and now make a new change, // discard any future states beyond the current index if (self.historyIndex < self.history.length - 1) { self.history = self.history.slice(0, self.historyIndex + 1); } // Save current state var state = []; for (var y = 0; y < self.gridSize; y++) { state[y] = []; for (var x = 0; x < self.gridSize; x++) { state[y][x] = self.grid[y][x].color; } } // Add to history and limit history size self.history.push(state); self.historyIndex++; if (self.history.length > self.maxHistory) { self.history.shift(); self.historyIndex--; } }; self.loadState = function (state) { for (var y = 0; y < self.gridSize; y++) { for (var x = 0; x < self.gridSize; x++) { if (y < state.length && x < state[y].length) { self.grid[y][x].setColor(state[y][x]); } else { self.grid[y][x].clear(); } } } }; self.performAction = function (action) { switch (action) { case 'clear': self.saveState(); self.clearCanvas(); break; case 'undo': self.undo(); break; case 'redo': self.redo(); break; case 'save': self.saveDrawing(); break; case 'load': // This would typically show a UI for selecting a saved drawing // For simplicity, we'll just load the first saved drawing if available if (storage.savedDrawings.length > 0) { self.loadDrawing(storage.savedDrawings[0]); } break; } }; self.clearCanvas = function () { for (var y = 0; y < self.gridSize; y++) { for (var x = 0; x < self.gridSize; x++) { self.grid[y][x].clear(); } } }; self.undo = function () { if (self.historyIndex > 0) { self.historyIndex--; self.loadState(self.history[self.historyIndex]); } }; self.redo = function () { if (self.historyIndex < self.history.length - 1) { self.historyIndex++; self.loadState(self.history[self.historyIndex]); } }; self.saveDrawing = function () { var drawing = []; for (var y = 0; y < self.gridSize; y++) { drawing[y] = []; for (var x = 0; x < self.gridSize; x++) { drawing[y][x] = self.grid[y][x].color; } } // Save to storage storage.currentDrawing = drawing; storage.savedDrawings.push(drawing); // Limit saved drawings to prevent excessive storage if (storage.savedDrawings.length > 10) { storage.savedDrawings.shift(); } LK.getSound('save').play(); }; self.loadDrawing = function (drawing) { if (drawing) { self.clearCanvas(); self.loadState(drawing); // Reset history when loading self.history = [drawing]; self.historyIndex = 0; } }; self.down = function (x, y, obj) { self.isDrawing = true; }; self.up = function (x, y, obj) { self.isDrawing = false; }; return self; }); var ToolButton = Container.expand(function () { var self = Container.call(this); var toolIcon = self.attachAsset('toolIcon', { anchorX: 0, anchorY: 0 }); self.toolName = ''; self.isSelected = false; var toolLabel = new Text2('', { size: 24, fill: 0x000000 }); toolLabel.anchor.set(0.5, 0.5); toolLabel.position.set(50, 50); self.addChild(toolLabel); self.setTool = function (name) { self.toolName = name; toolLabel.setText(name); }; self.setSelected = function (selected) { self.isSelected = selected; toolIcon.tint = selected ? 0x88BBFF : 0xCCCCCC; }; self.down = function (x, y, obj) { pixelEditor.selectTool(self.toolName); LK.getSound('click').play(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xF0F0F0 }); /**** * Game Code ****/ // Create title text var titleText = new Text2('Pixel Crafter', { size: 80, fill: 0x333333 }); titleText.anchor.set(0.5, 0); titleText.position.set(2048 / 2, 20); game.addChild(titleText); // Create pixel editor var pixelEditor = new PixelEditor(); game.addChild(pixelEditor); pixelEditor.initialize(); // Handle game events game.down = function (x, y, obj) { // Start drawing if no specific object was clicked if (!obj || obj === game) { pixelEditor.isDrawing = true; } }; game.up = function (x, y, obj) { pixelEditor.isDrawing = false; }; game.move = function (x, y, obj) { // This is handled by the GridCell move event }; // Play background music LK.playMusic('bgmusic', { fade: { start: 0, end: 0.3, duration: 1000 } });
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,408 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ savedDrawings: [],
+ currentDrawing: undefined
+});
+
+/****
+* Classes
+****/
+var ActionButton = Container.expand(function () {
+ var self = Container.call(this);
+ var buttonBg = self.attachAsset('button', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ var buttonLabel = new Text2('', {
+ size: 36,
+ fill: 0xFFFFFF
+ });
+ buttonLabel.anchor.set(0.5, 0.5);
+ buttonLabel.position.set(100, 40);
+ self.addChild(buttonLabel);
+ self.action = '';
+ self.setAction = function (actionName, label) {
+ self.action = actionName;
+ buttonLabel.setText(label);
+ };
+ self.down = function (x, y, obj) {
+ pixelEditor.performAction(self.action);
+ LK.getSound('click').play();
+ };
+ return self;
+});
+var ColorButton = Container.expand(function () {
+ var self = Container.call(this);
+ var colorSquare = self.attachAsset('colorSquare', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.colorValue = 0xFFFFFF;
+ self.setColor = function (color) {
+ self.colorValue = color;
+ colorSquare.tint = color;
+ };
+ self.down = function (x, y, obj) {
+ pixelEditor.selectColor(self.colorValue);
+ LK.getSound('click').play();
+ };
+ return self;
+});
+var GridCell = Container.expand(function () {
+ var self = Container.call(this);
+ var cellGraphics = self.attachAsset('gridCell', {
+ anchorX: 0,
+ anchorY: 0,
+ alpha: 1
+ });
+ self.color = 0xFFFFFF;
+ self.isEmpty = true;
+ self.setColor = function (newColor) {
+ self.color = newColor;
+ cellGraphics.tint = newColor;
+ self.isEmpty = newColor === 0xFFFFFF;
+ };
+ self.clear = function () {
+ self.setColor(0xFFFFFF);
+ };
+ self.down = function (x, y, obj) {
+ pixelEditor.setPixel(self);
+ };
+ self.move = function (x, y, obj) {
+ if (pixelEditor.isDrawing) {
+ pixelEditor.setPixel(self);
+ }
+ };
+ return self;
+});
+var PixelEditor = Container.expand(function () {
+ var self = Container.call(this);
+ self.gridSize = 16; // 16x16 grid
+ self.cellSize = 32;
+ self.selectedColor = 0x000000; // Default black
+ self.currentTool = 'draw'; // Default tool
+ self.isDrawing = false;
+ self.grid = [];
+ self.history = [];
+ self.historyIndex = -1;
+ self.maxHistory = 30;
+ self.initialize = function () {
+ self.createGrid();
+ self.createColorPalette();
+ self.createTools();
+ self.createActionButtons();
+ // Load drawing if it exists
+ if (storage.currentDrawing) {
+ self.loadDrawing(storage.currentDrawing);
+ }
+ };
+ self.createGrid = function () {
+ var gridContainer = new Container();
+ self.addChild(gridContainer);
+ // Center the grid
+ var gridWidth = self.gridSize * self.cellSize;
+ var gridX = (2048 - gridWidth) / 2;
+ var gridY = 300; // Position below UI elements
+ gridContainer.position.set(gridX, gridY);
+ for (var y = 0; y < self.gridSize; y++) {
+ self.grid[y] = [];
+ for (var x = 0; x < self.gridSize; x++) {
+ var cell = new GridCell();
+ cell.position.set(x * self.cellSize, y * self.cellSize);
+ cell.gridX = x;
+ cell.gridY = y;
+ self.grid[y][x] = cell;
+ gridContainer.addChild(cell);
+ }
+ }
+ };
+ self.createColorPalette = function () {
+ var colors = [0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0x808080, 0xC0C0C0];
+ var paletteContainer = new Container();
+ self.addChild(paletteContainer);
+ // Position palette on the top
+ paletteContainer.position.set(224, 100);
+ for (var i = 0; i < colors.length; i++) {
+ var colorBtn = new ColorButton();
+ colorBtn.setColor(colors[i]);
+ colorBtn.position.set(i % 8 * 120, Math.floor(i / 8) * 120);
+ paletteContainer.addChild(colorBtn);
+ }
+ };
+ self.createTools = function () {
+ var tools = ['draw', 'fill', 'erase'];
+ var toolsContainer = new Container();
+ self.addChild(toolsContainer);
+ // Position tools to the left of the canvas
+ toolsContainer.position.set(100, 400);
+ for (var i = 0; i < tools.length; i++) {
+ var toolBtn = new ToolButton();
+ toolBtn.setTool(tools[i]);
+ toolBtn.position.set(0, i * 120);
+ if (tools[i] === self.currentTool) {
+ toolBtn.setSelected(true);
+ }
+ toolsContainer.addChild(toolBtn);
+ }
+ };
+ self.createActionButtons = function () {
+ var actions = [{
+ name: 'clear',
+ label: 'Clear'
+ }, {
+ name: 'undo',
+ label: 'Undo'
+ }, {
+ name: 'redo',
+ label: 'Redo'
+ }, {
+ name: 'save',
+ label: 'Save'
+ }, {
+ name: 'load',
+ label: 'Load'
+ }];
+ var actionsContainer = new Container();
+ self.addChild(actionsContainer);
+ // Position actions to the right of the canvas
+ actionsContainer.position.set(1648, 400);
+ for (var i = 0; i < actions.length; i++) {
+ var actionBtn = new ActionButton();
+ actionBtn.setAction(actions[i].name, actions[i].label);
+ actionBtn.position.set(0, i * 100);
+ actionsContainer.addChild(actionBtn);
+ }
+ };
+ self.selectColor = function (color) {
+ self.selectedColor = color;
+ };
+ self.selectTool = function (toolName) {
+ self.currentTool = toolName;
+ // Update tool buttons visually
+ var toolsContainer = self.children[2]; // Assuming tools are the 3rd child
+ for (var i = 0; i < toolsContainer.children.length; i++) {
+ var toolBtn = toolsContainer.children[i];
+ toolBtn.setSelected(toolBtn.toolName === toolName);
+ }
+ };
+ self.setPixel = function (cell) {
+ if (self.currentTool === 'draw') {
+ if (cell.color !== self.selectedColor) {
+ self.saveState();
+ cell.setColor(self.selectedColor);
+ LK.getSound('draw').play();
+ }
+ } else if (self.currentTool === 'erase') {
+ if (!cell.isEmpty) {
+ self.saveState();
+ cell.clear();
+ LK.getSound('draw').play();
+ }
+ } else if (self.currentTool === 'fill') {
+ self.saveState();
+ self.floodFill(cell.gridX, cell.gridY, cell.color);
+ LK.getSound('fill').play();
+ }
+ };
+ self.floodFill = function (x, y, targetColor) {
+ if (x < 0 || x >= self.gridSize || y < 0 || y >= self.gridSize) {
+ return;
+ }
+ if (self.grid[y][x].color !== targetColor) {
+ return;
+ }
+ if (self.grid[y][x].color === self.selectedColor) {
+ return;
+ }
+ self.grid[y][x].setColor(self.selectedColor);
+ self.floodFill(x + 1, y, targetColor);
+ self.floodFill(x - 1, y, targetColor);
+ self.floodFill(x, y + 1, targetColor);
+ self.floodFill(x, y - 1, targetColor);
+ };
+ self.saveState = function () {
+ // If we've gone back in history and now make a new change,
+ // discard any future states beyond the current index
+ if (self.historyIndex < self.history.length - 1) {
+ self.history = self.history.slice(0, self.historyIndex + 1);
+ }
+ // Save current state
+ var state = [];
+ for (var y = 0; y < self.gridSize; y++) {
+ state[y] = [];
+ for (var x = 0; x < self.gridSize; x++) {
+ state[y][x] = self.grid[y][x].color;
+ }
+ }
+ // Add to history and limit history size
+ self.history.push(state);
+ self.historyIndex++;
+ if (self.history.length > self.maxHistory) {
+ self.history.shift();
+ self.historyIndex--;
+ }
+ };
+ self.loadState = function (state) {
+ for (var y = 0; y < self.gridSize; y++) {
+ for (var x = 0; x < self.gridSize; x++) {
+ if (y < state.length && x < state[y].length) {
+ self.grid[y][x].setColor(state[y][x]);
+ } else {
+ self.grid[y][x].clear();
+ }
+ }
+ }
+ };
+ self.performAction = function (action) {
+ switch (action) {
+ case 'clear':
+ self.saveState();
+ self.clearCanvas();
+ break;
+ case 'undo':
+ self.undo();
+ break;
+ case 'redo':
+ self.redo();
+ break;
+ case 'save':
+ self.saveDrawing();
+ break;
+ case 'load':
+ // This would typically show a UI for selecting a saved drawing
+ // For simplicity, we'll just load the first saved drawing if available
+ if (storage.savedDrawings.length > 0) {
+ self.loadDrawing(storage.savedDrawings[0]);
+ }
+ break;
+ }
+ };
+ self.clearCanvas = function () {
+ for (var y = 0; y < self.gridSize; y++) {
+ for (var x = 0; x < self.gridSize; x++) {
+ self.grid[y][x].clear();
+ }
+ }
+ };
+ self.undo = function () {
+ if (self.historyIndex > 0) {
+ self.historyIndex--;
+ self.loadState(self.history[self.historyIndex]);
+ }
+ };
+ self.redo = function () {
+ if (self.historyIndex < self.history.length - 1) {
+ self.historyIndex++;
+ self.loadState(self.history[self.historyIndex]);
+ }
+ };
+ self.saveDrawing = function () {
+ var drawing = [];
+ for (var y = 0; y < self.gridSize; y++) {
+ drawing[y] = [];
+ for (var x = 0; x < self.gridSize; x++) {
+ drawing[y][x] = self.grid[y][x].color;
+ }
+ }
+ // Save to storage
+ storage.currentDrawing = drawing;
+ storage.savedDrawings.push(drawing);
+ // Limit saved drawings to prevent excessive storage
+ if (storage.savedDrawings.length > 10) {
+ storage.savedDrawings.shift();
+ }
+ LK.getSound('save').play();
+ };
+ self.loadDrawing = function (drawing) {
+ if (drawing) {
+ self.clearCanvas();
+ self.loadState(drawing);
+ // Reset history when loading
+ self.history = [drawing];
+ self.historyIndex = 0;
+ }
+ };
+ self.down = function (x, y, obj) {
+ self.isDrawing = true;
+ };
+ self.up = function (x, y, obj) {
+ self.isDrawing = false;
+ };
+ return self;
+});
+var ToolButton = Container.expand(function () {
+ var self = Container.call(this);
+ var toolIcon = self.attachAsset('toolIcon', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.toolName = '';
+ self.isSelected = false;
+ var toolLabel = new Text2('', {
+ size: 24,
+ fill: 0x000000
+ });
+ toolLabel.anchor.set(0.5, 0.5);
+ toolLabel.position.set(50, 50);
+ self.addChild(toolLabel);
+ self.setTool = function (name) {
+ self.toolName = name;
+ toolLabel.setText(name);
+ };
+ self.setSelected = function (selected) {
+ self.isSelected = selected;
+ toolIcon.tint = selected ? 0x88BBFF : 0xCCCCCC;
+ };
+ self.down = function (x, y, obj) {
+ pixelEditor.selectTool(self.toolName);
+ LK.getSound('click').play();
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0xF0F0F0
+});
+
+/****
+* Game Code
+****/
+// Create title text
+var titleText = new Text2('Pixel Crafter', {
+ size: 80,
+ fill: 0x333333
+});
+titleText.anchor.set(0.5, 0);
+titleText.position.set(2048 / 2, 20);
+game.addChild(titleText);
+// Create pixel editor
+var pixelEditor = new PixelEditor();
+game.addChild(pixelEditor);
+pixelEditor.initialize();
+// Handle game events
+game.down = function (x, y, obj) {
+ // Start drawing if no specific object was clicked
+ if (!obj || obj === game) {
+ pixelEditor.isDrawing = true;
+ }
+};
+game.up = function (x, y, obj) {
+ pixelEditor.isDrawing = false;
+};
+game.move = function (x, y, obj) {
+ // This is handled by the GridCell move event
+};
+// Play background music
+LK.playMusic('bgmusic', {
+ fade: {
+ start: 0,
+ end: 0.3,
+ duration: 1000
+ }
});
\ No newline at end of file