четверг, 16 февраля 2012 г.

Редактор логики. Самое начало.

  Редактор логики  это инструмент создания и редактирования логических схем, которые применяются в программировании везде. Логические схемы обычно пишутся вручную, если это не очень сложная, но при создании игр, а я столкнулся с этой проблемой именно при в игрострое, логические схемы бывают очень путанные.
  О чём я говорю? Это может быть всё что угодно, но меня прежде всего интересует функционал персонажа. Его сложные логические, древовидные структуры, у которых проихсходит переплетение ветвей, просто не реально создавать вслепую. А именно так я и создавал всё, поэтому то в этом и проблема. Нет инструмента которым можно было бы эти ветви создавать и САМОЕ ГЛАВНОЕ видеть эту схему. Ведь основная проблема в том, что не получается предусмотреть все возможные ошибки, когда не видишь схемы. Такую схему просто не реально держать в голове. Поэтому я начал писать редактор логики.
  На данный момент готова базовая работа с условными объектами. Я их назвал "дисплейные объекты"
  // - Перемещение дисплейного объекта.
  Перемещение дисплейного объекта происходит с позволения его свойства Moving.
Для нормального перемещения объекта, ему нужно закрепиться за курсором.
Объект всегда смещён относительно курсора, особенно это касается выделенных объектов,
когда курсор наведён не на них.
Поэтому в процедуре нажатия клавиш мышки, всегда сохраняем разность всех дис.объектов
относительно курсора. Это свойство (rPositionX, rPositionY).

  // - Каким методом мы добиваемся включения Moving?
  Первый метод - это прямое наведение курсора на дисплейный объект. Выделен только
Один объект (Selected).
  Второй метод - это выделение нескольких объектов, тот же (Selected).
  Третий метод - комбинированное выделение, это значит, что при зажатой кнопки TAB,
объекты не теряют свой выделености. При комбинированнном выделении, важном параметром является
(Selected) и (Moving). Все (Selected) объекты становятся (Moving) только при нажатии ЛКМ.
Тоесть в случае повторного выделения объекта вторым способом, но с зажатой клавишей TAB,
при обнулении выделености, мы сможем отличить Ранее выделенный объект от толькочто выделенного.
А значит сможем адекватно обнулиться.

  // - Все выделенные объекты сохраняют свою выделенность в двух случаях:
  1. Если мы выбрали один или несколько объектов и нажимаем ЛКМ только на них.
Тоесть в пустоту нажимать нельзя.
  2. Если мы зажали кнопку TAB, то мы можем нажимать сколько угодно и куда угодно ЛКМ.
Выделенность не потеряется, но перемещать объекты мы не сможем. Поэтому выделив объекты используя
первый или второй способ, нужно пользоватся первым способом сохранения выделености,
а значит - навести курсор на уже выделеные объекты и тащить их.

  // - Потерять выделенность можно несколькими способами:
  1. навести курсор на не выделеный объект и нажать ЛКМ,
выделеность всех остальных объектов пропадёт.               - "Не выбраный объект"
  2. навести курсор на выделеный объект и нажать ЛКМ.       - "Повторное нажатие"
  3. не навести курсор ни на один из объектов и нажать ЛКМ. - "Пустота"
  4. делать первый и второй способ без зажатой клавиши TAB. - "Не комбинированное выделение"


//----------------------------------------------------------------------------//
  Существует массив Дисплейных объектов и шаги.
  Шаг это запись которая имеет массив образов. Количество объектов в массиве, равно количеству
Дисплейных объектов при сохранении шага. Тоесть в разных шагах хранится разное количество объектов.
Переключение по шагам произходит по одному принципу:
  Удаляем все дисплейные объекты и на основе шага, как по инструкции, создаём новые дисплейные объекты
Которые заполняем пораметрами считанные с образов. Так мы и получем илюзию того,
что действия отменяются или возвращаются.

  // - Сохранение шага происходит по принципу:
  1. Счётчик повышаем на единицу.
  2. Выделяем память на массив образов в текущем шаге.
  3. Заполняем массив параметрами.
  4. Если сделанный шаг - последний в массиве,
то от счётчика отнимаем единицу и сдвигаем все шаги в сторону нуля на единицу.
  5. И указываем количество шагов сделанных от нуля. Если мы отменяли какието шаги, то
количество шагов должно быть уменьшено.

  // - Считываение шага с контроллера происходит так:
  1. Полностью удаляем все объекты со сцены
  2. Создаём новые на основе образов текущего шага

  // - Переход к Предыдущиму шагу происходит так:
  1. В счётчике текущего шага Отнимаем единицу, упор - не меньше нуля
  2. Считываем шаг с контроллера

  // - Переход к Следующему шагу происходит так:
  1. В счётчике текущего шага Прибавляем единицу, упор - не больше уже сделанных шагов
  2. Считываем шаг с контроллера

  // - Удаление объекта происходит про принципу:
  1. Выделенные объекты удаляем.
  2. Сохраняем шаг.

  // - Копирование объектов происходит так:
  1. Проверим наличие объектов вообще, иначе ничего не делаем
  2. Узнаем количество выбранных объектов
  3. Выделим память на образы копируемых объектов
  4. Заполним образы
  5. Снимим все выделения с объектов
  6. Создадим требуемые копии объектов
  7. Сделаем эти объекты выделеными
  8. Сохраняем шаг

  Ну вот собственно это пока всё что удалось сделать за полторы недели. У меня это получилось уложить в 1000 строк кода. Знаю что может показаться много, но я пока не научился срезать углы.
 

Комментариев нет:

Отправить комментарий