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

11

15.05.2010, 18:23

Danke :)
hört sich schon sehr gut an, aber kann ich dann auch schreiben:

C-/C++-Quelltext

1
2
if( KeyPressed( VK_RIGHT ) )
     x += 40;


Oder wie soll das klappen?
Da das "x += 40" ja dann auch in der WndProc sein muss oder?

12

15.05.2010, 18:36

Das wäre unschön.
Bearbeite halt die Nachrichten die du brauchst in der WndProc und reich sie an einen Handler weiter.
fka tm

13

15.05.2010, 18:52

Aber ich kann die WndProc nicht einfach bearbeiten, da in meinem Framework die WndProc schon vordefiniert ist.
So meinst du das doch oder?

idontknow

unregistriert

14

15.05.2010, 19:35

Da das dein Framework ist, definierst DU die WndProc. Also kannst du z.b. die WndProc einen Funktionspointer imm Framework aufrufen lassen, der als parameter eine WindowMessage (vom WndProc) erwartet.

15

15.05.2010, 20:13

Also kann ich das nicht mehr so machen wie ich es wollte (siehe oben)? :(

16

15.05.2010, 21:42

Können? Vermutlich! ;)

Außerdem sollst du nicht die WndProc bearbeiten, sondern die Messages (WM_xxx).
Da du ja bereits eine WndProc hast, brauchst du sie ja nur deinen Bedürfnissen anzupassen?

Mit unschön meinte ich vor allem, lokale (von mir aus auch globale) Variablen innerhalb der Proc zu verwenden.
Wie idontknow schon andeutete, pick die Nachrichten raus, und übergebe sie deinem Eventhandler inklusive wparam, lparam usw..

Vielleicht zeigst du mal deinen bisherigen Ansatz (Code).
fka tm

17

15.05.2010, 22:08

Achso :D
Jetzt hab ich verstanden :P

Also ich kann bis jetzt nur die WndProc liefern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
        switch(Msg){
        
            case(WM_DESTROY):
                DestroyWindow(hWnd);
                PostQuitMessage(0);
                break;

            case(WM_KEYDOWN):
                                //was soll hier hin?
                
            default:
                return( DefWindowProc(hWnd, Msg, wParam, lParam) );
        }

        return(0);
    }


Input sollte doch immer in der Move/Logik Phase des Spiels abgehandelt werden, aber bei meinem Framework siehts für die Gameloop so aus:

C-/C++-Quelltext

1
2
3
4
5
6
while( graphics->MessageLoop() == true )
{
    Render();
    Move();
    graphics->Present();
}


Da würde das Input doch schon vor dem Render() abgehandelt werden oder? (MessageLoop() ist die Nachrichtenschleife)

18

15.05.2010, 22:32

Grundsätzlich würde ich folgende Reihenfolge verwenden:

C-/C++-Quelltext

1
2
3
4
5
6
while( game->run() )
{
    Events();   // Hier auf Nachrichten prüfen (PeekMessage) und andere Ereignisse bearbeiten
    Move();
    Render();
}


Denn wenn der Spieler das Spiel beenden will, muss nicht mehr berechnet werden (Move) oder gerendert.

"graphics->Present();" gehört imho zur Render-Funktion.
fka tm

19

15.05.2010, 22:34

Ja stimmt :)

Aber in Davids Buch wurde immer Render, Move, Present; Da dann CPU und GPU gleichzeitig arbeiten können oder hab ich da was falsch verstanden?

20

15.05.2010, 22:48

Hieß es da nicht tbDoMessageLoop(Move, Render)?
Wer grade (mehr) arbeitet, GPU oder CPU, hängt von verschiedenen Faktoren ab.
(im Idealfall sollte allerdings die GPU den Großteil der Arbeit übernehmen)

Wie auch immer, ich mach's im Groben so wie oben beschrieben.
Also erstmal die Ereignisse (dazu gehören auch Dinge wie DeviceLost) bearbeiten, dann Rendern. ;)
fka tm

Werbeanzeige