Hallo, danke für dein Willkommen und die Antwort =)
Sobald ich das auf FOREGROUND umstelle springt er immer in die if(FAILED(r)) {} Schleife rein ...
So nun zu meinem Programmablauf:
|
C-/C++-Quelltext
|
1
|
initKeyboard(hThisInstance,hwnd);
|
wird in der main aufgerufen, nachdem alle Fenster erzeugt wurden.
In der Nachrichtenverwaltung (Translate und Dispatch) wird dann jedesmal
|
C-/C++-Quelltext
|
1
|
Render(global_time,pcmd);
|
aufgerufen (pcmd ist egal..)
Render sieht (stark verkürzt dann so aus:
|
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
|
bool Render(float secsPassed, string* cmd)
{
if(GetAsyncKeyState((int)steuerung.rotateX[0]))
{
press_key = true;
D3DXMatrixRotationX(&matrixRotateX,0.05f);
}
//so habe ich es erst versucht, bin aber dann auf DirectInput gewechselt, also:
if( keyState(DIK_ESCAPE) && g_time > 0.5)
{
secsPassed = 0;
press_key = false;
}
if(keyState(DIK_W))
{
camerapos.x -= trash;
press_key = true;
D3DXMatrixTranslation(&matrixTrans,trash,0.0f,0.0f);
}
//...
D3DXMatrixMultiply(&matrixView,&matrixView,&matrixRotateX);
D3DXMatrixMultiply(&matrixView,&matrixView,&matrixRotateY);
D3DXMatrixMultiply(&matrixView,&matrixView,&matrixRotateZ);
D3DXMatrixMultiply(&matrixView,&matrixView,&matrixTrans);
pD3DDevice->SetTransform(D3DTS_VIEW, &matrixView);//(D3DMATRIX*)(&mCamera));
Matrix mProjection = matrixProjection(fov, aspect, 0.1f, 250.0f);
pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
//...
pD3DDevice->BeginScene();
DWORD fvvf;
DWORD* gg = & fvvf;
pD3DDevice->GetFVF(gg);
pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0));
pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
pD3DDevice->SetRenderState(D3DRS_ZENABLE,FALSE);
pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
pD3DDevice->SetTexture(0, pSky);
pD3DDevice->SetTexture(1, NULL);
pD3DDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
pD3DDevice->LightEnable(0,FALSE);
if(FAILED(pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,
8,
12,
g_index_sky,
D3DFMT_INDEX16,
vertex,
sizeof(SVertex))))
{
ccout("Fehler beim Zeichnen. Ungültige Vertices oder Formate?");
writeToLog("Fehler beim Zeichnen. Ungültige Vertices oder Formate? Oder Szene wurde nicht ordnungsgemäß geöffnet/ geschlossen!", TRUE, 0);
return false;
}
//...
pD3DDevice->EndScene();
pD3DDevice->Present(NULL, NULL, NULL, NULL);
first_call = false;
press_key = false;
return true;
}
|
also ich habe im moment beides drinne... GetAsyncKeyState und meine Funktion
Mein Spiel ist leider etwas verworren... ich habe bereits 34 Dateien (.cpp und .hpp) und mehr als 5000 Zeilen Code, da verliert man/ich den Überblick.
Achja, in der WinProc wird nichts dergleichen abgefragt (keine "case WM_KEYDOWN" o.ä.)
Vielleicht liegt es ja an dem FOREGROUND, nur warum geht das denn nicht?
Naja.. ich hoffe, dass du mit meinen Angaben weiterkommst....
ansonsten sehen wir weiter ;=)
Auf jeden Fall schon einmal danke!
Mfg
kickerxy123
#edit: ich habe grade hier im Forum etwas gefunden, was vielleicht etwas weiterhilft:
https://www.spieleprogrammierer.de/phpBB…pic.php?t=11530 dort steht:
Nachdem ich mal Winspector (ähnlich Spy++, aber kostenlos) auf mein Programm losgelassen hatte, stellte folgenden Sachverhalt (und wohl auch Grund für das Problem) fest: Es wird unmittelbar nach Tastendruck einmal WM_KEYDOWN gesendet. Hält man die Taste aber weiter durchgehend gedrückt, so fasst Windows nach dem Senden der ersten Nachricht für etwa eine halbe Sekunde alle weiteren zusammen und sendet erst nach Ablauf der halben Sekunde ein weiteres WM_KEYDOWN, bei dem dann eben (wie in der MSDN beschrieben) das untere Wort von lParam die Anzahl der zusammengefassten Nachrichten enthält. Man kann dieses Verhalten übrigens auch im Notepad beobachten, wenn man eine Taste gedrückt hält: Es wird sofort ein einzelner Buchstabe ausgegeben, dann folgt eine halbe Sekunde Pause und die weiteren Buchstaben folgen.
Und in meinem Programm ist es genauso: einmal "Ding" und dann nach ner halben Sekunde "Dauer-Ding".