Guiber Prototype

Что такое Guiber? Это Graphic User Interface Builder. Точнее, это всего-лишь прототип и попытка решить одну маленькую проблему, которую я заметил уже не в одном проекте.
Как вы собираете интерфейс? Точнее, как вы подбираете координаты для элементов/картинок/кнопок/текстовых полей и т.п.? Я видел и xml-файл(или любой другой конфигурационный файл), который программист заполняет вручную и потом некий класс на основании этого располагает элементы, пробовал и создание gui в Flash IDE и потом уже «натягивание» функционала в коде, которое тоже далеко не идеально, видел и задание значений x/y вручную прямо в коде. Xml и ручное введение равным образом имеют негативную сторону — нужно каждый раз запускать и «прицеливаться» чтобы построить интерфейс. Во Flash IDE, конечно, можно делать интерфейс, но в этом подходе есть ряд мелкий недостатков. Возможно есть и четвертый и пятый метод, о котором я не знаю. Но у меня (и не у меня одного) нет никакого желания вместо того, чтобы создавать информационные решения подбирать координаты x и y для элементов интерфейса. (Я сейчас не говорю о Flex).

Этот пост написан в основном, чтобы получить фидбек и узнать, насколько подобное решение будет кому-то полезно.
Итак, что делает Guiber.
Guiber получает на вход swc-библиотеки, позволяет расположить элементы и генерирует as3/xml расположения этих элементов. Т к. это прототип, делается это все очень примитивно и урезанно.

Рассмотрим пример. Путь у нас будет библиотека с 4 элементами:


Создадим swc-файл AssetsLibrary.swc:

package {
        public class Assets {
                [Embed(source="../assets/background.png")]
                public var BackgroundAsset:Class;

                [Embed(source="../assets/blueButton.png")]
                public var BlueButtonAsset:Class;

                [Embed(source="../assets/orangeButton.png")]
                public var OrangeButtonAsset:Class;

                [Embed(source="../assets/closeButton.png")]
                public var CloseButtonAsset:Class;

        }
}

Теперь этот файл нужно положить в папку swc в папке Guiber'а. Запускаем Guiber и нажимаем Load SWC и располагаем элементы.


После этого остается только нажать Project->Generate AS3 code и мы получим сгенерированный код:



package com.guiber.assets {
        import flash.display.Sprite;
        public class UnknownAsset extends Sprite {
                        public function UnknownAsset() {
                                super();
                                init();
                        }
                        
                        public function init():void {
                                // instance460
                                var instance460:Assets_BackgroundAsset = new Assets_BackgroundAsset();
                                instance460.name = "instance460";
                                instance460.x = 1;
                                instance460.y = 81;
                                addChild(instance460);
                                
                                // instance491
                                var instance491:Assets_BlueButtonAsset = new Assets_BlueButtonAsset();
                                instance491.name = "instance491";
                                instance491.x = 15;
                                instance491.y = 252;
                                addChild(instance491);
                                
                                // instance522
                                var instance522:Assets_OrangeButtonAsset = new Assets_OrangeButtonAsset();
                                instance522.name = "instance522";
                                instance522.x = 170;
                                instance522.y = 252;
                                addChild(instance522);
                                
                                // instance553
                                var instance553:Assets_CloseButtonAsset = new Assets_CloseButtonAsset();
                                instance553.name = "instance553";
                                instance553.x = 283;
                                instance553.y = 96;
                                addChild(instance553);
                                
                        }
        }
}


На этом действия прототипа заканчивается. Спасибо всем за внимание. Жду с нетерпением feedback!
  • +2

Комментарии (9)

0
Передо мной то же такая проблема стояла, как распологать элементы гуи, тем более, что я не использую Flash IDE, решил ее так же.
Есть некий редактор, который берет все изображения из файла ресурсов и предоставляет возможность их расположить, после генерит xml файл.
+2
А я так и не понял чем этот способ лучше чем расстановка менюшек/кнопок в IDE?
Зачем мне код с позициями кнопок, если я их и так руками расставляю?
+1
Да, хотелось бы услышать про минусы проектирования GUI во Flash IDE. Я так понимаю Guiber GUI с анимацией делать не умеет. А если не умеет, то для игр малопригоден.
+1
Ну не все вообще пользуются этой IDE.
0
Мне очень нравится задавать позиции элементов в коде, но не по координатам, а с помощью всяких вспомогательных классов, которые автоматом распределяют элементы. Пример таких классов — VBox и HBox из minimalcomps (http://www.minimalcomps.com/oldsite/). Этих впрочем не вполне достаточно, но для большинства простых случаев более чем. Кстати можно посмотреть там еще minimal designer, если не видел www.bit-101.com/MinimalDesigner/

С ГУИ варианта по сути на мой взгляд два:
1) Либо это просто набор кнопок более равномерно расположенных по экрану и что-то на заднем фоне. Для этого случая городить огород вообще не надо. Хватит VBox, HBox (их и самому для себя сделать не сложно).

2) Гуи сложное, со взаимозависимостями между состояниями элементов, с привязкой разных анимаций к действиям пользователя. Это уже ИМХО только ручками делается, но рисовать в чем-то сами картинки надо так или иначе. Но самописный универсальный тул не сделаешь ИМХО проще по месту что-то дописывать. Или делать это в ИДЕ.
0
Собственно описание automatic layout от msdn.microsoft.com/en-us/library/ms748828.aspx это реализация от микрософта, но она вполне дает представление о том, как это делается. Добавлю еще, что все это надо сразу разбавлять возможностью перевода текста.
0
Должно быть очень даже удобно, я бы посоветовал дополнить стандартные поля (класс, х, у) каким нибудь специальным юзерским полем-таблицей в которой юзер сам сможет создавать пары ключ-значение.
что если я захочу определенную кнопку сделать неактивной задав ей свойство enabled=false
Можно вместо динамических полей записывать шаблон необходимых полей для каждого класса гденибудь рядышком в swc:

[Embed(source="../assets/background.png")]
public var BackgroundAsset:Class;

//а где-то ниже задать 

{input1:"enabled", input2:"rotation"};

чтобы редактор сам генерировал нужные поля (enabled и rotation) для нужного объекта когда этот объект становится активным
0
Т.к. львиная доля нашей работы как раз и состоит в постройке интерфейсов, перепробовал разные варианты. Для меня сборка в флэше и обработка в коде с подключением вспомогательных классов — самый удобный вариант. Нужен скроллер? Кидаем в мувик контейнер, маску, скроллбар и бегунок, задаем местоположение и размеры, а затем этот мувик скармливаем скролл-классу. Набор кнопок, полей вывода, чекбоксов и комбобоксов? Пожалуйста. Рядом же любые валидаторы и все что нужно. Собственно, вся работа заключается в верном именовании объектов и расположении их на сцене.
+4
Абсолютное позиционирование — зло, художник поменял размер кнопки, и опять у всех элементов ручками координаты перебивать? В меню уровней ручками для 50 кнопок координаты вбивать? Если реализовать программно горизонтальное (left|center|right|justify) и вертикальное выравнивание объектов по родительскому контейнеру, и поддержку отступов на манер CSS (border|margin), то вручную вбивать практически ничего не придется. Можно это и в редакторе реализовать, но если сделать в коде, то можно будет очень просто работать с объектами с динамическими размерами, например при динамической локализации этого самого UI.

Ну, а если элементы UI не стандартизированы, то сам бог велел, фигачить их в IDE.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.