8

ボタン、テキストボックス、セレクトボックスなど、ニンテンドーDS用のGUIシステムのさまざまな部分を作成しましたが、これらのクラスを1つのGuiクラスに含める方法が必要です。一度、すべてのボタンを一度にチェックして、押されているかどうかを確認します。私の質問は、すべてのクラス (ボタンやテキスト ボックスなど) を 1 つの GUI クラスに編成する最良の方法は何ですか?

これが私が考えた1つの方法ですが、正しくないようです:

編集: 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;
}

このコードにはいくつか問題があります。

4

5 に答える 5

3

この質問は、私が投稿しようとしていた質問と非常によく似ています。私の質問は、SonyPSPプログラミングに関するものだけです。

私はしばらくの間何かをいじっていて、いくつかの本やVTMを調べてきましたが、これまでのところ、これは単純なUIシステムの大まかなアイデアです。

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

原則として、ウィンドウを作成し、それにui要素を追加し、それぞれのメイン関数からdrawメソッドとupdateメソッドを呼び出します。

コードの描画に問題があるため、まだ何も機能していません。PCとPSPで異なるAPIを使用して、OpenGLとpspguのラッパーコードを調べています。

お役に立てれば。

things2k

于 2008-08-16T22:05:03.323 に答える
3

興味のある方のために、DS 用のオープン ソースで BSD ライセンスの GUI ツールキットを以下に示します。

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

thing2k の答えはかなり良いですが、基本の uiElement クラスに子 UI 要素を含めるコードを用意することを真剣にお勧めします。これは、私が Woopsi で従ったパターンです。

基本クラスでこれをサポートしない場合、テキスト ボックスとボタンよりも複雑なものを実装しようとすると、大きな問題が発生します。例えば:

  • タブ バーは、選択の相互排他性を強制する単一の親 UI 要素にグループ化された複数のボタンとしてモデル化できます。
  • ラジオ ボタン グループ (同上);
  • スクロール バーは、スライダー/ガター要素とアップ/ダウン ボタンとして表すことができます。
  • スクロール リストは、コンテナーと複数のオプション UI 要素として表すことができます。

また、DS には 66MHz の CPU と 4MB の RAM があり、プログラムの保存と実行の両方に使用されることも覚えておく価値があります (DS ROM は実行前に RAM にロードされます)。あなたは本当にそれを組み込みシステムとして扱うべきです。つまり、STL はアウトです。Woopsi から STL を削除し、なんとか 0.5MB 節約できました。デスクトップの標準ではそれほど多くはありませんが、これは STL ジャンクによって消費される DS の使用可能なメモリの合計の 1/8 です。

UI を作成するプロセス全体については、ブログで詳しく説明しています。

http://ant.simianzombie.com/blog

画面を再描画するために私が思いついた 2 つのアルゴリズムの説明が含まれています。これは、GUI を作成する上で最も難しい部分です (1 つは四角形を分割して可視領域を記憶するだけで、もう 1 つは BSP ツリーを使用するため、はるかに効率的で簡単に作成できます)。理解する)、最適化のヒントなど。

于 2008-10-10T17:39:53.867 に答える
0

覚えておくと便利な戦略の1つは、複合パターンです。低レベルでは、一度構築すると、すべてのGUIオブジェクト(およびオブジェクトのコレクション)をより簡単に処理できる場合があります。しかし、GUIフレームワークの設計に何が関係しているのかわからないため、一般的なインスピレーションを見つける1つの場所は、既存のプロジェクトのソースコードです。WxWidgetsは、ソースが利用可能なクロスプラットフォームのGUIフレームワークです。あなたのプロジェクトで頑張ってください!

于 2008-08-11T04:11:02.087 に答える
0

他のGUIツールキットがどのように機能しているかを見ると、開始するのに最適な場所になると思います。C ++の例では、 Qtについて多くの良い点を聞いています。個人的には使ったことがありません。そしてもちろん、ニックが述べたようにWxWidgets。

于 2008-08-11T04:21:49.663 に答える
0

あなたが提案したように、私は非常に単純なGUIを書きました。Windows、Linux、および Macintosh で実行しています。PSP や DS などのシステムにも比較的簡単に移植できるはずです。

これはオープンソースの LGPL で、次の場所にあります。

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

于 2008-09-16T23:35:57.870 に答える