Question

J'ai créé de nombreuses parties distinctes d'un système GUI pour la Nintendo DS, comme des boutons, des zones de texte et des zones de sélection, mais j'ai besoin d'un moyen de contenir ces classes dans une seule classe Gui, afin de pouvoir tout dessiner à l'écran en même temps. une fois et vérifiez tous les boutons en même temps pour vérifier si certains sont enfoncés.Ma question est la suivante : quelle est la meilleure façon d'organiser toutes les classes (telles que les boutons et les zones de texte) en une seule classe GUI ?

Voici une solution à laquelle j'ai pensé mais qui ne semble pas correcte :

Modifier: J'utilise 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;
}

Ce code présente quelques problèmes, mais je voulais juste vous donner une idée de ce que je veux.

Était-ce utile?

La solution

Cette question est très similaire à celle que j'allais poster, seule la mienne concerne la programmation Sony PSP.

Cela fait un moment que je joue avec quelque chose, j'ai consulté des livres et VTM, et jusqu'à présent, il s'agit d'une idée approximative d'un système d'interface utilisateur simple.

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();
    ...
}

Le principe est de créer une fenêtre et d'y attacher des éléments ui, et d'appeler les méthodes draw et update à partir des fonctions principales respectives.

Je n'ai encore rien qui fonctionne, car j'ai des problèmes avec le code de dessin.Avec différentes API sur PC et PSP, je recherche du code wrapper pour OpenGL et psp gu.

J'espère que cela t'aides.

truc2k

Autres conseils

Pour tous ceux que cela intéresse, voici ma boîte à outils GUI open source sous licence BSD pour DS :

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

La réponse de thing2k est plutôt bonne, mais je recommanderais sérieusement d'avoir du code pour contenir des éléments d'interface utilisateur enfants dans la classe de base uiElement.C'est le modèle que j'ai suivi dans Woopsi.

Si tu ne le faites pas Si vous prenez en charge cela dans la classe de base, vous rencontrerez des problèmes majeurs lorsque vous tenterez d'implémenter quelque chose de plus complexe qu'une zone de texte et un bouton.Par exemple:

  • Les barres d'onglets peuvent être modélisées sous la forme de plusieurs boutons regroupés dans un seul élément d'interface utilisateur parent qui impose l'exclusivité mutuelle de la sélection ;
  • Groupes de boutons radio (idem) ;
  • Les barres de défilement peuvent être représentées comme un élément de curseur/gouttière et des boutons haut/bas ;
  • Les listes déroulantes peuvent être représentées sous la forme d'un conteneur et de plusieurs éléments d'interface utilisateur à options.

En outre, il convient de rappeler que le DS dispose d'un processeur à 66 MHz et de 4 Mo de RAM, qui sont utilisés à la fois pour stocker votre programme et pour l'exécuter (les ROM DS sont chargées dans la RAM avant d'être exécutées).Vous devriez vraiment le traiter comme un système embarqué, ce qui signifie que le STL est sorti.J'ai supprimé le STL de Woopsi et j'ai réussi à économiser 0,5 Mo.Pas beaucoup par rapport aux normes d'un ordinateur de bureau, mais cela représente 1/8ème de la mémoire totale disponible de la DS consommée par les fichiers STL.

J'ai détaillé l'ensemble du processus d'écriture de l'interface utilisateur sur mon blog :

http://ant.simianzombie.com/blog

Il comprend des descriptions des deux algorithmes que j'ai proposés pour redessiner l'écran, ce qui est la partie la plus délicate de la création d'une interface graphique (il suffit de diviser les rectangles et de mémoriser les régions visibles ;l'autre utilise des arbres BSP, beaucoup plus efficaces et plus faciles à comprendre), des conseils d'optimisation, etc.

Une stratégie utile à garder à l’esprit pourrait être la motif composite.À un niveau bas, cela pourrait vous permettre de traiter plus facilement tous les objets GUI (et collections d'objets) une fois construits.Mais je n'ai aucune idée de ce qu'implique la conception d'un framework GUI, donc un endroit où trouver une inspiration générale est le code source d'un projet existant. WxWidgets est un framework GUI multiplateforme avec des sources disponibles.Bonne chance pour votre projet!

Je pense que regarder la façon dont d’autres boîtes à outils GUI l’ont fait serait un excellent point de départ.Pour les exemples C++, j'entends beaucoup de bonnes choses à propos de Qt.Cependant, je ne l'ai pas utilisé personnellement.Et bien sûr WxWidgets comme Nick l'a mentionné.

J'ai écrit une interface graphique très simple, comme vous le proposez.Je l'utilise sous Windows, Linux et Macintosh.Il devrait également être porté relativement facilement sur n'importe quel système comme la PSP ou la DS.

C'est open-source, LGPL et se trouve ici :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top