2008-08-11 33 views
5

He hecho muchas partes separadas de un sistema GUI para Nintendo DS, como botones y cuadros de texto y cuadros de selección, pero necesito una forma de contener estas clases en una clase Gui, para que pueda dibujar todo en la pantalla todo a la vez, y comprueba todos los botones a la vez para comprobar si se están presionando. Mi pregunta es ¿cuál es la mejor manera de organizar todas las clases (como botones y cuadros de texto) en una clase de GUI?¿Cómo hago una GUI?

He aquí una manera pensé, pero no me parece bien:

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 yo sólo quería darle una idea de lo que quiero.

+3

Corrija el título para ser más específico, por favor. Suena como una pregunta de "ayuda al vampiro" ("¿Cómo hago un foro?"), Aunque si lees la pregunta, es un poco más específico. –

+0

Es posible que desee considerar una técnica [modo inmediato GUI] (http://sol.gfxile.net/imgui/) para esa plataforma en particular. –

Respuesta

2

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

He estado jugando con algo por un tiempo, he consultado algunos libros y VTMs, y hasta ahora esta es una idea aproximada de un simple sistema de interfaz de usuario.

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 princple es crear una ventana y attact elementos de la interfaz a la misma, y ​​llamar a los métodos de dibujo y actualización de 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 de envoltura para OpenGL y psp gu.

Espero que esto ayude.

thing2k

0

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

0

Creo que mirar la forma en que lo han hecho otros toolkits de GUI sería un excelente lugar para comenzar. Para ejemplos de C++, escucho muchas cosas buenas sobre Qt. No lo he usado personalmente sin embargo. Y, por supuesto, WxWidgets como mencionó Nick.

0

He escrito una interfaz gráfica muy sencilla al igual que usted propone. Lo tengo funcionando en Windows, Linux y Macintosh. Debería conectarse con relativa facilidad a cualquier sistema como PSP o DS.

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

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

3

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

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

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

Si no lo hace apoyo esta en la clase base, se encontrará con grandes problemas cuando intenta poner en práctica algo más complejo que un cuadro de texto y un botón. Por ejemplo:

  • Las barras de tabulación se pueden modelar como botones múltiples agrupados en un solo elemento de UI principal que impone exclusividad mutua de selección;
  • Grupos de botones de radio (ídem);
  • Las barras de desplazamiento se pueden representar como un elemento deslizante/canaleta y botones arriba/abajo;
  • Las listas de desplazamiento se pueden representar como un contenedor y varios elementos de la IU de opciones.

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

he detallado de 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 ocurrió para volver a dibujar la pantalla, que es la parte más delicada de creando una GUI (uno simplemente divide rectángulos y recuerda regiones visibles, el otro usa árboles BSP, que es mucho más eficiente y más fácil de entender), consejos para la optimización, etc.

+0

Sí, he oído hablar de Woopsi, lo echaré un vistazo más de cerca. También gracias por el enlace a tu blog, se ve interesante :) –