Блог Людмилы Третьяковой

Конструктор визиток

2018-10-30 11:43

Недавно я закончила еще один проект - Конструктор визиток. Я занялась этим проектом, потому что конструкторы визиток, которые я видела, сложны в работе. Мне захотелось сделать что-то достаточное простое, удобное и понятное для пользователей. На картинке ниже представлен вариант моей визитки, сделанный в конструкторе. Конструктор визиток

А ниже видео процесса создания визитки (картинка - ссылка на youtube).

Конструктор визиток

Конструктор визиток обладает следующими возможностями и инструментами.

Права панель:

Панель инструментов:

Левая панель:

Во время разработки я столкнулясь с теми же проблемами, что описаны в статье Разработка Rich Text Editor: проблемы и решения, поэтому подход к фомированию структуры данных был схож с тем, что предложен в статье.

Набор инструментов я взяла самый минимальный. Сначала, я планировала включить еще выравнивание блоков(по центру, слева, справа) внитри визитки, но позже отказалась от этой идеи, потому что выравнивания блоков мышкой оказалось вполне достаточно.

Сделать визитку

Редактор уровней игры "Сокобан" и игра "Сокобан" с загрузкой уровней

2018-08-27 13:49

Следующий проект - это связка двух проектов: редактор уровней игры "Сокобан" и игра "Сокобан".

Редактор уровней игры "Сокобан"

В игре пользователь загружает созданный в редакторе уровень и играет в игру. Доступ к уровню, который создает пользователь, должен предоставляться отовюду. Значит, нужна удаленная база, которая позволяет работать с необходимыми данными.

MongoDB Atlas прекрасно подошел для целей проекта, потому что дает:

В рамках моего проекта MongoDB Atlas позволил:

Также в редакторе уровней было интересно сделать непосредственно редактор. Отрисовка панели инструментов, выбор компонентов для добавления на игровое поле, их перетаскивание мышью, привязка компонентов к сетке игрового поля при перемещении полностью реализовано на Canvas.

Когда редактор уровней был готов, я использовала часть кода с предыдущего проекта игры "Сокобан" и с текущего редактора и сделала новую версию игры "Сокобан". В этом проекте отредактированные уровни загружаются с удаленного сервера для дальнейшей игры.

Игра "Сокобан"

Ссылка на репозиторий Редактора уровней

Сделать свой уровень

Ссылка на репозиторий игрушки

Поиграть

Игра "Сокобан"

2018-07-30 12:43

Следующий проект - игра "Сокобан". Сокобан — логическая игра-головоломка, в которой игрок передвигает ящики по лабиринту, показанному в виде плана, с целью поставить все ящики на заданные конечные позиции. Только один ящик может быть передвинут за раз, причём герой игры — «кладовщик» — может только толкать ящики, но не тянуть их.

Сокобан

Реализация игры имеет несколько особенностей:

this.imagesPromises = {
    [WALL]: this.loadImage(wallImg),
    ...
}
loadImage(url){
    return new Promise((resolve, reject) => {
        let img = new Image();
        img.addEventListener('load', e => resolve(img));
        img.addEventListener('error', () => {
            reject(new Error(`Failed to load image's URL: ${url}`));
        });
        img.src = url;
    });
}

    ...
    this.imagesPromises[state.board[y][x]].then(img => {
        ctx.drawImage(img, x * SIZE_BLOCK, y * SIZE_BLOCK, SIZE_BLOCK, SIZE_BLOCK)
    })
    ...
    .animation {
        color: rgba(255, 255, 255, 0.3);
        font-size: 25em;
        font-weight: bold;
        z-index: 5;
        animation: ani 0.8s forwards;
    }

    @keyframes ani {
        30% {
            opacity: 1
        }
        50% {
            opacity: 0.5
        }
        100% {
            opacity: 0
        }
    }

Ссылка на репозиторий

Поиграть

Пиксельный редактор

2018-07-18 15:43

Следующий проект для изучения возможностей React+Redux - пиксельный редактор. PixelEditor

В пиксельном редакторе есть следующие инструменты для рисования:

А также дополнительные возможности:

Размер области для рисования - 25 х 28 пикселей.

Область рисования редактора первоначально была реализована путем добавления сетки из div-компонентов, где каждый div - представлял собой один пиксель будущего изображения. От этого способа пришлось отказаться, т.к. при рисовании прямоугольника стала заметна задержка рисования. Чтобы найти проблему, я измерила время обработки каждого события с помощью React Developer Tools.

Оказалось, что одно событиие mousemove и связанная с ним пачка событий выполняются примерно 311ms, что довольно много. При этом 290ms осуществляется обновление и перерисовка компонента Canvas (который на самом деле div) и его дочерних компонентов Cell (тех самых div-пикселей). PixelEditor

После перехода к обрасти рисования на канве (canvas), скорость отрисовки графических примитивов возросла в несколько раз. Это отражено и при замере скорости в React Developer Tools.

PixelEditor Сетка канвы для визуализации пикселей выполнена в CSS. Размер в backgroundSize - размер ячейки.

    const canvasStyle = {
        backgroundSize: `${CELL_WIDTH}px ${CELL_WIDTH}px`
    }
  background: linear-gradient(to right, #464646 1px, transparent 1px), 
                    linear-gradient(to bottom, #464646 1px, transparent 1px);

Для рисования графических примитивов реализованы следующие алгоритмы:

Кусок кода для расчета координат прямой линии по алгоритму Брезенхема:

    ...
    if (Math.abs(startX - endX) > Math.abs(startY - endY)) {
        const angularRatio = Math.abs((endY - startY) / (endX - startX));
        const xCoords = getCoordsOffset(startX, endX);
        const yCoords = bresenhemLine(startY, endY, angularRatio, xCoords.length);

        return filterCanvasBorder(
                    yCoords.map((item, inx) => ([item, xCoords[inx]])))
    ...

    const bresenhemLine = (start, end, angularRatio, len) => {
    let err = 0;
    let coord = start;
    return [start].concat(
        Array(len - 1)
            .fill()
            .map((_) => {
                err += angularRatio;
                if (err >= 0.5) {
                    coord += (end - start) > 0 && (end - start) !== 0 ? 1 : -1;
                    err -= 1;
                }
                return coord
            })
    )
}

Нарисованное изображение сохраняется на компьютере пользователя в формате PNG.

PixelEditor

Ссылка на репозиторий

Хотите порисовать?