<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Canvas Cuadriculado con Pincel ASCII</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f4f4f4; flex-direction: column; } canvas { border: 1px solid black; background-color: white; cursor: crosshair; } select { margin-bottom: 10px; } </style> </head> <body> <select id="seleccionAscii"> <option value="*">*</option> <option value="#">#</option> <option value="@">@</option> <option value="&">&</option> <option value="%">%</option> </select> <input type="color" value="#000000" id="colorPicker"> <canvas id="lienzoCuadriculado" width="500" height="500"></canvas> <script> const colorPicker = document.getElementById("colorPicker"); const lienzo = document.getElementById("lienzoCuadriculado"); const contexto = lienzo.getContext("2d"); const tamanoCuadricula = 20; // Tamaño de cada celda en píxeles let dibujando = false; const seleccionAscii = document.getElementById("seleccionAscii"); // Mapa para almacenar los caracteres y sus colores const caracteresEnPosiciones = new Map(); function dibujarCuadricula() { contexto.strokeStyle = "#ddd"; for (let x = 0; x <= lienzo.width; x += tamanoCuadricula) { contexto.beginPath(); contexto.moveTo(x, 0); contexto.lineTo(x, lienzo.height); contexto.stroke(); } for (let y = 0; y <= lienzo.height; y += tamanoCuadricula) { contexto.beginPath(); contexto.moveTo(0, y); contexto.lineTo(lienzo.width, y); contexto.stroke(); } } function obtenerPosicionAjustada(posicion) { return Math.floor(posicion / tamanoCuadricula) * tamanoCuadricula; } function dibujarAscii(x, y) { const ascii = seleccionAscii.value; const color = colorPicker.value; const posicionClave = `${x},${y}`; const caracterInfo = caracteresEnPosiciones.get(posicionClave); // Solo dibuja si la celda está vacía o si el carácter o color es diferente if (!caracterInfo || caracterInfo.ascii !== ascii || caracterInfo.color !== color) { // Limpia la celda antes de dibujar contexto.clearRect(x, y, tamanoCuadricula, tamanoCuadricula); // Redibuja la línea de la cuadrícula para esa celda contexto.strokeStyle = "#ddd"; contexto.strokeRect(x, y, tamanoCuadricula, tamanoCuadricula); // Dibuja el nuevo carácter con el color seleccionado contexto.font = `${tamanoCuadricula}px monospace`; contexto.fillStyle = color; contexto.fillText(ascii, x, y + tamanoCuadricula - 5); // Almacena el nuevo carácter y su color en el mapa caracteresEnPosiciones.set(posicionClave, { ascii, color }); } } lienzo.addEventListener("mousedown", (evento) => { dibujando = true; const x = obtenerPosicionAjustada(evento.offsetX); const y = obtenerPosicionAjustada(evento.offsetY); dibujarAscii(x, y); }); lienzo.addEventListener("mousemove", (evento) => { if (dibujando) { const x = obtenerPosicionAjustada(evento.offsetX); const y = obtenerPosicionAjustada(evento.offsetY); dibujarAscii(x, y); } }); lienzo.addEventListener("mouseup", () => { dibujando = false; }); dibujarCuadricula(); </script> </body> </html>