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

1

15.07.2009, 20:52

Problem mit GUI und Cursor

Hallo, ich habe die GUI die im Buck beim 2. Spiel erklärt versucht in mein Spiel einzubauen. Ich habe allerdings mit dem Cursor das Problem, dass die Mausposition und die tatsächliche Klick Position nicht übereinstimmen. Hab auch schon versucht den HotSpot zu ändern aber kriegs nich genau hin. Nun wollte ich einfach den normalen Windows Cursor benutzen, da der immer genau klickt. Also:

C-/C++-Quelltext

1
ShowCursor(TRUE);


und die cursor relevanten Stellen beim Erstellen der GUI auskommentiert:

Hier das Erstellen der GUI:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    m_GUISkin.pSkinTexture          = tbTextureManager::Instance().GetTexture("Data\\GUI.bmp", TRUE, D3DX_DEFAULT, D3DX_DEFAULT, 1, D3DFMT_UNKNOWN, 0, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_XRGB(255, 0, 255));
    m_GUISkin.pEffect               = new tbEffect; m_GUISkin.pEffect->Init("Data\\GUI.fx"); m_GUISkin.pEffect->GetEffect()->SetTexture("Texture", m_GUISkin.pSkinTexture);
    m_GUISkin.pFont                 = g_pDXTest->m_pFont2;
    /*m_GUISkin.vCursorSize         = tbVector2(35.0f, 35.0f);
    m_GUISkin.CursorColor1          = tbColor(1.0f, 1.0f, 1.0f, 0.75f);
    m_GUISkin.CursorColor2          = tbColor(1.0f, 1.0f, 1.0f, 0.75f);
    m_GUISkin.vCursorHotSpot        = tbVector2(4.0f, 4.0f);
    m_GUISkin.fCursorSpeed          = 300.0f;*/
    m_GUISkin.EnabledColor          = tbColor(1.0f, 1.0f, 1.0f, 0.5f);
    m_GUISkin.DisabledColor         = tbColor(1.0f, 1.0f, 1.0f, 0.25f);
    m_GUISkin.HighlightColor        = tbColor(1.0f, 1.0f, 1.0f, 0.75f);
    m_GUISkin.vTextSize             = tbVector2(1.0f);
    m_GUISkin.EnabledTextColor      = tbColor(1.0f, 1.0f, 1.0f, 0.75f);
    m_GUISkin.DisabledTextColor     = tbColor(1.0f, 1.0f, 1.0f, 0.25f);
    m_GUISkin.HighlightTextColor    = tbColor(1.0f, 1.0f, 1.0f, 1.0f);

    if(m_GUISkin.pSkinTexture == NULL)  TB_ERROR("Fehler beim Laden der Skin-Textur für die Benutzeroberfläche!", TB_ERROR);

    // Benutzeroberfläche erstellen

    m_pGUI = new tbGUI;
    if(m_pGUI->Init(&m_GUISkin, GameMsgProc,
                    tbVector2(800.0f, 600.0f),
                    tbDirect3D::Instance().GetScreenSize() / tbVector2(800.0f, 600.0f)))


Jetzt habe ich meinem Windows cursor der genau dahin klickt wo ich will und der cursor der GUI ist weg.

Problem hierbei ist jedoch, dass ich mit dem Windows Cursor nicht mehr, die mit der GUI erstellten Buttons, anklicken kann, was mit dem cursor der GUI allerings klappte. Ich denke ich muss der Nachrichtenfunktion der GUI also irgendwie mitteilen, dass der Windows Cursor verwendet wird, aber ich habe keine Ahnung wie.

Kann mir jemand helfen? Schonmal danke.

2

16.07.2009, 15:01

kann mir da niemand was zu sagen?

3

16.07.2009, 15:09

wo genau hängst? beim Abfangen des Klicks des Windows-Cursors, oder beim der GUI sagen, das geklickt wurde?

4

17.07.2009, 10:20

So genau kann ich das nich sagen. Mit dem selbsterstellten Cursor klappt das klicken. Mit dem windows cursor nicht.

5

17.07.2009, 10:48

anders gefragt: was tust du bis jetz, um mit dem Windowscursor zu klicken? nur ShowCursor(TRUE)?
und erstellst du dein Fenster selbst, oder lässt du es von der TriBase erstellen?

6

17.07.2009, 14:58

also das fenster erstellen erledigt die tribase engine. das abfangen der nachrichten geschieht in folgender funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
tbResult GameMsgProc(int iID,
                         tbGUIMessage* pMsg,
                         tbGUI* pGUI)
{

    switch(pMsg->Type)
    {
    case TB_GMT_ELEMENTCLICKED:
        switch(iID)
        {
        case 101:

//...


und wie gesagt, mit dem selbsterstellten curson funktioniert das klicken ja. Liegt das vielleicht an dem TB_GMT_ELEMENTCLICKED? Das das mit dem standard windows cursor nicht klappt?

7

17.07.2009, 15:25

natürlich klappt das mit dem Standard Windows-Cursor nicht, der sendet seine Nachrichten nicht an die TriBase Nachrichtenfunktion, sondern an die des Fensters, und die ist in der triBase Engine versteckt, wenn du das fenster von dieser erstellen lässt. Um den Windows-Cursor zu verwenden, musst du das Fenster von Hand erstellen (siehe CreateWindow()) und deine eigene Nachrichtenfunktion angeben. Zur funktion und den Nachrichtencodes, wirf einfach einen Blick hier hin, die Adresse solltest du dir allgemein merken, ist extrem nützlich, wenn du irgendwas mit windows machen wilslt ;)

//EDIT: @Admin/mod: warum klappt [ url ] nicht mit msdn adressen?

8

17.07.2009, 15:49

hm ok klingt logisch. aber gäbe es vielleicht auch eine Möglichkeit den selbst erstellten cursor zu verwenden? Dasproblem hierbei ist ja nur, dass der klick nicht da statt findet wo sich der cursor befindet.

9

17.07.2009, 17:01

du könntest das Element vCursorHotSpot der tbGUISkin instanz, die du tbGUI::Init übergibst, entsprechend anpassen (Position, an der geklickt werden soll, in Pixeln, relativ zum Cursorbild).

10

18.07.2009, 12:25

hm, das hab ich versucht aber irgendwie krieg ichs nich hin das das passt. der abstand zwischen eigentlicher klick position und dem cursor ändert sich auch wenn ich den cursor bewege.

Werbeanzeige