Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Niko

Frischling

  • »Niko« ist der Autor dieses Themas
  • Private Nachricht senden

1

07.05.2006, 02:26

frage zu eigenem GUI

Hi Leute,

ich übe gerade ein wenig und habe eine Frage.
Ich habe mir von nixda das Funny Break genommen und ein eigenes simples GUI dazu programmiert.
Dazu habe ich mir eine gui Klasse geschrieben und Klassen für Elemente wie z.B. Button, Checkboxen, ....

In der gui Klasse speichere ich nun in einer STL Map alle Elemente, welche die gui Klasse anlegt.

Dann mache ich in meiner gamestate.run() den Aufruf gui.prozess(), wobei nun die Map durchlaufen wird und jedes Element gerendert wird und abgefragt wird, ob das Element angeklickt wurde. Bei einem Klick, wird die Membervariable clicked_ auf true gesetzt.


danach frage ich in meiner gamestate.run() meine Elemente ab und reagiere auf die Klicks.

C-/C++-Quelltext

1
2
if (gui_->getButton(L"exit")->isClicked()) 
     manager_->setGamestate (factory::mainmenu);


und dieser letzte Teil gefällt mir gar nicht.
Gibt es noch eine andere Möglichkeit wie ich die Klicks verarbeiten kann?
Sowas wie ne Callback Funktion oder so?

Wenns geht nicht so viel Fachchinesisch ;)
Ich bin absoluter Noob :(

Anonymous

unregistriert

2

07.05.2006, 10:37

Tipp: Wenn Du eine gute GUI schreiben willst, schau Dir mal die GUI der Win32 API an ;)

Dort geht alles über Callbacks.

3

07.05.2006, 11:15

tjo du kannst bsw. das ganze einfach über

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Jetzt kannst du bsw nen enum mit allesn möglichen Msges machen oder einfach #define MSG_TEST odg ;)

void* MyClass::MessageHandler(unsigned int uiMsg, unsigned int uiID void* pParam) // dann die geüwnschten params... bsw Button ID usw

{
    // Hier dann bsw ein switch mit der id

    // switch(uiID)

    // {

    // ...

    // }

}

// Dann muss du allerdings in jede deiner GUI Klassen immer das Window angeben an das die Messages geschickt werden sollen.

// Das ganze zu benutzen ist dann sehr einfach.

pParentWnd->MessageHandler(MSG_TEST, ..., NULL);
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

4

07.05.2006, 11:55

Von Rückruffunktionen würd ich abraten, da man das schlecht mit Klassen benutzen kann. Man kann es aber so machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class GUIWindow
{
    ...
    virtual void GUIMessage(int Type...)=0;
    GUIWindow* pParent;
    ...
};
//zB.:

class GUIButton : public GUIWindow
{
    virtual void Move()
    {
       if(Maus gedrückt)
          pParent->GUIMessage(bla);
    }
    virtual void GUIMessage(){}//Ein Button selber hat keine weiteren GUIElemente. Bei zB einer Liste wäre das aber denkbar

};

Deine Stateklasse erbt dann auch von GUIWindow und kann GUIMessage überladen.

Ciao

ext

Treue Seele

  • Private Nachricht senden

5

07.05.2006, 12:00

Sagt dir Signal&Slot etwas? Vielleicht von QT oder GTKmm?
Mit Signal&Slots kannst du solche Events ganz leicht implementieren, du registrierst die Komponenten einfach für solch ein Event und wenn das eintrifft, wird ein Signal ausgelöst, das sämtliche Slots die bei dem Signal eingetragen sind darüber informiert (über den registrierten Callback - hier Slot genannt).

Ne sehr schöne Signal&Slot Implementierung findest du hier

Werbeanzeige