DInput in der Spieleschleife
-
Und was soll daran richtig sein, KEINE Klassen zu benutzen!?!?
Keine Klassen bei DirectInput ist auf jeden Fall RICHTIG !
Ansonsten kann ich Sgt. Nukem nur zustimmen, von DirectInput ist in deinem Quellcode nicht zu sehen. Wenn du sehen willst, wie's funktioniert schau dir mal die Doku von DirectX an (ist zB im DX9 SDK enthalten was man bei MS kostenlos downloaden kann).
Oder schau einfach mal hier nach
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/input/tuts/directinputcctutorials.asp
-
Wie soll man so eine Frage beantworten? Irgendein ein (wahlloser?) Codeschnipsel und eine Fehlerbeschreibung, die völlig unschlüssig ist. (DI is kaputt, aber der Bildschirm ist schwarz?!). Sowas sollte man mit dem Debugger oder einem Logger angehen, anstatt ein Forum vollzumüllen. Oder am besten erstmal Lernen überhaupt mit der entsprechenden Programmiersprahce umzugehen.
Man vermutet ja fast, das soll ein Fake sein...
Bye, TGGC
-
soll kein fake sein, kann dir den quellcode schicken, ich werde mal eure vorschläge testen. das render_link stammt von einem freund, der die aufgabe für die sprites hatte. kann sein das ich beim abtippen wohl mal einige kalmmern vergesen habe, ich probiere es mal aus, ich habe alle di funktionen in diese cpp getan, nur jeweil 2 header und cpp's habe ich, einmal für sond und grundklasse.
So sieht mein KeyboardInput:
void KeyboardInput(void) { // alle Tasten der Tastatur bool bKeyboard[256]; int y = 20; int x = 20; if(FAILED(lpDIKeyboard->GetDeviceState(sizeof(bKeyboard),(LPVOID)&bKeyboard))) { // die Tastatur wurde zwischenzeitlich // durch eine andere Anwendung genutzt // Kontrolle wiederholen lpDIKeyboard->Acquire(); return; } // die gedrückte Taste ausgeben if(bKeyboard[DIK_LEFT]) { X2 -= 7; Render_Links(); } if(bKeyboard[DIK_RIGHT]) { X2 += 7; Render_Rechts(); } if(bKeyboard[DIK_UP]) { Y2 -= 7; Render_Oben(); } if(bKeyboard[DIK_DOWN]) { Y2 += 7; Render_Unten(); } for(int i=x;i<250;i++) { TextOut(hDC,i,y," ",1); } HDC hDC = GetDC(hWnd); ReleaseDC(hWnd,hDC); }
Aber ich weiß nciht was ich amchen soll.
Original erstellt von <Sgt. Nukem>:
Das "Render_Links;" stört mich auch EXTREM... *g*Ja die Klamemrn fehlen, Es ist mein und das von menem Freund das aller erstes Projekt.
Original erstellt von <Sgt. Nukem>:
**Von DirectInput ist in Deinem Code leider nichts zu erkennen...Ich denke mal "bKeyboard" soll bei Dir der Tastatur-Status-Buffer sein...!?
**Ist weiter unten, hier siehst du ja nun 2 Ausschnitte.
ja, bKeyboard ist der T-S-B, das Feld halt.Original erstellt von <Sgt. Nukem>:
**Am Anfang Deiner CPP-Datei solltest Du noch folgende Makros definen, das vereinfacht die Sache sehr:#define KeyDown(data, n) ((data[n] & 0x80) ? true : false) #define KeyUp(data, n) ((data[n] & 0x80) ? false : true)
**
Wie meisnt du das? könntest du diese beiden erläutern, eigentlich musst du nur data und true/false erklären.
Original erstellt von <Sgt. Nukem>:
**
Wenn meinetwegen Dein createtes und acquiretes (*g*) DI-Device (also LPDIRECTINPUTDEVICE8) "m_DEVTastatur" heißt, und Dein Tastatur-Status-Buffer mit "unsigned char m_TastaturStatus[256];" kreiert wurde, kannst Du Dir den aktuellen Tastatur-Status (immediate mode) mitm_DEVTastatur->GetDeviceState(sizeof(unsigned char[256]), (LPVOID)m_TastaturStatus)
holen.
Nun kannst Du mit
if(KeyDown(m_TastaturStatus, DIK_LEFT)) { // Cursor-Links wurde gedrückt Rotation += 0.2f; // z.B. }
auf Tastendruck prüfen...
Hoffe geholfen zu haben...
**Ja gut, hier siehst du ja,w ie ich das gemacht habe:
CODE:
\BOOL InitDirectInput(HINSTANCE hInst) { // DirectInput8-Objekt anlegen if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&lpDI,NULL))) { return Error("Fehler beim Anlegen des DirectInput8-Objekts"); } // Gerät für die Tastatur festlegen if(FAILED(lpDI->CreateDevice(GUID_SysKeyboard, &lpDIKeyboard, NULL))) { return Error("Fehler->Tasta festlegen"); } // c_dfDIKeyboard - vordefinierte Variable if(FAILED(lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard))) { return Error("Fehler beim Setzen des Datenformats"); } // Kooperationsebene festl. if(FAILED(lpDIKeyboard->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) { return Error("Fehler beim Setzen der Kooperationsebene (DirectInput)"); } // Zugang zur Tastatur bekommen lpDIKeyboard->Acquire(); return TRUE; }
Könntet ihr bitte das Problem helfen. Ich habe das mit DInput noch nei geschafft und ihr seit die ersten von 3 großen foren, die antworten, meine freunde haben auch noch nicht DInput gemacht oder geschafft!
[ Dieser Beitrag wurde am 10.02.2003 um 19:49 Uhr von Ciceri editiert. ]
[ Dieser Beitrag wurde am 10.02.2003 um 19:51 Uhr von Ciceri editiert. ]
[ Dieser Beitrag wurde am 10.02.2003 um 19:51 Uhr von Ciceri editiert. ]
-
Heho!
Also erstmal:
Deine "BOOL InitDirectInput(HINSTANCE hInst)"-Prozedur sieht eigentlich gut aus. Ideal würd' ich sagen. Daß der Rückgabewert eigentlich BOOL is', Du aber mit "return Error("Fehler->Tasta festlegen");" o.ä. als Rückgabewert erstmal die Error-Prozedur aufrufst würde mich persönlich zwar etwas verwirren, aber wenn *DU* damit klarkommst...Jetzt zu den Makros:
In der DirectInput-Doku des SDK steht, daß man den Tastatur-Status mitif (diKeys[DIK_ESCAPE] & 0x80) DoSomething();
überprüfen muß. Das Verknüpfen mit der hexadezimalen 80 ist notwendig aufgrund der #defines der DirectInput Header-Dateien... das mußt Du aber nicht verstehen...!
Aber hier kommen die Makros in Frage, die Du am Anfang Deiner Quelltextdatei definen solltest:#define KeyDown(data, n) ((data[n] & 0x80) ? true : false)
#define KeyUp(data, n) ((data[n] & 0x80) ? false : true)Dem Makro KeyDown wird also (wie bei Prozeduren) als erster Parameter ein Array (data), als zweiter ein int (n) übergeben.
Dann wird darauf der ?-Operator ausgeführt. Dieser funzt folgendermaßen:(Regnet es gerade) ? Scheisse, ja! : Quatsch! Laß den Regenschirm zu Haus'!
D.h. wenn der Ausdruck in den Klammern gegeben ist, wird das VOR dem Doppelpunkt, andernfalls das HINTER dem Doppelpunkt zurückgegeben.
Wenn ich also nun
KeyDown(bKeyboard, DIK_LEFT)
aufrufe, wird folgender Ausdruck ausgewertet:
(bKeyboard[DIK_LEFT] & 0x80) ? true : false
Denk' dran, daß DIK_LEFT nur eine Zahl repräsentiert (die 53. Taste der Tastatur o.ä.).
Anstatt also wie im SDK beschrieben mit
if(bKeyboard[DIK_LEFT] & 0x80) DoSomething();
kannst Du nun mit
if(KeyDown(bKeyboard, DIK_LEFT)) DoSomething();
bzw. KeyUp überprüfen, wat loss is'...!
So läufst Du keine Gefahr, das "& 0x80" zu vergessen...
Und genau das scheint mir bei Dir das Problem zu sein...! :p
Aber nicht schlagen, wenn's daran nich' liegt... bin auch noch Anfänger...
Und TGGC wollt' Dir sicher auch nix böses...
Nur war der erste Codeausschnitt und Deine Beschreibung wirklich nicht gerade aussagekräftig...Hoffentlich klappt's jetz'...!!
CU, da Sarge
-
also liegt es nach deiner meinung hauptsächlich daran, dass ich
if(bKeyboard[DIK_LEFT]
{
X2 -= 7;
Render_Links();
}falsch gemacht habe?
sonder muss ich es so machen:if(KeyDown(bKeyboard, DIK_LEFT)) DoSomething();, oh warte, hast du dich nur falsch vertippt mit KeyDown und DIK_LEFT? meinst wohl eher DIK_DOWN???
dann also so:
if(KeyDown(bKeyboard, DIK_LEFT)) DoSomething();
{
Y2 += 7;
Render_Unten();
}aber wie soll ich das dann mit DoSomething sein, sont schick mri bitte einfach eine dinput datei von dir, denn so werde ich wohl immer etwas falsch machen, bei sound z.B. musste ich mir nur den quellcdoe angucken und ich kontne es schon.
-
if(KeyDown(bKeyboard, DIK_LEFT)) DoSomething();, oh warte, hast du dich nur falsch vertippt mit KeyDown und DIK_LEFT? meinst wohl eher DIK_DOWN???
Das versteh ich irgendwie net! Was willst du uns damit sagen
Das DoSomething(); war nur ein Dummy für einen Funktionsaufruf bzw. einen Anweisungsblock! Es muss also einfach so aussehen:if(KeyDown(bKeyboard, DIK_LEFT)) { Y2 += 7; Render_Unten(); }
-
ok danke, was ich meitne war vollgendes:
if(KeyDown(bKeyboard, DIK_LEFT))
------- --------down und left sind nicht das gleiche, achso ah jetzt versteh ich
-
Ähh... das KeyDown() hat nix damit zu tun, ob Du Render_Links() oder Render_Unten() aufrufst...!!
KeyDown fragt einfach ob eine Taste der Tastatur UNTEN ist (gedrückt).
KeyUp entsprechend, ob sie losgelassen wurde.Mit KeyDown(bKeyboard, DIK_LEFT) prüfe ich also auf "Taste Cursor-Links gedrückt?".
Mit KeyDown(bKeyboard, DIK_DOWN) prüfe ich also auf "Taste Cursor-Unten gedrückt?".Kloar nu'!?
Sarge
-
Vielleicht doch erstmal C++ lernen?
-
ja habe ich auch bemerkt!!!
habe doch geschrieben, ah jetzt habe ich kapiert!
mal sehen, ich werde wieder weiter gucken, vielleicht schaffe ich das ja nun