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
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.
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; } ... |
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. |
Quellcode |
|
1 |
tbResult InitJoystick(HWND hDlg) |
C-/C++-Quelltext |
|
1 |
static BOOL .........
|
C-/C++-Quelltext |
|
1 2 3 |
Joystick new_joy; DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, new_joy.DlgProc); |
Zitat
Fehler 1 error C3867: "Joystick:lgProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Joystick:lgProc", um einen Zeiger auf den Member zu erstellen.
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; }; |
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; } |
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; } |
Werbeanzeige