Estoy usando C # / XNA y me han dicho varias veces que no mezcle el código de actualización con el código de dibujo, ¡y estoy seguro de que no lo soy! Pero, ¿podría alguien describir qué es exactamente el "código lógico"?
Como se ve aquí: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] asegúrate de poner toda la lógica del juego dentro del método de actualización (¡no en Draw!) y todo funcionará a una velocidad constante y agradable.
Lo pregunto ya que la velocidad de mi juego fluctúa en relación con el FPS. Slow FPS equivale a objetos que se mueven lentamente y viceversa. Y sí, estoy incluyendo el position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
código esperado .
Esta es probablemente una gran pregunta para los novatos, pero solo quiero ser absolutamente claro en la definición de esto.
fuente
position = speed * ...TotalSeconds
. Note que=
no lo es+=
. Si fuera+=
tal como lo escribió, su posición saldría volando de la pantalla casi instantáneamente.gt.ElapsedGameTime.TotalSeconds
es el número de segundos transcurridos desde el inicio del programa (juego). Si está multiplicando su velocidad por eso, luego de 5 segundos de juego, su velocidad será 5 veces más rápida (excepto el caso especial donde la velocidad se establece en 0). No estoy seguro de qué más podría tener que haga que eso sea falso, pero estoy intrigado.iii
que incremente manualmente cada actualización, porque no la quiero en segundos, quiero pasos o marcos. Sin embargo, puedo ver que tu camino es una forma válida de codificar cosas.Respuestas:
¿Cambia el estado de tu mundo de juego? Es un código lógico.
¿Muestra el estado del mundo del juego? Es el código de representación.
fuente
Su separación es correcta si:
fuente
Draw()
puede dibujar diferentes imágenes a medida que pasa el tiempo. Por ejemplo, los cuadros de sprites animados pueden seguir cambiando. Además, los objetos pueden continuar avanzando visualmente si el código de representación utiliza un truco común y se agregavelocity * time since last update / period of update
a la posición visible de los objetos (mientras su posición real permanece sin cambios).iff
lo que significa si y solo si?Update
qué más está saliendo de la sincronización? ¿Se han perdido las entradas del reproductor, los eventos de red no se están procesando, etc.? El juego debe ser impulsado desde un solo reloj, con "ticks" fijos para la lógica o física del juego derivadas de ese reloj, y el estado gráfico derivado también impulsado por ese mismo reloj.Draw()
de tal manera que siempre dibuja la misma imagen cuando se te llama varias veces seguidas. Uno debería hacer eso si es posible. Pero hay casos en los que no sabe a qué frecuenciaDraw()
se llamará. Por ejemplo, si desea soporte completo (120 FPS reales) para los nuevos monitores de 120Hz y activa vsync.What if I want to pause graphics?
Luego pasa 0 en lugar del tiempo delta real alDraw()
.0
. Puede tener relojes jerárquicos, por ejemplo, la interfaz de usuario todavía se ejecuta y anima mientras la interpolación de caracteres también se detiene, muy, muy fácilmente.El punto aquí es la separación de las cosas del Modelo que no son el modelo.
La lógica del juego es el modelo mencionado en
Todos estos son patrones de arquitectura de software diferentes y relacionados. Pero en todos los casos, el Modelo es lo mismo, es la lógica real y el estado real.
Es cuando se hace software comercial, a veces se le llama lógica comercial y codifica algunas de las políticas comerciales. Por ejemplo, si está codificando algo para un banco, para calcular las facturas de tarjetas de crédito, entonces la funcionalidad para hacer que alguien no tenga que pagar intereses si cancela su deuda en menos de 30 días, es parte de la lógica comercial, vive en el modelo. Por ejemplo, no vive en una de las capas de visualización. El código para imprimir una factura, por ejemplo, no edita el texto en función de sus acciones. Este ejemplo quizás resalta por qué es posible que desee organizar su código de esa manera.
Similar va para la lógica del juego.
Imagina que en algún momento tu juego fue trasladado a otra consola. Puede ser útil imaginar algo realmente diferente a su objetivo actual. Por ejemplo, si está apuntando a algo con un gamepad / controlador, imagine que su juego se transfiere a una tableta con pantalla táctil. La lógica del juego es la parte del código que no cambia cuando lo portas.
Si tu juego fuera algo así como un juego de estrategia militar, imagina que se convierte en el juego de mesa más complejo del mundo. La lógica del juego son las secciones de código, que corresponden directamente a las líneas del libro de reglas. (No todas las líneas en el libro de reglas, no las que tratan de mover piezas, pero algunas).
La lógica del juego es lo que nunca cambia, sin importar la forma.
fuente