문제

나는 버튼, 텍스트 상자, 선택 상자 등 Nintendo DS용 GUI 시스템의 다양한 개별 부분을 만들었지만 모든 것을 화면에 모두 그릴 수 있도록 이러한 클래스를 하나의 Gui 클래스에 포함하는 방법이 필요합니다. 한 번에 모든 버튼을 동시에 확인하여 어떤 버튼이 눌려져 있는지 확인하세요.내 질문은 모든 클래스(예: 버튼 및 텍스트 상자)를 하나의 GUI 클래스로 구성하는 가장 좋은 방법은 무엇입니까?

내가 생각한 한 가지 방법이 있지만 옳지 않은 것 같습니다.

편집하다: 저는 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

다른 팁

관심 있는 분들을 위해 공개 소스, BSD 라이센스를 갖춘 DS용 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를 만드는 데 가장 까다로운 부분입니다. 하나는 직사각형을 분할하고 보이는 영역을 기억하는 것입니다.다른 하나는 훨씬 더 효율적이고 이해하기 쉬운 BSP 트리, 최적화 팁 등을 사용합니다.

명심해야 할 유용한 전략 중 하나는 복합 패턴.낮은 수준에서는 일단 구축된 모든 GUI 개체(및 개체 모음)를 더 쉽게 처리할 수 있습니다.하지만 GUI 프레임워크 디자인에 무엇이 관련되어 있는지 전혀 모르기 때문에 일반적인 영감을 얻을 수 있는 곳 중 하나는 기존 프로젝트의 소스 코드입니다. WxWidget 소스를 사용할 수 있는 크로스 플랫폼 GUI 프레임워크입니다.프로젝트에 행운이 있기를 바랍니다!

나는 다른 GUI 툴킷이 수행한 방식을 살펴보는 것이 훌륭한 시작점이 될 것이라고 생각합니다.C++ 예제의 경우 좋은 점을 많이 들었습니다. Qt.하지만 개인적으로 사용해본 적은 없습니다.물론 Nick이 언급한 WxWidgets도 있습니다.

나는 당신이 제안한 것처럼 매우 간단한 GUI를 작성했습니다.저는 Windows, Linux, Macintosh에서 실행하고 있습니다.PSP나 DS와 같은 시스템에도 비교적 쉽게 이식할 수 있습니다.

오픈 소스인 LGPL이며 여기에 있습니다:

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top