AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi NONVCL: Suche Spieleschleife / Programmrumpf

NONVCL: Suche Spieleschleife / Programmrumpf

Ein Thema von OLLI_T · begonnen am 16. Dez 2003 · letzter Beitrag vom 18. Dez 2003
Antwort Antwort
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#1

NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 16. Dez 2003, 10:33
Hallo Delphi Gemeinde!

Ich möchte gern zur geistigen Erbauung ein kleines NONVCL Tetris im Style vom guten alten Supertetris programmieren. Das ganz soll auf der Basis von profanen Bitmaps und nicht mit DirectX oder OpenGL laufen.

Nun stellt sich mir die Frage nach der besten Vorgehensweise, was Timer und Tastaturabfrage angeht. Der Rest ist dann eigentlich Standard.
Mir sind einige Ansätze bekannt, wie ich eine konstante Zeitbasis zum Bewegen der Teile bekomme. Aber mich würde einfach interessieren, wie ihr so an die Sache rangeht. Deshalb mach ich es wie bei der Zuschauerfrage bei "Wer wird Milliadär" und laß meinen Code ganz außen vor.

Bedanke mich schon jetzt für Eure Beiträge

Viele Grüsse

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#2

Re: NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 16. Dez 2003, 12:13
Hallo,

zuerstmal stellt sich die Frage, ob Du bei Deinem Spiel die höchstmögliche Framerate haben möchtest - sprich: in jeder Idle-Phase wird der Bildschirm upgedatet - oder ob es ein Timer auch tut. Nachteil der ersten Variante: die Prozessorauslautung geht ans Limit, aber wenn man spielen will, dann ist das ja eigentlich auch ok, Vorteil ist eben eine höhe Framerate und damit ein flüssigerer Spielablauf. Bei einem Tetris, wo die Bewegungen der Steine ja eigentlich sowieso etwas abgehackt sind, kann man das ganze auch mit einem Timer machen. Sieht bei meinem Tetris jedenfalls sehr ordentlich aus.

Habe mal aus einem meiner Projekte was kopiert:

Zuerst die Nachrichtenschleife, man kann wählen ob mit Timer(RHighest=0) oder mit höchstmöglicher Framerate(RHighest=1), die entsprechende Schleife wird benutzt:
Delphi-Quellcode:
If (RHighest=1) Then Begin // nur wenn höchstmögliche Framerate gewünscht ist
  While Not(Beenden) Do Begin
   While PeekMessage(Message,0,0,0,PM_REMOVE) Do Begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
   // keine Nachrichten mehr, Zeit zum Rendern...
   Render;
  End;
 End
 Else Begin // andere Schleife wenn Timer ausreicht
  Timer := SetTimer(hWnd,0,50,Nil); // wenn hier das Intervall zu kurz ist, geht die Auslastung auch hoch
   While GetMessage(Message,0,0,0) Do begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
   KillTimer(hWnd,Timer);
 End;
In der WndProc sieht es dann so aus, Tastaturabfragen müsstest Du noch selbst abfragen:
Delphi-Quellcode:
Function WndProc(hWnd : Integer; Message, wParam, lParam: LongInt): LongInt; stdcall;
Begin
 Result := 0;
 case Message of
  WM_DESTROY: Begin
               PostQuitMessage(0);
              End;

  WM_CLOSE: Begin
             Beenden := True;
             DestroyWindow(hWnd);
            End;

  WM_TIMER: Render; // wenn Timer gewählt ist, wird hier in die Render-Funktion gegangen

  Else Result := DefWindowProc(hWnd, Message, wParam, lParam);
 End;
End;
In der Render-Funktion kannst du mit GetTickCount die Zeit messen, die seit dem letzten Frame vergangen ist und entsprechend der Geschwindigkeit der Steine diese bewegen.

Gruß, teebee
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 16. Dez 2003, 14:36
Hallo teebee!

Vielen Dank für Deine ausführliche Antwort! Werde also zunächst den Multimedia-Timer aus MMSystems als Zeitgeber einsetzen. Es wird ja nicht immer der gesamte Screen neu gezeichnet sondern nur der Bereich, auf dem sich was geändert hat.

Die sofortige Reaktion des Spieles auf die Tastendrucke ist mir allerdings sehr sehr wichtig. Arbeitest Du in Deiner Tetris Variante mit WM_KEYDOWN oder nutzt Du GetAsyncKeyState zur Tastaturabfrage. Wie sieht es mit entprellen aus? Muss ich mich darum kümmern oder kann ich einfach jedes WM_KEYDOWN direkt verarbeiten?

Viele Grüsse

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#4

Re: NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 17. Dez 2003, 08:38
Hallo OLLI,
Zitat von OLLI_T:
Werde also zunächst den Multimedia-Timer aus MMSystems als Zeitgeber einsetzen.
Ich habe nur den normalen Timer verwendet, hat gereicht, aber warum nicht...
Zitat:
Die sofortige Reaktion des Spieles auf die Tastendrucke ist mir allerdings sehr sehr wichtig. Arbeitest Du in Deiner Tetris Variante mit WM_KEYDOWN oder nutzt Du GetAsyncKeyState zur Tastaturabfrage. Wie sieht es mit entprellen aus? Muss ich mich darum kümmern oder kann ich einfach jedes WM_KEYDOWN direkt verarbeiten?
Mit der Reaktion auf die Tasten ist es normalerweise gar kein Problem. Um das Entprellen musst Du Dich nicht kümmern, das findet schon in der Tastatur selbst und spätestens im Treiber statt. Ich habe bei meiner Variante (übrigens VCL) einfach im OnKeyDown-Ereignis (analog zu WM_KEYDOWN) auf die Steuertasten geprüft und dann direkt dort den Spielstein nach links/rechts/unten bewegt bzw. rotiert. Timergesteuert ist nur die automatische Bewegung nach unten.

Gruß, teebee
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#5

Re: NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 17. Dez 2003, 08:38
Sorry, versehentliches Doppelposting...
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: NONVCL: Suche Spieleschleife / Programmrumpf

  Alt 18. Dez 2003, 19:07
Hallo Teebee!

Hab erst jetzt gesehen, dass Du mir geantwortet hast.

Danke Dir für Deine konstruktiven Hinweise.

Viele Grüsse

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz