質問
ボタン、テキストボックス、セレクトボックスなど、Nintendo 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;
}
このコードにはいくつかの問題がありますが、私が望んでいることのアイデアを示したかっただけです。
解決
この質問は私が投稿しようとしていた質問と非常によく似ていますが、私の質問だけが Sony PSP プログラミングに関するものです。
しばらく何かをいじったり、本を読んだりして、 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 要素を関連付け、それぞれのメイン関数から描画メソッドと更新メソッドを呼び出すことです。
コードの描画に問題があるため、まだ何も機能していません。PC と PSP では API が異なるため、OpenGL と PSP GU のラッパー コードを検討しています。
お役に立てれば。
thing2k
他のヒント
興味のある方は、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
これには、GUI を作成する上で最も難しい部分である画面を再描画するために私が考え出した 2 つのアルゴリズムの説明が含まれています (1 つは長方形を分割して表示領域を記憶するだけです。もう 1 つは BSP ツリーを使用します。これははるかに効率的で理解しやすいものです)、最適化のヒントなど。
他の GUI ツールキットのやり方を参考にしてみると、始めるのに最適だと思います。C++ の例については、良いことをたくさん聞いています。 Qt. 。個人的には使ったことないけど。そしてもちろん、Nick が言った WxWidget もです。
あなたが提案したように、私は非常に単純なGUIを書きました。Windows、Linux、Macintosh で実行しています。PSP や DS などのシステムにも比較的簡単に移植できるはずです。
これはオープンソースの LGPL で、ここにあります。