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

11

05.12.2009, 17:32

Direct Input kann wohl ohne TriBase initialisiert werden, und wird es auch. Du meinst, dass er ohne TB-Init keine TriBase DirectInput klassen initialisieren kann.

12

05.12.2009, 17:34

Genau das. Aber so wie er es macht kann es nicht gehen.
Metal ist keine Musik sondern eine Religion.

13

05.12.2009, 17:49

Doch, das geht auch ohne TriBase. (ich bezieh mich jetzt auf den Code, den er im ersten Post geposted hat.)

14

05.12.2009, 21:33

Hallo, das ich mir das ganze Buch durchlesen soll habe ich jetzt verstanden :lol: allerdings habe ich mir das Buch halt auch (bzw. erstmal vorrangig gekauft) um besser mit DirectInput arbeiten zu können. Da ich aber auch noch mit Bildverarbeitung zu tun haben werde, habe ich auf diese Buch zurückgegriffen. Und aus Zeitmangel wird jetzt erstmal die abgespecktere Variante gewählt....Aber ich denke doch, dass man auch mit/trotz TriBase einen guten Einblick über das ganze gewinnt, da die wesentlichen Funktionen von DirectInput gut im Buch erklärt sind.

TriBase wird in meinem kurzen Quellcode doch nur bei einer Funktion verwendet, diese kann man ja sicher auch durch eine äquivalente Funktion ohne TriBase ersetzen oder? TriBase liefert ja nur einige Erleichterungen, die ich dann wohl oder übel nochmal "zu Fuß" erledigen muss.

Allerdings würde mich trotzdem interessieren ob es grundsätzlich möglich ist DirectInput (und evtl. auch TriBase) in einer normalen Konsolenanwendung zu verwenden. Wen es interessiert, es soll auf einem bestehenden Projekt eine Steuerung für einen Roboter mittels Joystick entworfen werden.

15

07.12.2009, 19:00

Zitat von »"lustigerclown"«

Allerdings würde mich trotzdem interessieren ob es grundsätzlich möglich ist DirectInput (und evtl. auch TriBase) in einer normalen Konsolenanwendung zu verwenden. Wen es interessiert, es soll auf einem bestehenden Projekt eine Steuerung für einen Roboter mittels Joystick entworfen werden.

Ja, das ist grundsätzlich möglich, genau wie bei allen anderen Modulen von DirectX und auch der WinAPI. du hast halt im wesentlichen den Nachteil, das du hInstance nicht schön als parameter der WinMain (dies dann ja ncith gibt) hast, sondern anders herausfinden musst.
afair ging das z.B. über GetModuleHandle(NULL), aber da bin ich mir nciht sicher.

16

09.12.2009, 13:08

Hallo und danke für die Antworten.
Dass mit GetModuleHandle() habe ich auch schon herauasgefunden und es funktioniert. Habe nun allerdings noch ein anderes Problem.

Ich versuche nun aus dem Joystick Beispiel eine Klasse zu schreiben.
Jedoch hat er mit folgendem Probleme:

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
24
25
// Rückruffunktion zum Aufzählen der Joysticks

BOOL CALLBACK Joystick::EnumJoysticksCallback(LPCDIDEVICEINSTANCE pDeviceInstance,
                                    void* pRef)
{
    // GUID des Joysticks kopieren

    JoystickGUID = pDeviceInstance->guidInstance;

    // Abzählung abbrechen

    return FALSE;
}

// ******************************************************************

// Initialisierung des Joysticks

BOOL Joystick::InitJoystick(HWND hDlg)
{
    // Als erstes wird eine Abzählung der Joysticks durchgeführt.

    // Der erste wird dann gleich genommen - seine GUID-Nummer wird

    // in die Variable JoystickGUID kopiert.

    if(FAILED(g_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY)))
    {
        MessageBox(hDlg, "Es wurde kein Joystick gefunden!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;
    }
...


Hierbei erscheint immer die Fehlermeldung:

Quellcode

1
Fehler  1   error C3867: "Joystick::EnumJoysticksCallback": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Joystick::EnumJoysticksCallback", um einen Zeiger auf den Member zu erstellen.



Kann hier vllt jemand einen Tipp geben? Habe hierfür auch wieder das Win32-Projekt genommen, also keine Konsolenanwednung. Nur auf die TriBase Funktionen habe ich verzichtet. Könnte das schon Fehler bereiten?
Die eigentliche Definition war ja:

Quellcode

1
tbResult InitJoystick(HWND hDlg)


Problem ist ja, dass er nicht auf die Klassen-Funktion zugreifen kann. Habe die Funktionen im Header alle auf public gesetzt.[/code]

17

09.12.2009, 15:30

Du musst die Funktion static machen, also:

C-/C++-Quelltext

1
static BOOL .........

18

10.12.2009, 18:59

Hallo, vielen Dank für die Antwort hat einmal mit static wunderbar funktioniert.Habe nun jedoch das Problem, dass ich versuche in meiner "main" mit :

C-/C++-Quelltext

1
2
3
    Joystick new_joy;

    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, new_joy.DlgProc);

das Dialogfenster bzw. den ganzen Prozess "in Gang zu setzen". Hierbei erscheint wieder die selbe Fehlermeldung wie vorher (also nicht die selbe andere Funktion):

Zitat


Fehler 1 error C3867: "Joystick::DlgProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Joystick::DlgProc", um einen Zeiger auf den Member zu erstellen.


Mit static funktioniert das ganze nun nicht mehr, da in DlgProc auch wieder die einzelnen Funktionen der Klasse aufgerufen werden und es dann Probleme gibt, dass keine nicht-statischen Funktionen/Member aufgerufen werden können.

Falls nützlich, meine Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class Joystick
{
public:
    Joystick();

    static BOOL CALLBACK EnumJoysticksCallback(LPCDIDEVICEINSTANCE pDeviceInstance,void* pRef);
    bool InitJoystick(HWND);
    bool UpdateJoystickState(HWND);
    INT_PTR CALLBACK DlgProc(HWND hDlg, unsigned int uiMsg, WPARAM WParam, LPARAM LParam);
    
    LPDIRECTINPUTDEVICE8 g_pJoystick;   // Schnittstelle des Joysticks

    LPDIRECTINPUT8 g_pDInput;
};


Ohne diesen Aufruf von DlgProc läuft das Programm ohne Probleme an,
aber macht halt nix :)
Vielen Dank nochmals!

19

17.12.2009, 13:32

Hallo, bin jetzt doch noch ein Stück weitergekommen :

Hier mal Auszugsweise mein Code:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// ******************************************************************

// Globale Variablen

LPDIRECTINPUT8          g_pDInput = NULL;   // IDirectInput8-Objekt

LPDIRECTINPUTDEVICE8    g_pJoystick = NULL; // Schnittstelle des Joysticks

GUID                    JoystickGUID;       // GUID des verwendeten Joysticks

HINSTANCE hInstance = GetModuleHandle(NULL);

BOOL CALLBACK EnumJoysticksCallback(LPCDIDEVICEINSTANCE ,void* );
bool InitJoystick(HWND );
bool DlgProc(); //HWND hDlg,    unsigned int ,  WPARAM

bool UpdateJoystickState(HWND );

HWND hDlg;
unsigned int uiMsg;
WPARAM WParam;

// Windows-Hauptfunktion

int main()
{
    HWND hDlg;
    //HINSTANCE hInstance;

    // das IDirectInput8-Objekt wird mit der Funktion DirectInput8Create erstellt.

    
    if(FAILED(DirectInput8Create(hInstance,             // Instanz

                                 0x0800,                // Version

                                 IID_IDirectInput8,     // Schnittstellenversion

                                 (void**)(&g_pDInput),  // Doppelzeiger auf Objekt

                                 NULL)))                // nicht wichtig

    {
        printf("IDirectInput8-Objekt konnte nicht erstellt werden!");
        getchar();
        return 1;
    }
    printf("IDirectInput8-Objekt wurde angelegt!\n");


    DlgProc();
}

// ******************************************************************

// Dialogrückruffunktion

bool DlgProc()
{
    char eingabe;
    bool ende=false;
    
    do
    {
    fflush(stdin);
    printf("a. Initialisieren\n");
    printf("b. Aktivieren\n");
    printf("c. Joystick-Status\n");
    printf("d. Initialisieren\n");
    printf("e. Ende\n");
    printf("Auswahl : ");
    scanf("%c",&eingabe);

    //switch(uiMsg)

    switch(eingabe)
    {
    //case WM_INITDIALOG:

    case 'a':
        // Icon setzen

        SetClassLong(hDlg, GCL_HICON, (LONG)(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))));

        // Den Joystick initialisieren!

        if(InitJoystick(hDlg))
        {
            printf("Joystick konnte nicht initialisiert werden!\n");
            EndDialog(hDlg, 1);
        }

        // Timer einstellen, so dass alle 0.05 Sekunden eine WM_TIMER-

        // Nachricht verschickt wird. Dort wird dann der Zustand des

        // Joysticks aktualisiert.

        SetTimer(hDlg, 0, 50, NULL);
        printf("Joystick wurde Initialisiert\n");
        break;

    //case WM_ACTIVATE:

    case 'b':
        if(LOWORD(WParam) != WA_INACTIVE)
        {
            // Das Fenster wurde gerade aktiv.

            // Direkten Zugriff aktivieren!

            if(g_pJoystick != NULL) g_pJoystick->Acquire();
        }
        printf("Joystick wurde Aktiviert\n");
        break;

    //case WM_TIMER:

    case 'c':
        // Status des Joysticks aktualisieren und anzeigen

        UpdateJoystickState(hDlg);
        break;

    //case WM_CLOSE:

    case 'd':
        EndDialog(hDlg, 0);
        break;
/*
    case WM_COMMAND:
        switch(LOWORD(WParam))
        {
        case IDC_OK:
            // Dialog beenden, wenn OK angeklickt wurde
            EndDialog(hDlg, 0);
            break;
        }
*/
    case 'e':
        printf("beenden...\n");
        ende=true;
        break;

    default:
        printf("Falsche Eingabe\n");
    }

    }while(ende==false);

    //case WM_DESTROY:

    // Das Dialogfenster wird geschlossen. Aufräumarbeiten erledigen!

    KillTimer(hDlg, 0);
    if(g_pDInput != NULL) g_pDInput->Release();
    if(g_pJoystick != NULL)
    {
        g_pJoystick->Unacquire();
        g_pJoystick->Release();
    }
    return TRUE;
}


Ich Rufe nun immer die DLG Proc auf und initialisiere den Joystick,aktiviere ihn....Dies klappt auch alles ohne Fehler.
Das Problem ist jetzt mit der Abfrage des eigentlichen Joystickstatus :


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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
bool UpdateJoystickState(HWND hDlg)
{
    DIJOYSTATE2 JoystickState;      // Status des Joysticks

    char        acButtonsText[256]; // Text für die gedrückten Knöpfe

    HRESULT     r;

    printf("Jetzt Daten abfragen.\n");
//******* WHILE - ANFANG ********************

    do
    {

    // Daten abfragen

    r = g_pJoystick->Poll();
    if(r == DIERR_INPUTLOST)
    {
        // Zugriff verloren - erneut versuchen

        g_pJoystick->Acquire();
    }

    if(FAILED(r))
    {
        // Abfrage hat nicht funktioniert!

        // Wahrscheinlich ist das Fenster gerade nicht aktiv.

        //printf("Fehler beim Abfragen der Eingabedaten!");

        //return FALSE;

    }

    // Zustand abfragen

    g_pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &JoystickState);

    // Anzeigen generieren

    
    if ( ((JoystickState.lX)==0) && ((JoystickState.lY)==0) )   
    {
        printf("Beides Null.\n");
    }

    else if ( ((JoystickState.lX)>60000) && ((JoystickState.lY)>60000) )
    {
        printf("Beides ueber 60000");
    }
    }while(1);

    return TRUE;
}


Habe es jetzt probeweise in eine Endlosschleife gepackt um zu sehen ob noch Werte ankommen bzw. die beiden Abfragen erfüllt werden. Leider ist dies momentan nicht der Fall.

Kann mir hier vielleicht jemand einen Tipp geben? Dachte erst er hätte Probleme mit g_pJoystick und dessen FUnktionen, aber diese kann ich alle auswählen.

Vielen Dank nochmals.

Werbeanzeige