Я сделал много разных отдельных частей системы графического интерфейса для Nintendo DS, таких как кнопки, текстовые поля и поля выбора, но мне нужен способ содержания этих классов в одном классе Gui, чтобы я мог рисовать все на экране в любой момент. один раз и проверьте сразу все кнопки, чтобы проверить, не нажаты ли какие-либо. У меня вопрос: как лучше всего организовать все классы (например, кнопки и текстовые поля) в один класс графического интерфейса?
Вот один из способов, который я придумал, но он кажется неправильным:
Редактировать: Я использую C++.
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;
}
В этом коде есть несколько проблем, но я просто хотел дать вам представление о том, чего я хочу.
Вы можете рассмотреть метод графический интерфейс немедленного режима для этой конкретной платформы.





Одной из полезных стратегий, о которых следует помнить, может быть составной узор. На низком уровне это может позволить вам легче обрабатывать все объекты графического интерфейса (и коллекции объектов) после создания. Но я понятия не имею, что задействовано в разработке фреймворка графического интерфейса, поэтому одно из мест, где можно найти общее вдохновение, - это исходный код существующего проекта. WxWidgets - это кроссплатформенный графический интерфейс с доступным исходным кодом. Удачи тебе с твоим проектом!
Я думаю, что если посмотреть на то, как работают другие инструменты графического интерфейса, это будет отличным местом для начала. Что касается примеров C++, я слышал много хороших отзывов о Qt. Хотя лично я им не пользовался. И, конечно же, WxWidgets, как сказал Ник.
Этот вопрос очень похож на тот, который я собирался опубликовать, только мой касается программирования Sony PSP.
Я какое-то время играл с чем-то, я проконсультировался с некоторыми книгами и VTM, и пока это приблизительное представление о простых системах пользовательского интерфейса.
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 gu.
Надеюсь это поможет.
вещь2к
Я написал очень простой графический интерфейс, как вы предлагаете. У меня он работает в Windows, Linux и Macintosh. Он должен относительно легко переноситься на любую систему, такую как PSP или DS.
Он с открытым исходным кодом, LGPL и находится здесь:
Для всех, кому интересно, вот мой набор инструментов GUI с открытым исходным кодом для DS с лицензией BSD:
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/blog
Он включает в себя описания двух алгоритмов, которые я придумал для перерисовки экрана, что является самой сложной частью создания графического интерфейса (один просто разбивает прямоугольники и запоминает видимые области; другой использует деревья BSP, что намного эффективнее и проще в использовании. понять), советы по оптимизации и т. д.
Да, я слышал о Вупси, я посмотрю на него поближе. Также спасибо за ссылку на свой блог, интересно смотрится :)
Исправьте ваш заголовок, чтобы быть более конкретным, пожалуйста. Это звучит как вопрос «помочь вампиру» («Как мне создать форум?»), Хотя, если вы читаете вопрос, он более конкретен.