Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #71 (permalink)  
Старый 25.05.2023, 12:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Борис К,
не могу подсказать.
Ответить с цитированием
  #72 (permalink)  
Старый 25.05.2023, 14:24
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Видимо, дело за будущим JS!)
Рони, ещё раз великодушно благодарю за оказанную помощь!
Ответить с цитированием
  #73 (permalink)  
Старый 16.06.2023, 13:35
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Рони, здравствуйте! )
Не могу самостоятельно справится со следующим вопросом с использованием стилей: как в последнем варианте кода сделать так, чтобы элемент, на который кликнуто, оставался выделенным с помощью стиля:
<style type="text/css">
     .active {
         opacity: .4;
     }
</style>


Последний раз редактировалось Борис К, 16.06.2023 в 13:38.
Ответить с цитированием
  #74 (permalink)  
Старый 16.06.2023, 14:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

игра собери картинку
Борис К,
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        td {
            width: 56px;
            height: 56px;
            background-size: cover;
            background-image: var(--url);
        }

        .game.end {
            border-collapse: collapse;
            border-spacing: 0px;
        }
         .active {
         opacity: .4;
         }
    </style>
</head>

<body>
    <br>
    <br>
    <table class="game">
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </table>
    <button id="btn">Shuffle</button>
    <script>
        function imagedata_to_image(imagedata) {
            let canvas = document.createElement('canvas');
            let ctx = canvas.getContext('2d');
            canvas.width = imagedata.width;
            canvas.height = imagedata.height;
            ctx.putImageData(imagedata, 0, 0);
            return canvas.toDataURL();
        }

        const x = 150; // ширина одного
        const y = 150; // высота одного
        const w = 2; // сколько в ряду
        // картинки, должны быть на том же домене или иметь Access-Control-Allow-Origin
        function makeRand(num) {
            let usedNumbers = [];

            function f() {
                if (usedNumbers.length == num) usedNumbers = [];
                let i = Math.floor(Math.random() * num) + 1;
                return usedNumbers.includes(i) ? f() : (usedNumbers.push(i), i)

            }
            return f;
        }
        let totalImg = 44;
        let key = makeRand(totalImg);
        let length = 4;
        let images = length => Array.from({
            length
        }, _ => `https://loremflickr.com/150/150/girl?random=${key()}`);

        /*let images = length => Array.from({
            length
        }, _ => `https://xyz.ru/images/${('' + key()).padStart(2, "0")}.jpg`);*/

        const h = Math.ceil(length / w); // сколько в столбце
        const canvas = Object.assign(document.createElement('canvas'), {
            width: w * x,
            height: h * y
        });
        document.body.prepend(canvas);
        const ctx = canvas.getContext('2d'),
            arrSrc = [],
            tb = document.querySelector('.game'),
            cells = Array.from(tb.querySelectorAll('td'));
        let win, temp = [];

        function endGame() {
            tb.classList.add('end');
        }

        function exch(event) {
            if (win) return;
            let td = event.target.closest('.game td');
            if (td) {


                let cellIndex = td.cellIndex;
                let rowIndex = td.closest("tr").rowIndex;
                if (temp.length) {
                    let x = Math.abs(cellIndex - temp[1]);
                    let y = Math.abs(rowIndex - temp[2]);
                    if ((x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0]) {
                        let url = td.style.getPropertyValue('--url');
                        td.style.setProperty('--url', temp[0].style.getPropertyValue('--url'));
                        temp[0].style.setProperty('--url', url);
                        temp[0].classList.remove('active');
                        temp = [];
                    }
                } else {
                    temp = [td, cellIndex, rowIndex];
                    td.classList.add('active');
                }
                win = cells.every(({
                    style
                }, i) => {
                    let url = style.getPropertyValue('--url');
                    style.setProperty('--url', arrSrc[i]);
                    let patern = style.getPropertyValue('--url');
                    style.setProperty('--url', url);
                    return url === patern
                });
                if (win) endGame();
            }
        }
        tb.addEventListener("click", exch);
        const createImg = () => Promise.all(
            images(length).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(() => {
            const wh = w * x / tb.rows.length;
            arrSrc.length = 0;
            win = false;
            temp = [];
            tb.classList.remove('end');
            for (let i = 0; i < tb.rows.length; i++) {
                for (let j = 0; j < tb.rows[i].cells.length; j++) {
                    let imagedata = ctx.getImageData(wh * j, wh * i, wh, wh);
                    let url = imagedata_to_image(imagedata);
                    arrSrc.push(`url(${url})`);
                }
            }
            arrSrc.slice(0).sort(_ => Math.random() - .5).forEach((url, i) => cells[i].style.setProperty('--url', url))
        });
        btn.addEventListener('click', createImg);
        createImg()
    </script>
</body>

</html>
Ответить с цитированием
  #75 (permalink)  
Старый 16.06.2023, 18:02
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Точно так сделал, но только в 138 строке вместо td.classList.add('active'); у меня было img.classList.add('active'); ... вот неудача!(((
Рони, моя безграничная благодарность!
Ответить с цитированием
  #76 (permalink)  
Старый 18.06.2023, 16:03
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Добрый день, Рони!
К сожалению, сам не осилил следующий познавательный вопрос: например, как сделать так, чтобы после завершения всех переходов, изображения вновь перемешались, но без использования кнопки "Shuffle"?
Понимаю, что в 149 строку - if (win) endGame(); следует вписать что-то из 189 (btn.addEventListener('click', createImg); - вроде задача не из сложных, но опять туплю самостоятельно опять не справляюсь(((

Последний раз редактировалось Борис К, 18.06.2023 в 16:21.
Ответить с цитированием
  #77 (permalink)  
Старый 18.06.2023, 16:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Борис К,
if (win) endGame();
if (win) createImg()
Ответить с цитированием
  #78 (permalink)  
Старый 19.06.2023, 12:57
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Сообщение от рони
if (win) createImg()
Опять двойка... мне стыдно(((
СПАСИБО, Рони!
P.S. Возможно, Вам пригодится следующий "интересный" факт: экспериментируя с количеством и размерами исходных изображений для canvas, я обнаружил, что размеры таблицы с сегментами заметно уменьшены и сами сегменты неравномерно размещаются в таблице... вот такие дела)
Ответить с цитированием
  #79 (permalink)  
Старый 27.06.2023, 09:34
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Здравствуйте, Рони!
Экспериментируя с некоторыми вариантами вашего кода, перенёс пути к изображениям из скрипта в стили:
<style type="text/css">

[data-id="girl"] {
            background-image:url(https://loremflickr.com/150/150/girl?random=1);
            width: 150px;
            height: 150px;
        }
[data-id="dog"] {
            background-image:url(https://loremflickr.com/150/150/dog?random=2);
            width: 150px;
            height: 150px;
        }
[data-id="boy"] {
            background-image:url(https://loremflickr.com/150/150/boy?random=3);
            width: 150px;
            height: 150px;
        }
[data-id="kitten"] {
            background-image:url(https://loremflickr.com/150/150/kitten?random=4);
            width: 150px;
            height: 150px;
        }
    </style>

Но не могу понять, как изменить следующие строки скрипта, чтобы в нём указать отсылку к изображениям в стилях:
const images = [
            "https://loremflickr.com/150/150/girl?random=1",
            "https://loremflickr.com/150/150/dog?random=2",
            "https://loremflickr.com/150/150/boy?random=3",
            "https://loremflickr.com/150/150/kitten?random=4"
        ];

Ответить с цитированием
  #80 (permalink)  
Старый 27.06.2023, 10:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Борис К,
пас, умных мыслей, как это сделать, нет.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLE загрузка изображений через дополнительное поле armn555 Элементы интерфейса 0 18.08.2017 11:08
Ajax. Как сделать загрузку изображений, отображение, удаление как на Авито wowtschuk AJAX и COMET 1 07.03.2017 01:34
Повременная смена изображений jozev Элементы интерфейса 2 01.08.2011 18:43
Прокрутка изображений gen552 Элементы интерфейса 6 01.04.2011 13:11
Скролл мини изображений I-Trap Элементы интерфейса 1 25.11.2009 22:03