Вернемся к прошлому уроку. Если вы внимательно разбирали работу функции InfoPoint, то могли заметить использование "полей" которых нет в API. Это было в point.ecliptic и point.name. Весь секрет в написании AstroManta c использованием техники JavaBeans. Т.е. при использовании методов вроде getName и setName появляется возможность обращаться к name как к public полю. Т.е. если вернуться к прошлому уроку - эти обращения будут аналагично point.getEcliptic() и point.getName(). Аккуратней - именно как вызовы методов! Иногда вместо использования цепочки из x.getY().getZ().setA(data) наглядней (и компактней) использовать x.y.z.a = data, но это может и пораждать ошибки.

Сегодня начнем разбираться как отображать то что считается. Как вы уже сами знаете, главное окно AstroManta разделено на 2 части. С правой мы уже знакомы, это наша рабочая лошадка для вывода информации Info. Левая это единственный экземпляр класса ViewCharts - область для отрисовки карт. Забагая немного вперед скажу, что этот же объект принимает события от пользователя - например воздействия "мышкой". Загружайте файл с архивом, распаковывайте и запускайте start_2_1.bsh Смотрим что получилось:

 

Открываем файл и разбираемся. Первое что бросается в глаза, это отсутствие описания функции InfoPoint и вместо этого загрузка библиотеки из info/point.bsh. Эта библиотека содержит несколько расширенную версию нашей функции из прошлого урока. Одна из ее особенностей это именно не отображение информации точек которые скрыты. Функция PointSeptener пока без изменений. А вот дальше новая функция Zodiac. Как уже можно догадаться из названия - она готовит отрисовку знаков Зодиака. Происходит это следующим образом. Сначала в область отображения карт добавляется объект для отображения точек на эклиптике, через вызов addViewEcliptic, но полученный объект класса ViewEcliptic пока пустой. Отмечу, что объектов отображения карт может быть внутри области отображения произвольное количество. И размещаться они могут как угодно. Дальше в этой функции идет добавление знаков Зодиака через локальную функцию insert. Там создается объект знака и возвращается объект типа его отрисовки. Объект типа отрисовки это класс AstroPaint он содержит данные о цвете рисования, стиле линии итд. С помощью функции insert создаются все 12 знаков Зодиака и настраивается ширина поля Знаков и ширина полей карт. Пока ничего сложного. Теперь применение этого. Вызываем нашу функцию Zodiac и сохраним созданный объект. Он у нас уже вставлен в область отрисовки, но пока не расположен в нужном месте и не задан его размер (радиус). Что и делается в следующих строчках. Центр расчитываем из размеров нашей области отрисовки, а радиус берем так что-бы все влезло и небольшой запас. Заканчивается все так-же как в прошлом примере - созданием карты и точек в ней. Обратите внимание, что после запуска этого скрипта изображения точек так и не появились. Потому что область отрисовки карт на эклиптике пока про них ничего не знает.

Давайте еще немного поиграемся в этим примером. Если вы любопытный программист, у вас уже должен был возникнуть вопрос - а зачем функция insert возвращает объект типа отрисовки? А вот допустим вы захотели выделить цветом знаки, как это делается в некоторых программах. Поменяйте соответствующие строки на эти:

insert("Ar", 0,         30,     "pic/aries.png").setColor(0xFFFFFF);

insert("Cn", 90,        120,    "pic/cancer.png").setColor(0xFFFFFF);

insert("Li", 180,       210,    "pic/libra.png").setColor(0xFFFFFF);

insert("Cp", 270,       300,    "pic/capricorn.png").setColor(0xFFFFFF);

Перезапустите скрипт. В результате кардинальные знаки выделены белым цветом. Можно конечно передавать цвет как аргумент функции insert, но тогда это придется делать у всех знаков. Но вот и пришло время посмотреть на точки карты. Используем файл start_2_2.bsh:

Замечательно! Появились точки септенера и функция InfoPoint из библиотеки подхватила их изображения. Открываем скрипт, смотрим. Ну конечно-же, создание области отображения на эклиптику это довольно частая операция и она есть в библиотеке init/zodiac.bsh поэтому мы убрали наше определение и воспользовались этим фактом. Теперь вы знаете как устроена функция Zodiac и можете сами определять вид поля знаков - их цвета, изображения символов, размер. Для чего нужно просто создать файл data/init/zodiac.bsh и определить там функцию как мы уже делали.

Изменения коснулись нашей функции PointSeptener. Теперь там добавился второй аргумент - объект отображения карт. Функция insert после создания точки внутри карты, создает объект отображения этой точки внутри объекта отображения карт через вызов его метода addPlanet. Этот метод создает объект отрисовки, который отображает точку (любого класса, не только планету) в виде изображения, дополняет его текстом и на внутреннем круге рисует окружность соответствующего цвета. После создания этого объекта это все и просходит - настройка цвета текста, цвета и прозрачности маленькой окружности и ее размера. В качестве приятного бонуса в скрипте добавлено выставление текущего времени карты вызовом метода now у объекта с моментом карты и следующий расчет карты. Еще посмотрите в наш обработчик onEdit - там появился расчет всех карт (у нас она одна) и перерисовка всей области отрисовки карт. Это нужно делать явно - часто это помогает ускорить работу если не перерисовывать когда расчеты еще не все совершены. Или пересчитывать только изменившиеся карты.

Метод addPlanet добавляет отрисовку точки в виде символа планеты. Как еще можно отрисовать точку? Например в виде линии внутри поля карты. Пригодится для отображения куспид домой и осей. Попробуем! Грузим файл start_2_3.bsh:

Открываем файл и снова отмечаем, что очередная функция перекочевала в библиотеку. На этот раз мы избавились от PointSeptener. Зато появилась аналогичная PointHouse. Работает она так же. Сначала создается точка внутри карты с помощью метода addHouseCusp, а затем добавляется объект для отрисовки с помощью метода addInside.

Ну и в качестве заключительного улучшения вида нашей карты, давайте повернем ее куспидом первого дома в начало. Загружаем start_2_4.bsh:

Заметили да, что исчезла функция PointHouse? Да, и она есть в библиотеках, и ее можно переопределять. Как же меняется начало отсчета у области отображения карт? Через вызов метода setStart. Обратите внимание - именно выбранного объекта отображения. Т.е. можно отрисовывать несколько наборов карт с разными точками отсчета. В этот метод передается объект любой точки из любой карты. В нашем примере мы получаем объект через поиск точки по имени с помощью метода getSpot нашей единственной карты.

На сегодня все. Поэкспериментируйте с примерами из этого урока. Например переопределите вид зодиака. Или создайте куспиды домов которые рисуются снаружи поля со знаками Зодиака. Подскажу - одна точка карты может иметь несколько объектов для отрисовки. В общем-то сколько угодно или, как мы уже убедились, ни одной. В следующем уроке нас ожидает прорыв в расчетах - мы будем разбираться как создавать точки, которые расчитываются по нашим правилам (например жребии).

У вас нет прав чтобы комментировать