Рони, на первый взгляд, видимо, может показаться, что затея "огород с канвас" бессмысленна, но дело меняется, если посмотреть на таблицу, например, с большим количеством ячеек, которыми в дальнейшем можно интерактивно манипулировать.
Если это очень сложно реализовать, ну, тогда... В любом случае представленное решение на мой первый вопрос несомненно очень кстати, супер... Спасибо огромное! |
Цитата:
Цитата:
|
Рони, возможно, я слишком туманно изьясняюсь... уж извините!)
Смотрите, например, из 16-ти маленьких исходных изображений можно сгенерировать одно большое, которое отражается в <img id="pic"></img>, что и было уже Вами представлено в конечном результате - просто отлично получилось! Теперь это изображение нужно как-то представить, например, девятью ячейками таблицы, чтобы в дальнейшем можно было их перемещать кликами между собой после рандомной перетасовки до первоначально сгенерированного вида. Очень жаль, если такое невозможно реализовать((( Хотя мне казалось, что средствами Java Script невозможно и картинку сгенерировать из других... и, о, чудо чудесное! :dance: |
Цитата:
Переделал слегка пример Рони Вверху canvas. Внизу таблица с перенесенным в ячейки изображение из канвас <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> td { width:100px; height:100px; } </style> </head> <body> <br> <br> <table> <tr> <td></td><td></td><td></td> </tr> <tr> <td></td><td></td><td></td> </tr> <tr> <td></td><td></td><td></td> </tr> </table> <button id="btn">Shuffle</button> <script> // функция перемешивающая массив function shuffle(array) { let i = array.length; while (i--) { let j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array; } // функция добавляющая картинку на страницу function toImage(canvas, type) { pic.src = canvas.toDataURL(type) } const x = 150; // ширина одного const y = 150; // высота одного const w = 2; // сколько в ряду // картинки, должны быть на том же домене или иметь Access-Control-Allow-Origin const images = [ "https://picsum.photos/seed/aaa/150", "https://picsum.photos/seed/bbb/150", "https://picsum.photos/seed/ccc/150", "https://picsum.photos/seed/ddd/150" ]; const h = Math.ceil(images.length / w); // сколько в столбце const canvas = Object.assign(document.createElement('canvas'), { width: w * x, height: h * y }); document.body.prepend(canvas); const ctx = canvas.getContext('2d'); const createImg = () => Promise.all( shuffle(images).map((src, i) => new Promise( (onload, onerror) => Object.assign(new Image(), { crossOrigin: 'anonymous', src, onerror, onload }) ).then(({target}) => { const hPos = Math.floor(i / w); const wPos = i - (hPos * w); ctx.drawImage( target, wPos * x, hPos * y, x, y ) })) ).then(() => { // toImage(canvas, 'image/jpeg'); const url = canvas.toDataURL('image/jpeg') let x =0; const tb = document.querySelector ('table') for (let i = 0; i< tb.rows.length; i++) { for (let j = 0; j< tb.rows[i].cells.length; j++) { tb.rows[i].cells[j].style.backgroundImage = `url(${url})`; tb.rows[i].cells[j].style.backgroundPosition = `${-j*100}px ${-i*100}px`; } } }); btn.addEventListener('click', createImg); createImg() </script> </body> </html> |
Цитата:
Цитата:
|
Цитата:
Да нет, всё логично по задумке - выше Voraa вроде правильно понял... Поясню: 1. Из 16 маленьких изображений генерируется одно большое изображение цельным jpg (это уже реализовано - представлено Aetae и модифицировано Рони). 2. Одновременно большое изображение должно разделится, например, на 9 частей-квадратиков (Voraa разделил) и перемешатся . 3. Клики по соседним квадратикам должны их менять местами... и так до результата первоначально сгенерированного большого изображения. Цитата:
|
Voraa, Вы правильно поняли мой вопрос и отлично справились, но немного изменили код в моём примере на этой страничке, а это мне помешает самостоятельно реализовать то, что уже имелось для полного замысла... но тем не менее моя Вам искренняя благодарность!))
Поясню своё полное видение: 1. Из 16 маленьких изображений генерируется одно большое изображение цельным jpg (это уже реализовано - представлено Aetae и модифицировано Рони). 2. Одновременно большое изображение должно разделится, например, на 9 частей-квадратиков (реализовано Вами) и перемешатся (имеется уже готовое решение). 3. Клики по соседним квадратикам должны их менять местами... и так до результата первоначально сгенерированного большого изображения. |
Цитата:
Как из нескольких изображений сделать одно. Как снова разделить это изображение на другое количество частей и вставить их как фон на элементы. Ваше видение вы должны сами реализовывать. |
Цитата:
Цитата:
Цитата:
Цитата:
Voraa, спасибо Вам! |
Rise, это пока не игра... ведь решение мной так и не найдено(((
А так, то был замысел сделать что-нибудь среднее по трудности для умственно отсталого ребенка на компьютере... P.S. Я совсем не программист, просто когда-то немного знакомился с веб-технологиями в качестве хобби, но теперь вижу, что язык JS в составе HTML5 ушёл далеко вперёд... и я глубоко восхищён высокопрофессионализмом людей на этом ресурсе, владеющим современным JS! |
Часовой пояс GMT +3, время: 02:32. |