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

31

13.04.2008, 09:31

Den Umweg über die Tribase hättest du dir sparen können, denn du hast ja bereits eine Nachrichten-Schleife (Message-Loop) implementiert. (dein zweiter Code-Post in diesem Thread: "while(msg.message != WM_QUIT) ")
Wenn du 'ne masochistische Ader hast, kannst du ja mal das Framework des DirectX SDK diesbezüglich analysieren. ;)

Wenn du es nicht ohnehin schon vorhast, würde ich dir empfehlen, das Ganze objektorientiert anzugehen. Siehe auch Wikipedia-Artikel dazu.

32

13.04.2008, 11:57

Noch habbich ja nix gebaut :)

Also kann ich auf der Nachrichtenschleife aufbauen. Sehe ich das richtig, das
die Funktion

C-/C++-Quelltext

1
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

quasi gar nicht benutzt wird, anders als bei normaler Windows API Programmierung? Weil da kommt man normalerweise ja gar nicht "vorbei" ohne das irgendwelche Ereignise generiert wurden, dann würde das Spiel ja meistens schlafen :)

33

13.04.2008, 12:25

Wird (meistens) schon gebraucht, du arbeitest ja mit Fenstern und der Nachrichtenschleife. Zum Beispiel wenn du Tastatur- oder Mauseingaben ohne Direct Input abfragst. Zumindest um Windwos mitzuteilen: Kümmere du dich um die Nachrichten (return DefWindowProc...)

34

13.04.2008, 13:30

Also ich hab folgendes gefunden und eingebaut:

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
LONGLONG cur_time;       // current time

DWORD  time_count=40;    // ms per frame, default if no performance counter

LONGLONG perf_cnt=0;       // performance timer frequency

LONGLONG next_time=0;    // time to render next frame

BOOL move_flag=TRUE;     // flag noting if we have moved yet



QueryPerformanceFrequency((LARGE_INTEGER *) &perf_cnt);
  
    time_count=static_cast<DWORD>(perf_cnt/25);        // calculate time per frame based on frequency

    QueryPerformanceCounter((LARGE_INTEGER *) &next_time);


// prime the message structure


PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE);

// run till completed


while (msg.message!=WM_QUIT) {

    // is there a message to process?


    if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) {

        // dispatch the message


        TranslateMessage(&msg);
        DispatchMessage(&msg);

    } else {

        // do we need to move?


        if (move_flag) {

            // yes, move and clear flag


            D3DXMatrixRotationX(&Rotation, 0.0f);
            D3DXMatrixTranslation(&Translation,0.0f,0.0f,0.0f);
            D3DXMatrixMultiply(&Welt, &Rotation, &Translation);

            move_flag=FALSE;

        }

   
            QueryPerformanceCounter((LARGE_INTEGER *) &cur_time);

        // is it time to render the frame?


        if (cur_time>next_time) {

            // yes, render the frame


            test->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);        
            test->BeginScene();
            test->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, &Dreieck, sizeof(SVertex));
            test->EndScene();
            test->Present(NULL,NULL,NULL,NULL);

            // set time for next frame


            next_time += time_count;

            // If we get more than a frame ahead, allow us to drop one

            // Otherwise, we will never catch up if we let the error

            // accumulate, and message handling will suffer


            if (next_time < cur_time)
                next_time = cur_time + time_count;

            // flag that we need to move objects again


            move_flag=TRUE;

        }

    }

}


Leider scheint der else Abschnitt nach

C-/C++-Quelltext

1
if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) {
nie durchlaufen zu werden... Somit wird auch nie nen Bild gerendert. :(
Was meinst Du mit Objektorientiert bei der Nachrichtenschleifen? Im DirectX SDK bin ich auch nicht so wirklich fündig geworden zum Them Messageloop.

35

13.04.2008, 13:39

Zitat von »"RettetdemDativ"«

Was meinst Du mit Objektorientiert bei der Nachrichtenschleifen?

Das war allgemein gemeint und nicht auf die Schleife bezogen.
Weiß ja nicht, was genau du vorhast.

36

13.04.2008, 14:41

Achso, naja ich programmier erst ma soweit bis ich alles was ich in Kapitel 2 gelernt hab anwenden kann. Dann werd ich das Buch mach zu Ende durchackern.

Aber trotzdem weiss ich nicht, wieso ich in dem Code oben nicht zum rendern komme... Irgendwie liegt wohl immer ne Msg vor, so das ma nie in den else-Teil kommt.

37

13.04.2008, 15:06

was heißt was besseres?
du musst die Message-Funktionen in deine Schleife einbauen, weil sich Windows sons im Taskmanager beschwert "keine Rückmeldung".

38

13.04.2008, 15:09

Mit besser meinte ich eher "anders". So das vielleicht DirectX was von Hause aus anbietet das man benutzen kann.

Und ich hab den fehler gefunden oben, ich hab vergessen mein

C-/C++-Quelltext

1
test->SetTransform(D3DTS_WORLD, &Welt);

mit runter zu kopieren.... :roll:

39

13.04.2008, 23:04

Hm, grad in der DirectX SDK Doku über den Absatz:

Quellcode

1
DirectPlay is deprecated, and Microsoft strongly recommends against using it to develop new applications. Game developers should use Windows Sockets (see Windows Sockets) and the Windows Firewall APIs (see Windows Firewall for Game Developers).


gestolpert... heißt das am besten ich eigne mir das Wissen zu DirectPlay erst gar nicht erst an und bau Datenpakete lieber selber?
Anscheinend hat sich MS da bissl selber überholt mit seinem Firewallkonzept und DirectPlay :)

40

14.04.2008, 07:42

Ist ja deine Sache, ob du das machst, was Microsoft empfiehlt.
Ich empfehle, einen neuen Thread für so was aufzumachen. ;)
(natürlich auch deine Sache... :))

Werbeanzeige