Вопрос

Я создал много различных отдельных частей системы графического интерфейса для Nintendo DS, таких как кнопки, текстовые поля и поля выбора, но мне нужен способ объединить эти классы в один класс графического интерфейса, чтобы я мог рисовать все на экране в любое время. один раз и проверьте все кнопки одновременно, чтобы проверить, нажимаются ли какие-либо из них.Мой вопрос: как лучше всего организовать все классы (например, кнопки и текстовые поля) в один класс графического интерфейса?

Вот один из способов, о котором я думал, но он кажется неправильным:

Редактировать: Я использую С++.

class Gui {
    public:
        void update_all();
        void draw_all() const;
        int add_button(Button *button); // Returns button id
        void remove_button(int button_id);
    private:
        Button *buttons[10];
        int num_buttons;
}

В этом коде есть несколько проблем, но я просто хотел дать вам представление о том, чего я хочу.

Это было полезно?

Решение

Этот вопрос очень похож на тот, который я собирался опубликовать, только мой вопрос касается программирования Sony PSP.

Я некоторое время с чем-то экспериментировал, сверился с некоторыми книгами и ВТМ, и пока это грубое представление о простой UI-системе.

class uiElement()
{
    ...
    virtual void Update() = 0;
    virtual void Draw() = 0;
    ...
}

class uiButton() public : uiElement
{
    ...
    virtual void Update();
    virtual void Draw();
    ...
}

class uiTextbox() public : uiElement
{
    ...
    virtual void Update();
    virtual void Draw();
    ...
}

... // Other ui Elements

class uiWindow()
{
    ...
    void Update();
    void Draw();

    void AddElement(uiElement *Element);
    void RemoveElement(uiElement *Element);

    std::list <uiElement*> Elements;

    ...
}

void uiWindow::Update()
{
    ...
    for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
        it->Update();
    ...
}

void uiWindow::Draw()
{
    ...
    for (list <uiElement*>::iterator it = Elements.begin(); it != Elements.end(); it++ )
        it->Draw();
    ...
}

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

У меня пока ничего не работает, так как у меня проблемы с отрисовкой кода.Имея разные API на ПК и PSP, я ищу какой-нибудь код-оболочку для OpenGL и psp гу.

Надеюсь это поможет.

вещь2к

Другие советы

Для всех, кому интересно, вот мой набор инструментов GUI с открытым исходным кодом, лицензированный BSD, для DS:

http://www.sourceforge.net/projects/woopsi

Ответthing2k довольно хорош, но я бы серьезно рекомендовал иметь код для содержания дочерних элементов пользовательского интерфейса в базовом классе uiElement.Этому образцу я следовал в Woopsi.

Если вы не поддержите это в базовом классе, вы столкнетесь с серьезными проблемами, когда попытаетесь реализовать что-то более сложное, чем текстовое поле и кнопка.Например:

  • Панели вкладок можно смоделировать как несколько кнопок, сгруппированных в один родительский элемент пользовательского интерфейса, который обеспечивает взаимоисключаемость выбора;
  • Группы радиокнопок (то же самое);
  • Полосы прокрутки могут быть представлены в виде элемента ползунка/переплета и кнопок вверх/вниз;
  • Прокручиваемые списки могут быть представлены в виде контейнера и элементов пользовательского интерфейса с несколькими опциями.

Кроме того, стоит помнить, что DS имеет процессор с частотой 66 МГц и 4 МБ оперативной памяти, которая используется как для хранения вашей программы, так и для ее выполнения (диски DS ROM загружаются в оперативную память перед запуском).На самом деле вам следует относиться к нему как к встроенной системе, а это означает, что STL отсутствует.Я удалил STL из Woopsi и сумел сэкономить 0,5 МБ.Не так много по стандартам настольных компьютеров, но это 1/8 от общего объема доступной памяти DS, потребляемой мусором STL.

Я подробно описал весь процесс написания пользовательского интерфейса в своем блоге:

http://ant.simianzombie.com/блог

Он включает описания двух алгоритмов, которые я придумал для перерисовки экрана, что является самой сложной частью создания графического интерфейса (один просто разбивает прямоугольники и запоминает видимые области;другой использует деревья BSP, что гораздо эффективнее и проще для понимания), советы по оптимизации и т. д.

Одной из полезных стратегий, которую следует иметь в виду, может быть составной узор.На низком уровне это может позволить вам легче обрабатывать все объекты графического интерфейса (и коллекции объектов) после их создания.Но я понятия не имею, что включает в себя проектирование инфраструктуры графического пользовательского интерфейса, поэтому общее вдохновение можно найти в исходном коде существующего проекта. WxВиджеты — это кроссплатформенная среда графического пользовательского интерфейса с доступным исходным кодом.Удачи с вашим проектом!

Я думаю, что посмотреть на то, как это сделали другие наборы инструментов для графического пользовательского интерфейса, было бы отличным началом.Что касается примеров C++, я слышал много хороших отзывов о Qt.Хотя лично я его не использовал.И, конечно же, WxWidgets, как упомянул Ник.

Я написал очень простой графический интерфейс, как вы предлагаете.У меня он работает на Windows, Linux и Macintosh.Его также можно относительно легко перенести на любую систему, например PSP или DS.

Это с открытым исходным кодом, LGPL, и он находится здесь:

http://code.google.com/p/kgui/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top