• Miércoles 20 de Noviembre de 2024, 18:32

Autor Tema:  Un Game Loop Basico?  (Leído 3288 veces)

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Un Game Loop Basico?
« en: Viernes 9 de Septiembre de 2005, 02:08 »
0
hola a todos ... necesito que me ayuden .... es que necesito un codigo que haga que en diversas computadoras donde lo pruebe tenga la misma velocidad.
me explico:
si yo creo un juego y especifico sus movimientos entonces supongamos que le pongo que avance 3 pixeles a la derecha cada ve que presione enter ....el problema es que al llevarlo a una maquina que tenga mayor memoria se ve con mayor velocidad ... lo que quiero es que se estandarice y siga con la misma velocidad ..... no se como hacer la verdad pero creo que se hace con un contador de microsegundos no se ayudenme ....

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #1 en: Sábado 10 de Septiembre de 2005, 16:07 »
0
deberías aprender sobre lo que es un Game Loop Básico.
fijate este enlace

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #2 en: Sábado 10 de Septiembre de 2005, 19:28 »
0
Mira un game loop basico claro que si se hacer pero la idea es hacer un procedimiento en el cual pueda utilizar la misma velocidad para cualquier PC haci esta tenga 2GB de memoria ... eso creo que se hace en assembler.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #3 en: Sábado 10 de Septiembre de 2005, 19:58 »
0
Esa es la idea de un game Loop, no importa de la velocidad de la máquina, el game Loop se tiene que ejecutar  K veces por segundo.
Tomas el tiempo inicial, y al final, el tiempo final, si la diferencia entre los dos no es suficiente, empiezas a tomar el tiempo final hasta que la diferencia sea la que se adapte a los FPS que estas buscando.
Fijate en el link que te pase. Está bastante claro eso.
Por sierto, la memoría que tengas no afecta a la velocidad del juego, no mucho.... Lo que lo afecta es la velocidad de tu Procesador.

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #4 en: Sábado 17 de Septiembre de 2005, 23:27 »
0
Hola a todos los programadores en pascal ... hace unos dias intente hacer un juego con calidad pero este juego corre muy rapido en las computadoras PIV o PIII , es decir en diversos tipos de procesadores corre con diferente velocidad ... como hago para que este corra con la misma velocidad en todos los ordenadores.
Hace unos dias Enko me dio una solucion de un game loop basico pero no le entiendo nada... pues le pediria q lo escriba en pascal. y q tome en cuenta q va ha correr con la misma VELOCIDAD EN TODOS LOS ORDENADORES!!!!!!.
gracias.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #5 en: Domingo 18 de Septiembre de 2005, 15:28 »
0
no encontré uno de Pascal pero tengo uno documentado para Delphi....
Código: Text
  1.  
  2. {===============================================================}
  3. {                                                               }
  4. {              File: unt_Game.pas                               }
  5. {        Created By: Name Goes Here                             }
  6. {       Modified By: N/A                                        }
  7. {     Creation Date: N/A                                        }
  8. {  Last Modified On: N/A                                        }
  9. {                                                               }
  10. {       Description: Simple template for a game in Delphi.      }
  11. {                                                               }
  12. {---------------------------------------------------------------}
  13. {  Copyright © XXXX-XXXX                   All Rights Reserved  }
  14. {===============================================================}
  15.  
  16. UNIT unt_Game;
  17.  
  18.  
  19. {==============================================================================}
  20.   INTERFACE
  21.   USES Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  22. {==============================================================================}
  23.  
  24.   {Global DataType / Constant / Variable Declarations}
  25. {------------------------------------------------------------------------------}
  26.  
  27.   TYPE
  28.     TGameState = (gsDemo, gsPlaying, gsIntermission, gsPaused, gsGameOver);
  29.  
  30.     Tfrm_Game = class(TForm)
  31.       procedure FormCreate(Sender: TObject);
  32.       procedure OnIdleHandler(Sender: TObject; var Done: Boolean);
  33.       procedure FormClose(Sender: TObject; var Action: TCloseAction);
  34.     private
  35.       { Private declarations }
  36.     public
  37.       { Public declarations }
  38.     end;
  39.  
  40.   CONST
  41.     Throttle = trunc(1000 / 30); {30fps Throttle}
  42.  
  43.   VAR
  44.     frm_Game: Tfrm_Game;
  45.     GameRunning: Boolean;
  46.     GameState: TGameState;
  47.  
  48.   {Function / Procedure ProtoTypes}
  49. {------------------------------------------------------------------------------}
  50.  
  51.   {None needed yet}  {mainly used for forward delcarations}
  52.  
  53.  
  54. {==============================================================================}
  55.   IMPLEMENTATION {$R *.DFM}
  56. {==============================================================================}
  57.  
  58.   {Game Event Handlers}
  59. {------------------------------------------------------------------------------}
  60.  
  61. procedure Pause(MilliSeconds: Integer);
  62.   var
  63.     CurrentTime: LongInt;
  64.     PauseTime: LongInt;
  65.   begin
  66.     CurrentTime := GetTickCount;
  67.     PauseTime := CurrentTime + MilliSeconds;
  68.     while CurrentTime < (PauseTime) do begin
  69.       Application.ProcessMessages;
  70.       CurrentTime := GetTickCount;
  71.     end;
  72.   end;
  73.  
  74. procedure doDemo();
  75.   begin
  76.   //Display automated demonstration/intro here
  77.     Application.ProcessMessages;
  78.   end;
  79.  
  80. procedure doPlaying();
  81.   begin
  82.   //Perform all gameplay here
  83.     Application.ProcessMessages;
  84.   end;
  85.  
  86. procedure doIntermission();
  87.   begin
  88.   //Perform inter-level loads etc. here
  89.     Application.ProcessMessages;
  90.   end;
  91.  
  92. procedure doPause();
  93.   begin
  94.   //Pause gameplay here
  95.     Application.ProcessMessages;
  96.   end;
  97.  
  98. procedure doGameOver();
  99.   begin
  100.   //Display game over screen and cleanup here
  101.     Application.ProcessMessages;
  102.   end;
  103.  
  104. procedure GameLoop();
  105.   var
  106.     TimeIndex: LongInt;
  107.   begin
  108.     while GameRunning do begin
  109.     //Record time before processing
  110.       TimeIndex := LongInt(GetTickCount);
  111.     //Process game
  112.       case GameState of
  113.         gsDemo: doDemo;
  114.         gsPlaying: doPlaying;
  115.         gsIntermission: doIntermission;
  116.         gsPaused: doPause;
  117.         gsGameOver: doGameOver;
  118.       end;
  119.     //Calculate time it took to process
  120.       TimeIndex := LongInt(GetTickCount) - TimeIndex;
  121.     //Pause if it was too quick
  122.       if (TimeIndex < Throttle) then begin
  123.         Pause(Throttle - TimeIndex);
  124.       end;
  125.       Application.ProcessMessages;
  126.     end;
  127.   end;
  128.  
  129.  
  130.   {Form Event Handlers}
  131. {------------------------------------------------------------------------------}
  132.  
  133. procedure Tfrm_Game.OnIdleHandler(Sender: TObject; var Done: Boolean);
  134.   begin
  135.     GameLoop;
  136.   end;
  137.  
  138. procedure Tfrm_Game.FormCreate(Sender: TObject);
  139.   begin
  140.     GameState := gsDemo;
  141.     GameRunning := True;
  142.     Application.OnIdle := OnIdleHandler;
  143.   end;
  144.  
  145. procedure Tfrm_Game.FormClose(Sender: TObject; var Action: TCloseAction);
  146.   begin
  147.     GameRunning := False;
  148.   end;
  149.  
  150.  
  151. {===============================================================}
  152. { Copyright © XXXX-XXXX                     All Rights Reserved }
  153. {===============================================================}
  154.  
  155. END.
  156.  
  157.  

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #6 en: Domingo 18 de Septiembre de 2005, 15:31 »
0
Ahi va un game loop verificado:  :D

Código: Text
  1.  
  2. program gameloop;
  3. uses dos,crt2;{sin bug}
  4. var
  5.   G_CONTADOR_DE_FRAMES:integer;
  6. const
  7.   {Nota: No soporta menos de 5 por granularidad de 54ms}
  8.   intervalo_entre_ticks=5;{0.05 segundos, unos 20fps}
  9.  
  10.   procedure dibujarFrame;
  11.   var
  12.   Hour, Minute, Second, Sec100: word;
  13.   begin
  14.   getTime(Hour, Minute, Second, Sec100);
  15.   writeln('­Hola mundo! ',G_CONTADOR_DE_FRAMES,' * ',hour,':',minute,':',second,'.',sec100);
  16.   inc(G_CONTADOR_DE_FRAMES);
  17.   end;
  18.  
  19.   procedure realizarBucleMaestro;
  20.  
  21.   function ticks:longint;
  22.   var
  23.     Hour, Minute, Second, Sec100: word;
  24.   begin
  25.     {granularidad: t¡picos 54ms}
  26.     {nota: optimizar con asm}
  27.     getTime(Hour, Minute, Second, Sec100);
  28.     ticks:=sec100+second*100+minute*6000+hour*360000;
  29.   end;
  30.  
  31.   var
  32.   finalizarBucle:boolean;
  33.   tiempo,tiempoAnterior:longint;
  34.   kbd:char;
  35.   begin
  36.   tiempoAnterior:=ticks;
  37.   finalizarBucle:=false;
  38.   repeat
  39.     tiempo:=ticks;
  40.     {evitando bug de media noche}
  41.     if tiempo<tiempoAnterior then tiempoAnterior:=tiempo;
  42.     {control de intervalo}
  43.     if tiempo-tiempoAnterior>=intervalo_entre_ticks then
  44.     begin
  45.     tiempoAnterior:=tiempo;
  46.     dibujarFrame;
  47.     end;
  48.     {procesar teclas presionadas y otros eventos}
  49.     while keypressed=true do
  50.     begin
  51.     kbd:=readkey;
  52.     case kbd of
  53.       #27:exit;
  54.     end;
  55.     end
  56.   until finalizarBucle;
  57.   end;
  58.  
  59. begin
  60.   realizarBucleMaestro;
  61. end.
  62.  
  63.  

P.D. Al hacer copy paste se perdió algo de la tabulación :P

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #7 en: Domingo 18 de Septiembre de 2005, 22:13 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Un Game Loop Basico?
« Respuesta #8 en: Lunes 19 de Septiembre de 2005, 04:12 »
0
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.
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.