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

Korowai

unregistriert

11

18.12.2017, 20:52

Beim Start des Programms gibt es in der winmain einen Button, mit dem der Dialog und die directx Programmteile gestartet werden. Sobald dieser gedrückt wird, läuft das Programm ohne Fehler, allerdings bleibt es im Fenster der IDE, und kann nicht angeschaltet werden. Das Programm durchläuft die breakpoints, aber ich kann nicht in das Programmfenster wechseln. Die watches zeigen aber an, dass es läuft.

Inwiefern trägt es dazu bei, anstatt der floats den Spieler[]- array zu übergeben, mein Kameradilemma zu lösen? Was ändert sich hierdurch? Das habe ich nicht verstanden.

12

19.12.2017, 16:57

Vermute mal, das liegt an der Art und Weise, wie du die Windows-Nachrichten verarbeitest.
Wie oft kommt WM_PAINT rein? Einmal beim Start und dann nie wieder?

Warum wird an folgender Stelle UpdateWindow aufgerufen?
(Rekursiv, denn UpdateWindow schickt seinerseits WM_PAINT...)

C-/C++-Quelltext

1
2
3
4
case WM_PAINT:
        {
            UpdateWindow(hDlg1);
...

Wahrscheinlich reagiert das Fenster deshalb auch nicht mehr. ("Bleibt es im Fenster der IDE")

Nichts für ungut, aber beim ersten Anblick deines Programmcodes habe ich gedacht, das gehört doch in den WTF-Codeschnipsel Thread.
Bzw. denn sie wissen nicht, was sie coden... ;)
fka tm

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

19.12.2017, 17:07

WM_PAINT wird vermutlich schon irgendwann aufgerufen, weil er auch InvalidateRect ruft - falls denn diese IDs überhaupt triggern... Ob das 'n cooler Ansatz ist sei man dahingestellt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

14

19.12.2017, 17:43

WM_PAINT wird vermutlich schon irgendwann aufgerufen, weil er auch InvalidateRect ruft - falls denn diese IDs überhaupt triggern...

Stimmt, ggf. bei Tastatureingaben.

Korowai
Deine Renderroutinen kannst du ausschließlich über DirectX realisieren.
fka tm

Korowai

unregistriert

15

19.12.2017, 19:21

Hi,

richtig, updatewindow() ruft die WM_PAINT auf, wenn das Fenster nicht leer ist. Spielt aber in diesem Fall für mich insofern eine Rolle, weil in einem Tutorial geraten wurde, am Anfang der WM_PAINT diesen Befehl sowie am Ende validateRect() aufzurufen.

Hinsichtlich der Sinnfälligkeit dieser beiden Befehle kann ich nur sagen, dass ich die renderBefehle am Anfang in den jeweiligen Button-ID- Funktionen angeordnet habe, dann aber aufgrund der Übersichtlichkeit in die WM_PAINT packte.

Das Hintergrundbild rendert nach wie vor, auch die Sprites sowie das Linienrechteck um das "aktive" Mobil.

Alles geht, nur halt eben die Kamera geht nicht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void render_camera(HWND hDlg1, float &oWorldposx, float &oWorldposy, float &Worldposx, float &Worldposy, float &Spielx, float &Spiely)
{
        D3DXMATRIX movematrix;
        D3DXVECTOR3 HTemp;
        D3DXVECTOR3 LTemp;
        D3DXVECTOR3 PTemp;
        PTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,5.0f);
        HTemp=D3DXVECTOR3(Spielx+Worldposx,Spiely+Worldposy,0.0f);
        LTemp=D3DXVECTOR3(0.0f,1.0f,0.0f);

        D3DXMatrixLookAtLH(&viewMatrix, &PTemp, &HTemp, &LTemp);
        d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);

        D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
        d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);

        D3DXMatrixIdentity(&identityMatrix);

        d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);
}


Dies im Vergleich zu der Initialisierung des Blickfeldes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//...voriger code
D3DXVECTOR3 vCamera(0.0f,0.0f,-35.0f);
    D3DXVECTOR3 vLookat(0.0f,0.0f,0.0f);
    D3DXVECTOR3 vUpVector(0.0f,1.0f,0.0f);

    D3DXMatrixLookAtLH(&viewMatrix, &vCamera, &vLookat, &vUpVector);
  //  D3DXMatrixIdentity(&identityMatrix);
    d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);
   // d3ddev->SetTransform(D3DTS_WORLD, &identityMatrix);
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 800/600, 0.0f, 100.0f);
    d3ddev->SetTransform(D3DTS_PROJECTION, &matProj);
  //  D3DXMatrixOrthoLH(&orthographicMatrix, 800, 600, -50, 50);

   // d3ddev->GetBackBuffer(1,0,D3DBACKBUFFER_TYPE_MONO, &centerbuffer);

   D3DXMatrixIdentity(&identityMatrix);

   d3ddev->SetTransform(D3DTS_WORLD,&identityMatrix);
//...nachheriger code


Was Du also sagst, Michael, ist nicht korrekt.
Nachweislich kann man über die WM_PAINT die Aufrufe zu den render- Subroutinen machen. Sonst wäre das Child im Dialog schwarz.
Ich habe zur Probe das updatewindow() entfernt. Es hat sich offensichtlich nichts daran geändert, dass alles funktioniert, nur das Umsetzen der view_matrix (Kameraperspektive) nicht.
Aber insofern hast Du dahin gehend recht, da die WM_PAINT nur eben Steuercode von directx ausführt, und das rendern selbst in den sub- Funktionen abläuft.

Ich habe schon diverses ausprobiert, bspw. anstatt D3DXMatrixPerspectiveFovLH(...) habe ich auch D3DXMatrixOrthoLH(...) ausprobiert, habe also die dritte Dimension ausgeblendet...
oder bspw. ein Anordnen von

d3ddev->BeginScene(); ... d3ddev->EndScene(); an der STelle, bei der die Kamera neu positioniert wird..

Bisher kein Fortschritt.

16

19.12.2017, 20:04

Hab ja nicht gesagt, dass es nicht funktioniert.
Aber wie ein weiser Mann weiter oben schon sagte:

Zitat

Ob das 'n cooler Ansatz ist sei man dahingestellt.

Das ganze Gefrickel über die WndProc mit WM_PAINT, Validate hier, Invalidate dort usw. usf. kann man sich sparen.
fka tm

Korowai

unregistriert

17

19.12.2017, 20:18

Wie kann man sich das denn sparen?

Und was hat das mit der Kamera Funktion zu tun, die nicht funktioniert?

Welcher Ansatz ist denn cooler? Und wie funktioniert damit die Kamerafunktion?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

19.12.2017, 21:56

Nun, logisch wäre wohl, wenn die IDs überhaupt nicht getriggert werden, oder? Das würde so einiges erklären. Woher die IDs überhaupt stammen und ob du die richtig vergeben hast, kann anhand des Codes von uns hier sowieso keiner nachvollziehen. Aber da scheint vermutlich dein eigentliches Problem zu liegen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Korowai

unregistriert

19

20.12.2017, 06:53

Ich stelle mal gleich eine Struktur zusammen, aus der die Organisation der ID und Buttonklicks hervor geht.
Das scheint meiner Meinung nach aber nicht das Problem, da alle Buttons Aktivität zeigen.

Generell läuft das ganz nach der üblichen formalen Dialogstruktur.

Switch (message)
{
case WM_InitDialog:
{
...
return false}

case WM_PAINT:
{
...
}
break;

// dann weiter mit

case WM_COMMAND:
{
Switch (LOWORD (wParam))
{
// Button IDs
// die alle funktionieren
}
break;
}
break;
}
return false
}

Das mal nur strukturell. Ich kann keinen Fehler finden, poste aber gerne den kompletten Switch, wenn das hilft (?)

Bin wirklich ratlos.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

20.12.2017, 06:55

Das is ja schön und gut, aber woher kommen die Button-IDs? "ID_RECHTS" klingt jetzt nicht nach etwas, was in Windows üblicherweise per default vorhanden ist. Ehrlich gesagt würde ich auch überhaupt gar nicht mit dedizierten Buttons arbeiten wollen. Da muss ich doch 1000mal klicken.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige