Pergunta

Eu criei muitas partes separadas de um sistema GUI para o Nintendo DS, como botões, caixas de texto e caixas de seleção, mas preciso de uma maneira de conter essas classes em uma classe Gui, para poder desenhar tudo na tela ao mesmo tempo. uma vez e verifique todos os botões de uma vez para verificar se algum está sendo pressionado.Minha pergunta é qual é a melhor maneira de organizar todas as classes (como botões e caixas de texto) em uma classe GUI?

Aqui está uma maneira que pensei, mas não parece certa:

Editar: Estou 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 tem alguns problemas, mas eu só queria dar uma ideia do que quero.

Foi útil?

Solução

Essa pergunta é muito parecida com a que eu ia postar, só que a minha é para programação do Sony PSP.

Já faz algum tempo que estou brincando com alguma coisa, consultei alguns livros e VTMs, e até agora esta é uma ideia aproximada de um sistema de interface do usuário simples.

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

O princípio é criar uma janela e anexar elementos ui a ela, e chamar os métodos draw e update das respectivas funções principais.

Ainda não tenho nada funcionando, pois tenho problemas com o desenho do código.Com APIs diferentes no PC e no PSP, estou analisando alguns códigos wrapper para OpenGL e PSP gu.

Espero que isto ajude.

coisa2k

Outras dicas

Para quem estiver interessado, aqui está meu kit de ferramentas GUI de código aberto e licenciado por BSD para o DS:

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

A resposta do thing2k é muito boa, mas eu recomendo seriamente ter um código para conter elementos filhos da UI na classe base uiElement.Este é o padrão que segui no Woopsi.

Se você não suporte isso na classe base, você terá grandes problemas ao tentar implementar algo mais complexo do que uma caixa de texto e um botão.Por exemplo:

  • As barras de guias podem ser modeladas como vários botões agrupados em um único elemento de UI pai que impõe exclusividade mútua de seleção;
  • Grupos de botões de opção (idem);
  • As barras de rolagem podem ser representadas como um elemento deslizante/medianiz e botões para cima/para baixo;
  • As listas de rolagem podem ser representadas como um contêiner e vários elementos de interface do usuário de opções.

Além disso, vale lembrar que o DS possui uma CPU de 66 MHz e 4 MB de RAM, que é usada tanto para armazenar seu programa quanto para executá-lo (as ROMs do DS são carregadas na RAM antes de serem executadas).Você realmente deveria tratá-lo como um sistema embarcado, o que significa que o STL foi eliminado.Removi o STL do Woopsi e consegui economizar 0,5 MB.Não muito para os padrões de desktop, mas isso representa 1/8 da memória total disponível do DS consumida por lixo STL.

Detalhei todo o processo de escrita da UI em meu blog:

http://ant.simianzombie.com/blog

Inclui descrições dos dois algoritmos que criei para redesenhar a tela, que é a parte mais complicada da criação de uma GUI (basta dividir os retângulos e lembrar as regiões visíveis;o outro utiliza árvores BSP, que são muito mais eficientes e fáceis de entender), dicas de otimização, etc.

Uma estratégia útil a ter em mente pode ser a padrão composto.Em um nível baixo, pode permitir que você trate todos os objetos GUI (e coleções de objetos) mais facilmente depois de construídos.Mas não tenho ideia do que está envolvido no design da estrutura GUI, portanto, um lugar para encontrar inspiração geral é no código-fonte de um projeto existente. WxWidgets é uma estrutura GUI de plataforma cruzada com código-fonte disponível.Boa sorte com seu projeto!

Acho que observar a forma como outros kits de ferramentas GUI fizeram isso seria um excelente lugar para começar.Para exemplos de C++, ouço muitas coisas boas sobre Qt.Eu não usei isso pessoalmente.E, claro, WxWidgets como Nick mencionou.

Eu escrevi uma GUI muito simples, exatamente como você propõe.Eu tenho ele rodando em Windows, Linux e Macintosh.Ele também deve ser portado com relativa facilidade para qualquer sistema como PSP ou DS.

É de código aberto, LGPL e está aqui:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top