Fragen zur Spieleprogrammierung

fireblade1282

Mitglied
Servus Leute,
ich habe mal zwei Fragen die mir beim Entwickeln einer GameEngine aufgekommen sind.
Kurz vorweg - ich schreibe zur Zeit in Delphi und entwickle auf OpenGL, aber die Fragen passen doch eher in den CoderTalk. Jeder C++/# ' ler wird mit den Codefragmenten etwas anfangen können....

1. Problem:
KeyHandling. Ich baue innerhalb meiner MainLoop einen Peek/Translate/DispatchMessage Konstrukt. Für die Tasten hab ich mir ein 255er Boolean Array angelegt und wenn die entsprechenden Nachrichten vom Betriebssystem kommen verwende ich in einer case (select) Anweisung:
Code:
      WM_KEYDOWN: begin
          app.keys[wParam] := TRUE;
          result:=0
      end;
      WM_KEYUP:
          app.keys[wParam] := FALSE;
          result:=0;
      end;

Das funktioniert soweit auch relativ gut, ich kann zu jedem Zeitpunkt in dieser Matrix den Zustand der Tasten abfragen. Jetzt zum Problem:
Die Matrix ist definitiv "out-of-Sync" wenn eine Message verloren ging. (ZB. ein anderes Programm den Focus geholt hat, etc.. konkret: ich drücke Alt+Tab und antworte kurz auf eine ICQ Nachricht und die Spielfigur flitzt vollkommen wirr durch die Gegend.)
Kann ich selbst von Zeit zu Zeit irgendwo die Zustände nachprüfen und alles nachjustieren?
Problem zwei: Ich habe eine Panzersimulation geschrieben, mit bewegung der Wanne + des Geschützturms + Ausrichtung der Kanone + Feuern der Waffen... mitunter drückt man einen ganzen Haufen Tasten auf einmal....und jetzt irgendwie scheint es zu sein, als ob manche Tastenanschläge von anderen "verdeckt" werden... Weiss jemand was ich meine und wo das Problem liegt? Ich muss erst ein paar Tasten loslassen, bevor Anschläge anderer Tasten wieder erkannt werden....


Und jetzt zum zweiten Thema: Dem Timing beim Rendern der Szene

In Delphi kann ich mit GetTickCount die Zeit in Millisekunden über die Win API beziehen.
Ich rendere in einer Schleife immer, aber die Berechnungen habe ich in Zeitschritte eingeteilt. Also Sind 5 Millisekunden vergangen berechne ich die Positionen der Objekte in der Landschaft neu, führe eine Collisiondetection/Resolve aus, Sortiere die Objekte der Tiefe nach für das Blending etc, etc... aber gerendert wird immer. ist das sinnvoll?
Das bedeutet doch dass das gleiche bild zig mal berechnet wird... und immer wieder der gerenderte puffer gleichen inhaltes auf den DC geswapt wird. sinnvoller wäre also nur dann zu rendern und zu swappen wenn ein Zeitschritt um ist oder?
Aber wenn ich keinen festen Zeitschritt wähle, ist das "Delta-T" unter Umständen so gering, dass ich damit nicht arbeiten kann. Sprich Es vergeht zwischen zwei Frames faktisch so wenig Zeit, dass die Verschiebung eines Objektes = 0 ist und insgesamt nichts passiert. Also muss ich diskretisieren. Wie muss ich also die Game-Render-Loop Designen um die Leistung eines schnellen Rechners den Frames zukommen zu lassen?

Bin für Tipps dankbar (ich bin kein Programmieranfänger - aber Gameengines unter Windows programmieren ist das erste mal) - vllt hat ja jemand mal ne eigenen Codeschnipsel seiner MainLoop - einfach als Demo?

Danke!

PS - meine aktuelle Grundstruktur:
Code:
    while app.mainloop_running do begin

      if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then begin
          if msg.message=WM_QUIT then begin
            app.mainloop_running := true
          end else begin
              TranslateMessage(msg);
              DispatchMessage(msg);
          end;
      end else begin  

        if (GetTickCount - app.timestamp > 5) then begin
          app.timestamp := GetTickCount;
          evaluateKeys();
          evaluateAI();
          processTimestep();
          collisionDetection();
          levelScript();
          renderScene();
          renderHUD();
          renderConsole();
        end;
  
        SwapBuffers(app.h_Dc);
      end;

    end;
 
Zu Thema 1, Problem 2:
Lösungsansatz:
Wenn Du ein PS/2-Keyboard benutzt, kannst Du max. 3 Tasten gleichzeitig (z.B. strg + alt + entf ;-) ) auswerten. Das kannst Du auch wunderbar in einem Texteditor ausprobieren.
Ich weiß nicht mehr genau, woran das liegt, hatte das Problem vor längerer Zeit aber auch schon einmal. Nur mit einer USB-Tastatur gehen mehr als 3 Tasten auf einmal.
Der "Fehler" muss also nicht in Deinem Programm sein...
 
tatsächlich :) ich hab strg-alt-entf. im texteditor gedrückt und die nächste taste hat er nicht mehr erkannt *g* ... hmmm du hast recht... es scheint eine art technisches problem zu sein... die message wird gar nicht generiert.
anscheinend liegt es wirklich am keyboard. schade. denn wenn mein panzer nach vorne links (2 tasten) fährt und dabei den geschützturm nach rechts schwenkt(1 taste) kann ich nicht mehr feuern... ausser ich leg das auf die maus.... dann ist aber eine dritte hand notwendig (oder nur männer können das spiel spielen...)
...
wenn ich zu dem thema etwas brauchbares finde sag ich bescheid... danke schonmal für den hinweis.
 

Neue Beiträge

Zurück