Exportar (0) Imprimir
Expandir todo

¿Qué es un bucle de juego?

XNA Game Studio 4.0
La clase Game de XNA Framework implementa un bucle de juego, el cual no solo proporciona la ventana que muestra el juego, sino que también proporciona métodos que se pueden sobrecargar y que el juego implementa para facilitar la comunicación entre el juego y el sistema operativo.

Esta introducción se ocupa de los temas siguientes.

Creación de un nuevo juego

El primer paso en la creación de un juego nuevo es hacer una clase que derive de Game. La nueva clase debe sustituir a Update, Draw y Initialize. El método Update se encarga de la lógica del juego, y el método Draw se encarga de dibujar cada marco. El método Initialize se encarga de la configuración del juego antes de establecer el primer marco del juego.

Control de tiempo para el bucle de juego

Un Game es un paso fijo o variable; siendo el primero el valor predeterminado. El tipo de paso determina la frecuencia con la que se llamará a Update y afecta a cómo se deben representar los procedimientos basados en tiempo, tales como el movimiento o la animación.

Bucles de juego de paso fijo

Un Game de paso fijo intenta llamar a su método Update en el intervalo fijo especificado en TargetElapsedTime. Si se establece Game.IsFixedTimeStep en true, provocará que Game use un bucle de juego de paso fijo. Un proyecto XNA nuevo usa un bucle de juego de paso fijo con un TargetElapsedTime predeterminado de 1/60 de segundo.

En un bucle de juego de paso fijo, Game llama a Update cuando ha transcurrido el TargetElapsedTime. Después de llamar a Update, si no es el momento de volver a llamar a Update, Game llama a Draw. Tras llamar a Draw, si no es el momento de volver a llamar a Update, Game se queda inactivo hasta que sea el momento de llamar a Update.

Si Update tarda mucho en procesarse, Game define IsRunningSlowly en true y vuelve a llamar a Update, sin llamar a Draw entre una y otra llamada. Cuando una actualización tarda más que el TargetElapsedTime, la respuesta de Game es llamar a Update varias veces y descarta los marcos asociados con esas actualizaciones para ponerse al día. De esta forma se garantiza que se habrá llamado a Update el número de veces esperado cuando el bucle de juego se recupere de una ralentización. Puede consultar el valor de IsRunningSlowly del Update si quiere detectar los marcos que se han descartado y acortar el procesamiento de Update de forma que quede compensado. Para restablecer los tiempos transcurridos, llame a ResetElapsedTime.

Si se pausa el juego temporalmente en el depurador, Game no hará llamadas extra a Update cuando se reanude el juego.

Bucles de juego de paso variable

Un juego de paso variable llama a sus métodos Update y Draw en un bucle continuado sin tener en cuenta el TargetElapsedTime. Si se establece Game.IsFixedTimeStep en false, provocará que Game use un bucle de juego de paso variable.

Animación y control de tiempo

Para las operaciones que requieran un control de tiempo preciso (por ejemplo, la animación), el tipo de bucle de juego que usa el juego (de paso fijo o variable) es determinante.

Si se usa un paso fijo, es posible que la lógica del juego use el TargetElapsedTime como su unidad de tiempo básica y se presupone que se llamará a Update según ese intervalo. Si se usa un paso variable, es necesario que la lógica del juego y el código de animación estén basados en ElapsedGameTime para garantizar que el juego discurra si interrupciones. Debido a que se llama al método Update inmediatamente después de que se dibuje el marco anterior, puede que varíe el tiempo entre las llamadas a Update. Si no se tiene en cuenta el tiempo entre una llamada y otra, dará la impresión de que el juego se acelera y ralentiza. El tiempo que transcurre entre una llama y otra al método Update está disponible en el parámetro gameTime del método Update. Para restablecer los tiempos transcurridos, llame a ResetElapsedTime.

Si se usa un bucle de juego de paso variable, debe expresar las velocidades (como la distancia que se desplazan los sprites) en unidades de juego por milisegundo (ms). En ese caso, la distancia que se desplacen los sprites en cualquier actualización se podrá calcular como la velocidad del sprite multiplicada por el tiempo transcurrido. Si se usa este método para calcular la distancia que recorre el sprite, se garantiza que este se desplazará de forma constante si varía la velocidad del juego o del equipo.

Componentes del juego

Los componentes del juego proporcionan una forma modular de agregar funcionalidad al juego. Un componente del juego se crea al derivar el nuevo componente a partir de la clase GameComponent o, si el componente carga y dibuja el contenido gráfico, a partir de la clase DrawableGameComponent. A continuación se agrega la lógica del juego y el código de representación al componente del juego; para ello, se invalidan GameComponent.Update,DrawableGameComponent.Draw y GameComponent.Initialize. Para que los componentes del juego se registren con un juego, se pasa el componente a Game.Components.Add. A los métodos de dibujo, actualización e inicialización de los componentes registrados se les llamará desde los métodos Game.Initialize, Game.Update y Game.Draw.

Servicios del juego

Los servicios del juego son un mecanismo para mantener un acoplamiento flexible entre los objetos que tienen que interactuar entre sí. Los servicios funcionan a través de un mediador (en este caso, Game.Services). Los proveedores de servicios se registran con Game.Services, y los consumidores del servicio solicitan servicios desde Game.Services. Este mecanismo permite que los objetos que requieran un servicio lo soliciten sin necesidad de saber el nombre del proveedor de servicios.

Los servicios del juego se definen mediante una interfaz. Una clase especifica los servicios que proporciona; para ello, implementa las interfaces y registra los servicios con Game.Services. Para registrar un servicio, se llama a Game.Services.AddService y se especifica el tipo de servicio que se va a implementar y una referencia al objeto que proporciona el servicio. Por ejemplo, para registrar un objeto que proporcione un servicio que representa la interfaz IMyService, se debe usar el código siguiente.

Services.AddService( typeof( IMyService ), myobject );    

Una vez registrado el servicio, se puede recuperar el objeto que proporciona el servicio con Game.Services.GetService y especificando el servicio que se quiere. Por ejemplo, para recuperar IGraphicsDeviceService, debe usar el código siguiente.

IGraphicsDeviceService graphicsservice = (IGraphicsDeviceService)Services.GetService( typeof(IGraphicsDeviceService) );    

Componentes del juego que consumen servicios del juego

La clase GameComponent proporciona la propiedad Game para que un GameComponent pueda determinar a qué Game se vincula. Con la propiedad Game, un GameComponent puede llamar a Game.Services.GetService para buscar un proveedor de un servicio en particular. Por ejemplo, un GameComponent puede encontrar al proveedor de IGraphicsDeviceService a través del código siguiente.

IGraphicsDeviceService graphicsservice = (IGraphicsDeviceService)Game.Services.GetService( typeof( IGraphicsDeviceService ) );      

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft