Programación General > Pascal

 Un Game Loop Basico?

<< < (2/2)

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 {&#036;R *.DFM}{==============================================================================}   {Game Event Handlers}{------------------------------------------------------------------------------} procedure Pause(MilliSeconds: Integer);  var    CurrentTime: LongInt;    PauseTime: LongInt;  begin    CurrentTime := GetTickCount;    PauseTime := CurrentTime + MilliSeconds;    while CurrentTime &#60; (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 &#60; 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&#60;tiempoAnterior then tiempoAnterior:=tiempo;    {control de intervalo}    if tiempo-tiempoAnterior&#62;=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

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa