Программирование

Фронтенд

1я неделя
срок 6 недель = 3 + 5 + 20 дней
5 направлений

учебник

Все проекты

оцифровка карт +
модули +
тайловый редактор +
анимация +
движок графического приложения
Объект обработки всех форм страницы


общая теория:
циклы, массивы, функции, управляющие конструкции,
объекты, прототипы, методы, классы,
события, обработчики событий, модули.

1 нед - дизайн
подборка и рисовка тайловых наборов
основы js теория
js - функции и лямда-функции
js - объекты, методы, прототипы, классы
2 нед
написать событийное приложение (управление объектом с клавиатуры или мышью)
собрать html макет страниц проекта
json отправка данных на сервер работа с fetch
понятие программного модуля, изоляции кода

оцифровка карт

   

Цель

создать приложение позволяющее быстро оцифровать карту контурными объектами.
У одного контурного объекта может быть несколько независимых контуров.
Контуры должны быть заданы в фиксированных плоских экранных css координатах.

Задача

Инструмент состоит из двух наложенных друг на друга слоёв

Должна быть кнопка или селектор перехода между слоями
на первом слое отображается масштабируемая яндекс карта. Карту можно перемещать выбирая удобное положение масштаб и тип отображения.
Второй слой используется для рисования - при перемещении первого слоя, объекты второго слоя должны перемещаться аналогично. Этот слой должен быть полупрозрачным.

На втором слое должны быть реализованы действия:
пересчёт координат при перемещении карты-подложки. Поставить точку. Формирование массива точек контура. Соединить новую точку с предыдущей линией. Проверить замкнутось контура. Замкнуть контур. Завершить создание контуров объекта. проверка limit точек в контуре. проверить дельта расстояния последней точки от начальной - если меньше заданного - замкнуть контур.
Удалить точку. стек действий. отменить действие. Перевести контур в css стили. Сохранить css файл.
Убрать подложку. Подсветить замкнутые контуры объекта при наведении. Выделить объект с контуром. Отобразить название и свойства выбранного контурного объекта. Изменить свойства выделенного контурного объекта. Получение состояния карты подложки: координаты и масштаб. Масштабирование.
Удалить контур. Удалить объект. Выделить группу контуров. Проверить точку в группе контуров на внутренность. Объединить группу контуров в один контур. Добавить объекту новый контур. Получить ближайшую точку другого контура.
пример - https://energy.q-pax.ru/map

План

3 нед
создание слоёв визуального и логического
пересчёт координат географических и экранных
действие клика - выставление точки
формировать массив точек - limit количества
замыкание по экранным координатам при заданном дельта
правый клик - удаление точки
4 нед
стек действий
отмена ctrl+z - отменить последнее действие
enter - замкнуть контур и сохранить css контур
отобразить без карты-подложки
onfocus - подсветить контур
перетаскивание и масштабирование - пересчёт видимых точек
изменить рисовку на контурном слое
5 нед
получить масштаб и координаты - состояние карты подложки
cntrl+click - взять ближайшую точку другого контура
выделить контур переименовать, задать свойства
del - удалить активный контур
выделить группу контуров
6 нед
построить новый контур по внешним точкам группы
внешние - пренадлежат 1 контуру
либо принадлежность к контурам меньше количества соседних точек по всем контурам которым принадлежит
Отладка, рефакторинг
с помощью инструмента оцифровать карты районов удмуртии и районов Ижевска

разработка модулей

   
Задача
Разработать приложение состоящее из изолированного кода модулей:
общей сцены, миникарты, камеры, экрана, модальные окна сообщений.
Так чтобы заменяя методы или целый модуль можно было переходить
к разным проекциям, из 2д в 3д и т.д
Данные должны браться из таблиц сервера БД
сами модули либо через замыкания прототипов
function createSystem(options) {
let name, version, self;
function System(options) {
}
}
тот же синглтон
let buildProto = (function() {
function Build(options) {
}
})();
либо на замыкании класса
let intellect = (function() {
class Intellect {
}
return new Intellect();
})();
либо на самом классе:
class Intellect {
}
либо на замыкании функции
let enviromentType = (function() {
return function(params) {
...
}
})();

Что должно работать в модулях
сцена - хранение данных обо всех объектах
возможность подключать и использовать наборы разных объектов.
камера - выделяет кусок сцены и передаёт его другим модулям. Должна подстраиваться под изометрию.
Не должна выходить за рамки сцены при прямой проекции.
миникарта - должна схематично отображать фон, объекты,
цветовая схема-принадлежность объектов, изменяемые режимы карты. (физика социум политика экономика и т.д.)
Должна отображать положение камеры(камер), и передавать управление камере для изменения положения.
экран - отображение тайлов фона и объектов. В несколько слоёв.
Перемещение объектов не должно затирать фон. Слоёв должно быть 3.
модальные окна - выводить сообщения, скроллируемый текст + картинка + кнопка.
Перехватывать все клики по экрану и не давать управления пока открыто окно. (только закрытие, листание и кнопка продолжить, либо 2 кнопки - согласия и отмены, либо поле ввода и 2 кнопки)

План
3 нед
main
types
build
enviroment
fraction
unit
---
objects
furniture
container
transport
4 нед
system
engine
scene
map
5 нед
menu_comand
engine
camera
screen
6 нед
build_factory
build_interface

тайловый редактор карт

   
Задача
При разработке нужно вести дневник версий модулей.
Написать редактор позволяющий создавать карты сцены с разной местностью,
и размещением на ней статичных объектов.
Созданные карты должны сохраняться в файл (или набор файлов)
Редактор должен считывать созданные карты.
Редактор должен переключаться между режимами прямой и изометрической проекции.
У каждого модуля должны быть свойства: название и версия.
у каждого модуля должен быть метод info - возвращающий строку названия + версии
Данные должны грузиться с сервера из БД
Модуль должен возвращать прототип модуля из которого можно получить прототипы объектов за которые отвечает модуль. (Здание, ландшафт, предмет, мебель)
Методы типового модуля (type_className):
Получить список всех типов объектов, которые порождаются классом
Получить прототип объекта по указанному типу(ключу)
Создать объект этого класса
Получить нередактируемую копию объекта
Получить изображение всех объектов (при необходимости)
Получить изображение отдельного объекта (при необходимости)
Если объекты могут объединятся в стек - метод сортировки объектов в стеке.

Примеры использования:
Обращаясь к модулю - мы получаем либо список возможных типов объектов, либо прототип конкретного объекта и возможность обратиться к его методам и свойствам,
чтобы затем использовать эти прототипы в фабриках объектов, порождающих массивы объектов из этих прототипов.
buildProto.getAllTypes().then(...);
loadedProto = await buildProto.getAllTypes();
unitProto.getImage();
unitProto.getUnit(type).moveBonus;
typeLand = enviromentType(type);
План
3 нед
main
types
build
enviroment
fraction
unit
4 нед
system
загрузка данных с сервера с помощью модуля system
engine
scene
map
5 нед
map_editor
слои
деструктурирование смежных тайлов
прямая и изометрическая проекция
6 нед
map_editor
редактор помещений интерьеров
редактор города и логистики
редактор стратегии





Первые шаги:
0.01
создать файловую структуру проекта. (каталог проекта + что описано ниже)
создать файлы документации проекта: описание и версии модулей.
Создать основной файл логики приложения: js/main.js
создать файл основных стилей css/main.css

0.02
создать файл основной разметки приложения: index.html
определить в нём
Языковую локализацию.
Метаданные: кодировку, viewport, title
Подключить стилевой файл main.css
Разместить основной контейнер в body

0.03
создать js файлы системных модулей: экран сцена камера
подключить js файлы с аттрибутом defer в index.html
модуль screen 0.3
модуль scene 0.1
camera 0.1

0.04
Отобразить сетку мира на экране.
screen 0.4
camera 0.2

0.05
Cоздать мини-карту.
отобразить камеры на миникарте.
map 0.1
camera 0.3

По модулям:
camera 0.3
4 Камера.
0.1
создать файл camera.js - файл модуля.
Подключить файл в html.
создать замыкание: структуру модуля.
Создать внутренние параметры: цвет, координаты, количество захваченных ячеек сцены.
Создать конструктор.
Задать размеры по умолчанию.
Вернуть объект камеры.

0.2
Получить текущий снимок. (вернуть параметры камеры)
Передвинуть камеру.

0.3
Разделить получение параметров и снимка.
Получить снимок из переданной матрицы.
По модулям:
1 Экран. screen
0.1
Создать screen.js - файл модуля.
Подключить файл в html.
создать замыкание: структуру модуля.
Создать внутренние параметры: ширина высота, размер ячейки,
параметры: количество ячеек по ширине и высоте

0.2
создать конструктор.
вычислить размеры экрана.
создать геттер и сеттер размеров экрана.
Вернуть объект экрана.

0.3
Опция: селектор блока.
Методы: Поиск блока по селектору.
Создание холстов.
Изменение холстов.
перекрыть канвасы через css.

0.4
Создать холсты.
Отобразить содержимое ячейки.
Отобразить весь холст.
Задать типы поверхностей.
Задать окрас в зависимости от типа поверхности.


scene 0.1
0.1
создать файл scene.js - файл модуля.
Подключить файл в html.
создать замыкание: структуру модуля.
Создать внутренние параметры: ширина высота, слои природный и строений.

map 0.1
3 Мини карта. map
0.1
создать файл map.js - файл модуля.
Подключить файл в html.
создать замыкание: структуру модуля.
Создать внутренние параметры: .
Создать конструктор.
Вернуть объект карты.
получить данные сцены и построить по ним канву.


Анимация

   
Задача
создать модуль. (замыкание над классом)
создать пару холстов для вывода изображений
Найти несколько тайловых наборов персонажей из одной серии (в одном стиле)
создать объект со свойствами: направление, состояние, шаг анимации
Создать кнопки изменения направления и состояния объекта
создать таймер меняющий шаг анимации
В зависимости от значений свойств выбирать из тайлового набора и выводить изображение объекта
Меняя тип объекта заменять таловый набор с сохранением избражения
Анимация готова.
Смена тайлового набора, направление, состояние - должны передаваться внешними параметрами.
Должна быть кнопка запуска и остановки анимации.
Создать модуль который не лету может реколлировать тайловый набор - подменить пиксели изображения определённого цвета - на другой цвет и его оттенки (несколько цветов)
План
2 нед
написать событийное приложение (управление объектом с клавиатуры или мышью)
собрать html макет страниц проекта
json отправка данных на сервер работа с fetch
понятие программного модуля, изоляции кода
поиск/создание тайловых наборов.
3 нед
main
types
build
enviroment
fraction
unit
событийный автомат состояний
набор действий, направлений
4 нед
engine
camera
screen
раскадровка
5 нед
Анимация
Движение
Перемещение
Восстановление смежных тайлов
6 нед
Реколлер объектов
основной цвет и его оттенки должны преобразоваться в новый цвет и его оттенки
остальная часть изображения должна остаться неизменной
примеры объектов: одежда, мебель, здание, салон автомобиля

движок графического приложения (процессоры миров)

   
Задача
План
3 нед
main
types
build
enviroment
fraction
unit
4 нед
system
engine
scene
map
5 нед
unit_list
life
управление
экономика
перемещение
6 нед
message window (reports)
ИИ
Функция поиска кратчайшего пути между пунктами
Функция поиска кратчайшего пути с весами и разными возможностями
состояние, оценка, и принятие решений
роевой интеллект

Объект обработки форм

выполнить todolist описанный в конце этой статьи