Pregunta

He creado muchas partes separadas diferentes de un sistema GUI para Nintendo DS, como botones, cuadros de texto y cuadros de selección, pero necesito una forma de contener estas clases en una clase Gui, para poder dibujar todo en la pantalla al mismo tiempo. una vez y verifique todos los botones a la vez para verificar si alguno está presionado.Mi pregunta es ¿cuál es la mejor manera de organizar todas las clases (como botones y cuadros de texto) en una clase GUI?

Aquí hay una forma en la que pensé pero no parece correcta:

Editar: Estoy usando 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;
}

Este código tiene algunos problemas, pero sólo quería darte una idea de lo que quiero.

¿Fue útil?

Solución

Esta pregunta es muy similar a una que iba a publicar, sólo que la mía es para la programación de Sony PSP.

He estado jugando con algo por un tiempo, he consultado algunos libros y VTM, y hasta ahora esta es una idea aproximada de un sistema de interfaz de usuario 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();
    ...
}

El principio es crear una ventana y adjuntarle elementos de la interfaz de usuario, y llamar a los métodos de dibujo y actualización desde las respectivas funciones principales.

No tengo nada funcionando todavía, ya que tengo problemas con el código de dibujo.Con diferentes API en PC y PSP, estoy buscando un código contenedor para OpenGL y psp gu.

Espero que esto ayude.

cosa2k

Otros consejos

Para cualquiera que esté interesado, aquí está mi kit de herramientas GUI de código abierto con licencia BSD para DS:

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

La respuesta de thing2k es bastante buena, pero recomendaría seriamente tener un código que contenga elementos secundarios de la interfaz de usuario en la clase base uiElement.Este es el patrón que he seguido en Woopsi.

Si usted no admite esto en la clase base, se encontrará con problemas importantes cuando intente implementar algo más complejo que un cuadro de texto y un botón.Por ejemplo:

  • Las barras de pestañas se pueden modelar como múltiples botones agrupados en un único elemento principal de la interfaz de usuario que impone la exclusividad mutua de la selección;
  • Grupos de botones de opción (ídem);
  • Las barras de desplazamiento se pueden representar como un elemento deslizante/canal y botones arriba/abajo;
  • Las listas de desplazamiento se pueden representar como un contenedor y elementos de interfaz de usuario de múltiples opciones.

Además, vale la pena recordar que la DS tiene una CPU de 66 MHz y 4 MB de RAM, que se utiliza tanto para almacenar el programa como para ejecutarlo (las ROM de la DS se cargan en la RAM antes de ejecutarse).Realmente deberías tratarlo como un sistema integrado, lo que significa que el STL está descartado.Eliminé el STL de Woopsi y logré ahorrar 0,5 MB.No mucho para los estándares de escritorio, pero eso es 1/8 de la memoria total disponible del DS consumida por basura STL.

He detallado todo el proceso de escritura de la interfaz de usuario en mi blog:

http://ant.simianzombie.com/blog

Incluye descripciones de los dos algoritmos que se me ocurrieron para volver a dibujar la pantalla, que es la parte más complicada de crear una GUI (uno simplemente divide los rectángulos y recuerda las regiones visibles;el otro utiliza árboles BSP, que es mucho más eficiente y fácil de entender), consejos de optimización, etc.

Una estrategia útil a tener en cuenta podría ser la patrón compuesto.En un nivel bajo, podría permitirle tratar todos los objetos GUI (y colecciones de objetos) más fácilmente una vez creados.Pero no tengo idea de lo que implica el diseño del marco GUI, por lo que un lugar para encontrar inspiración general es en el código fuente de un proyecto existente. WxWidgets es un marco GUI multiplataforma con fuente disponible.¡Buena suerte con tu proyecto!

Creo que observar la forma en que lo han hecho otros kits de herramientas GUI sería un excelente lugar para comenzar.Para ejemplos de C++, escucho muchas cosas buenas sobre cuarto.Aunque personalmente no lo he usado.Y, por supuesto, WxWidgets como mencionó Nick.

He escrito una GUI muy simple tal como la que propones.Lo tengo ejecutándose en Windows, Linux y Macintosh.También debería adaptarse con relativa facilidad a cualquier sistema como PSP o DS.

Es de código abierto, LGPL y está aquí:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top