Programación General > Pascal
Un Game Loop Basico?
Enko:
no encontré uno de Pascal pero tengo uno documentado para Delphi....
--- Código: Text --- {===============================================================}{ }{ File: unt_Game.pas }{ Created By: Name Goes Here }{ Modified By: N/A }{ Creation Date: N/A }{ Last Modified On: N/A }{ }{ Description: Simple template for a game in Delphi. }{ }{---------------------------------------------------------------}{ Copyright © XXXX-XXXX All Rights Reserved }{===============================================================} UNIT unt_Game; {==============================================================================} INTERFACE USES Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;{==============================================================================} {Global DataType / Constant / Variable Declarations}{------------------------------------------------------------------------------} TYPE TGameState = (gsDemo, gsPlaying, gsIntermission, gsPaused, gsGameOver); Tfrm_Game = class(TForm) procedure FormCreate(Sender: TObject); procedure OnIdleHandler(Sender: TObject; var Done: Boolean); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; CONST Throttle = trunc(1000 / 30); {30fps Throttle} VAR frm_Game: Tfrm_Game; GameRunning: Boolean; GameState: TGameState; {Function / Procedure ProtoTypes}{------------------------------------------------------------------------------} {None needed yet} {mainly used for forward delcarations} {==============================================================================} IMPLEMENTATION {$R *.DFM}{==============================================================================} {Game Event Handlers}{------------------------------------------------------------------------------} procedure Pause(MilliSeconds: Integer); var CurrentTime: LongInt; PauseTime: LongInt; begin CurrentTime := GetTickCount; PauseTime := CurrentTime + MilliSeconds; while CurrentTime < (PauseTime) do begin Application.ProcessMessages; CurrentTime := GetTickCount; end; end; procedure doDemo(); begin //Display automated demonstration/intro here Application.ProcessMessages; end; procedure doPlaying(); begin //Perform all gameplay here Application.ProcessMessages; end; procedure doIntermission(); begin //Perform inter-level loads etc. here Application.ProcessMessages; end; procedure doPause(); begin //Pause gameplay here Application.ProcessMessages; end; procedure doGameOver(); begin //Display game over screen and cleanup here Application.ProcessMessages; end; procedure GameLoop(); var TimeIndex: LongInt; begin while GameRunning do begin //Record time before processing TimeIndex := LongInt(GetTickCount); //Process game case GameState of gsDemo: doDemo; gsPlaying: doPlaying; gsIntermission: doIntermission; gsPaused: doPause; gsGameOver: doGameOver; end; //Calculate time it took to process TimeIndex := LongInt(GetTickCount) - TimeIndex; //Pause if it was too quick if (TimeIndex < Throttle) then begin Pause(Throttle - TimeIndex); end; Application.ProcessMessages; end; end; {Form Event Handlers}{------------------------------------------------------------------------------} procedure Tfrm_Game.OnIdleHandler(Sender: TObject; var Done: Boolean); begin GameLoop; end; procedure Tfrm_Game.FormCreate(Sender: TObject); begin GameState := gsDemo; GameRunning := True; Application.OnIdle := OnIdleHandler; end; procedure Tfrm_Game.FormClose(Sender: TObject; var Action: TCloseAction); begin GameRunning := False; end; {===============================================================}{ Copyright © XXXX-XXXX All Rights Reserved }{===============================================================} END.
Amilius:
Ahi va un game loop verificado: :D
--- Código: Text --- program gameloop;uses dos,crt2;{sin bug}var G_CONTADOR_DE_FRAMES:integer;const {Nota: No soporta menos de 5 por granularidad de 54ms} intervalo_entre_ticks=5;{0.05 segundos, unos 20fps} procedure dibujarFrame; var Hour, Minute, Second, Sec100: word; begin getTime(Hour, Minute, Second, Sec100); writeln('Hola mundo! ',G_CONTADOR_DE_FRAMES,' * ',hour,':',minute,':',second,'.',sec100); inc(G_CONTADOR_DE_FRAMES); end; procedure realizarBucleMaestro; function ticks:longint; var Hour, Minute, Second, Sec100: word; begin {granularidad: t¡picos 54ms} {nota: optimizar con asm} getTime(Hour, Minute, Second, Sec100); ticks:=sec100+second*100+minute*6000+hour*360000; end; var finalizarBucle:boolean; tiempo,tiempoAnterior:longint; kbd:char; begin tiempoAnterior:=ticks; finalizarBucle:=false; repeat tiempo:=ticks; {evitando bug de media noche} if tiempo<tiempoAnterior then tiempoAnterior:=tiempo; {control de intervalo} if tiempo-tiempoAnterior>=intervalo_entre_ticks then begin tiempoAnterior:=tiempo; dibujarFrame; end; {procesar teclas presionadas y otros eventos} while keypressed=true do begin kbd:=readkey; case kbd of #27:exit; end; end until finalizarBucle; end; begin realizarBucleMaestro;end.
P.D. Al hacer copy paste se perdió algo de la tabulación :P
Solman:
Hola tu game loop esta bien pero no entiendo crt2?????? y tambien quisiera saber como lo optimizarias con assembler ... porque no convence mucho tu ejemplo.
Amilius:
--- Cita de: "Solman" --- Hola tu game loop esta bien pero no entiendo crt2?????? y tambien quisiera saber como lo optimizarias con assembler ... porque no convence mucho tu ejemplo.
--- Fin de la cita ---
JA JA JA JA :D
El ctr original tiene el bug de desbordamiento al calcular el retardo necesario para el delay. El código del tick obviamente necesita optimización y de ser posible una forma de tener granularidad de milésimas de segundo en lugar de 58ms. Pero eso corresponde a la sección del foro para assembler :D.
Navegación
[*] Página Anterior
Ir a la versión completa