Generalidades

Flutter and Flames: Física por Christian Muehle | Medium

Flutter and Flames Fisica por Christian Muehle Medium
fotógrafo Andrés Jorge existe sin salpicaduras
Christian Müller

Simular la física en tu juego te permite replicar el comportamiento real de los objetos que interactúan entre sí. Forge2D se puede usar como un motor de física prefabricado en su juego Flame.

Agregaremos Forge2D a nuestro juego MoonLander y, al momento de escribir este artículo, todavía necesitamos actualizar todas las partes del juego. MoonLander se creó en una serie de artículos; comience con el primero a continuación si está interesado.

Todos los cambios de código serán forja2D Bifurcaciones en repositorios públicos de GitHub:

fotógrafo Fazir Abi existe sin salpicaduras

Forge2D se basa en otro motor de física de código abierto llamado Box2D:

convertirse en 100% exacto: Forge2D es caja2D (Transformación de dardo para Box2D). Puede usar Forge2D sin Flame en cualquier aplicación de Flutter/Dart, pero el ecosistema de Flame también proporciona un paquete de integración:

fotógrafo carga de aaron existe sin salpicaduras

En Forge2D, puede simular cuerpos, elementos del juego en el mundo junto con otros cuerpos. Antes de llegar al código real, permítanme describir los elementos que usaremos más adelante en el código.

mundo

El mundo contiene todos tus cuerpos (elementos del juego, como tu jugador) y es responsable de los cálculos físicos, que también incluyen la gravedad (por así decirlo).como el tuyo juego de fuego, El mundo tiene un método de actualización llamado paso Dt Manejará todas las colisiones en función del tiempo transcurrido (esto es dt de) desde la última llamada.

Carrocería y Accesorios

Cada elemento del mundo físico está representado por un objeto. El cuerpo debe tener una posición y tipo, aquí hay una descripción general de los tipos de cuerpo existentes:

estática – forma del cuerpo

Los elementos estáticos no tienen masa ni velocidad, también responden a las fuerzas (los objetos estáticos todavía se pueden mover por código). Un ejemplo de elemento estático podría ser el suelo de un nivel. Los objetos estáticos no chocan con otros objetos estáticos o en movimiento.

Kinesiología – Tipo de cuerpo

Los objetos en movimiento se mueven según una velocidad determinada en una simulación física, pero no responden a las fuerzas. Un cuerpo en movimiento no tiene masa. No chocan con entidades estáticas u otras entidades en movimiento. Un buen ejemplo sería una plataforma móvil en un nivel que debería moverse a lo largo de un camino pero no ser apartada cuando el jugador salta sobre ella.

Dinámico – Tipo de cuerpo

El último tipo es un cuerpo dinámico, que tiene masa, se mueve según una velocidad dada y responde a fuerzas. Las entidades dinámicas chocan con todos los demás tipos de entidades (por defecto). Tu personaje de jugador será un cuerpo dinámico.

Accesorios – Da forma a tu cuerpo

Las plantillas describen el tamaño y la forma de tu cuerpo, y deberás agregar al menos una para cada una. Forja2D Viene con formas preconstruidas para representar tu cuerpo (círculo, rectángulo, polígono, etc.). Los accesorios también describen otras propiedades físicamente relevantes, como la densidad, la fricción y la recuperación.

Forge2D contiene más opciones y elementos interesantes, pero con la solución anterior finalmente podemos comenzar con algo de código;)

fotógrafo NASA existe sin salpicaduras

Lo primero que hacemos es agregar la nueva dependencia a nuestro archivo pubspec.yml:

flame_forge2d: ^0.8.3

Como se mencionó, esto incluye Forge2D y algunas clases auxiliares preconstruidas para integrarlo en juego de llamas.
El siguiente paso será «crear un mundo», puedes hacerlo tú mismo o usar la nueva clase base para tu juego:

Forge2DGame

Usando la nueva clase base anterior, obtienes un mundo, un zoom predeterminado (más sobre eso a continuación) y una gravedad predeterminada hacia abajo.el constructor de juego de forja Ambos se pueden configurar si lo desea, para MoonLander usamos lo siguiente:

La gravedad se aplica a su cuerpo en cada paso del mundo, y no necesita hacer nada al respecto (limitado a los tipos de cuerpo dinámicos como se describe anteriormente, por supuesto).

Buena pregunta: la respuesta corta es: no lo necesita para usar Forge2D, pero usar Flame facilita algunas cosas. Box2D (recuerde, el proyecto en el que se basa Forge2D) y Forge2D son mejores para simular objetos dentro del rango 0,1 ma 10 m (Ver «¿Qué unidades usa Box2D?»). Si el objeto se vuelve demasiado grande o demasiado rápido, la simulación física puede volverse imprecisa/nerviosa. El uso de la escala le permite definir objetos dentro de ese rango de tamaño pero aun así dibujarlos en el tamaño apropiado. Otra opción es transformar su física y los objetos dibujados definiendo un factor de escala, la escala predeterminada se realiza por usted.

Veamos qué tenemos que hacer por nuestros componentes de cohetes Vive en el mundo físico. Según lo que hemos aprendido, debemos hacer lo siguiente:

  1. Redimensionar para respetar el zoom
  2. Asegúrese de que nuestro cohete tenga un cuerpo con una definición coincidente
  3. Ajustar cómo lo movemos

El primer paso, como nuestro juego de llamases cambiar la clase base a componentes del cuerpo Esta nueva clase base proporciona devoluciones de llamada para la creación de cuerpos y ayuda adicional, como dibujar formas de depuración.Importante saber: Un objeto en el mundo físico, como nuestro componentes del cuerpoPor defecto no hay representación visual.
Antes de agregar el sprite, creemos el cuerpo del cohete. Como se mencionó anteriormente, componentes del cuerpo La clase proporciona un método para esto:

Comenzamos definiendo la forma del cuerpo del cohete. Elegiremos un círculo con un radio de la mitad del tamaño del eje x. Por supuesto, un círculo no es una representación perfecta de nuestro cohete, pero funciona por ahora y finalmente debería funcionar para nuestro tipo de juego.
Recuerde que el radio que establecemos aquí es en metros porque componentes de cohetes Establecemos el tamaño de x: 3.2 e y: 4.8 para obtener un círculo con un área de aproximadamente 8m².
Después de la forma, configuramos más detalles para nuestro Fixture (el elemento que representa el tamaño y la forma de nuestro cuerpo). La configuración más importante para nosotros en este momento es la densidad (en kg/m²), por lo que nuestro cohete pesa alrededor de 8 kg (esto será importante una vez que quieras empujar el cohete).

La última parte es definir nuestro cuerpo proporcionando ubicación y tipo. Nuestro cohete tiene que ser un objeto dinámico, tiene que reaccionar a las fuerzas (como la gravedad) y debe chocar con todos los demás tipos de objetos. En el paso final, le pedimos al mundo que cree un cuerpo por definición y que cree accesorios en ese cuerpo.
Un cuerpo puede contener múltiples accesorios al mismo tiempo, pero nuestro cohete solo necesita uno.

Ejecutar el juego ahora crea una vista completamente rota, los elementos en la pantalla están fuera de lugar, los cohetes no tienen imágenes, etc.
Primero abordemos las imágenes del cohete: creamos una nueva clase que finalmente contiene el código «relacionado con las imágenes» de antes (hasta cierto punto):

Ahora podemos agregar este componente como un subcomponente al componente del cuerpo del cohete. carga método:

Establezca el punto de anclaje del componente del cohete del sprite en el centro y colóquelo en (0,0) para que el sprite se coloque correctamente al lado del cuerpo físico. El componente sprite ahora es un subcomponente del cuerpo físico y se moverá con él en el mundo físico.
Si bien hemos cubierto los aspectos visuales del cohete, necesitamos modificar las partículas del motor y las explosiones para que funcionen. Comencemos con las partículas del escape del motor:

Como puede ver, ahora tenemos que tomar la posición del cuerpo para esto (usar la posición del sprite siempre da como resultado 0,0) y voltear el eje y (más sobre eso más adelante).debemos Componentes explosivos en nuestro suelto Métodos (solo mostrando diferentes formas de cambiar el vector):

Por supuesto, las partículas y las explosiones tienen tamaños actualizados (recuerda, el juego es 10 veces más grande). Ahora debemos ajustar los elementos visuales, para resumir lo que hicimos:

  • Una componentes del cuerpo No tiene ningún efecto visual y requiere un cuerpo con al menos un accesorio para ser simulado por el mundo.
  • Puede agregar niños a componentes del cuerpo Puede basarse en componentes de llama «normales» como componente de sprites)
  • Recuerda que tienes una actividad de zoom, recuerda esto para establecer el tamaño del componente visual
  • El eje y del mundo de la física se invierte, si desea dibujar un sprite en la posición del cuerpo, y no es un componente secundario, invierta la coordenada y
fotógrafo artur tumasian existe sin salpicaduras

¿Impulsividad, compulsión y transformación?

Podemos dibujar el componente nuevamente 🙂 Así que ahora también queremos que el cohete se mueva de acuerdo con el movimiento de nuestro joystick virtual. Debido a que nuestro mundo ahora tiene gravedad, ya no tenemos que cuidarlo. Antes de mostrarte el código para mover un cohete, me gustaría presentarte las diferentes formas de «mover» un objeto.

impulso

Los impulsos cambian instantáneamente la velocidad de un objeto, Aplicar pulso lineal El método se utiliza para aplicar un pulso en un punto dado (el centro del cuerpo por defecto). También puedes usarlo para rotar tu cuerpo. La unidad de fuerza es Newton-segundo, y 1 Newton es la fuerza requerida para mover un objeto de 1 kg en la dirección opuesta a la fuerza a una velocidad de 1 m/s².

fuerza

Las fuerzas no cambian la velocidad inmediatamente, necesitan cambiar la velocidad de un objeto con el tiempo. Imagínelo como un automóvil que lentamente comienza a empujar a otro automóvil, donde los impulsos chocan a toda velocidad. Al igual que el impulso, la fuerza se expresa en Newton-segundos.

cambio

Las transformaciones no son realmente un concepto basado en la física, es más como lanzar un cuerpo a una ubicación determinada.En nuestro juego usamos esto para reiniciar componentes de cohetes posición de regreso al punto de partida.

fotógrafo NASA existe sin salpicaduras

mueve nuestro cohete

El código anterior muestra que estamos en un impulso. En el momento en que se enciende el motor, nuestro cohete cambiará su velocidad según la dirección del joystick.
Para asegurar que la aceleración de nuestros impulsos esté dentro de límites razonables, (como antes) usamos velocidad variable (ajustada a 0,1). Tenga en cuenta que nuestro cohete tiene una masa total de aproximadamente 8 kg y debemos mantener la velocidad dentro de los límites máximos de Forge2D (abordaremos esto en el próximo artículo).

Teniendo en cuenta nuestra lista, también tuvimos que actualizar nuestra Información de cohetes componentes y Montaje de joystick. nada especial Información de cohetes Para ser honesto, usamos directamente tamaño del lienzo Propiedades para nuestra referencia de juego (recuerde, este es un componente viewport/HUD, Tipo de ubicacion configurado en ventana gráfica) para evitar tener que lidiar con el tamaño o la escala del mundo del juego.

Usamos un enfoque similar para la posición del joystick, pero quería mostrar una característica interesante juego de forja, puede usar la cámara para convertir entre coordenadas mundiales y de pantalla:

camera.worldToScreen(Vector2)
//OR
camera.screenToWorld(Vector2)

Con esto, podemos crear el JoystickComponent de la siguiente manera:

Tomamos el tamaño del juego (con la escala mundial aplicada) y lo volvemos a convertir al tamaño de la pantalla.

Aprendimos que Forge2D se puede usar con Flame y proporciona algunas clases prefabricadas para admitir la adición de objetos físicos a su juego. Cualquier objeto físico vive en una simulación de un mundo y tiene un objeto que describe sus propiedades. Según el tipo de cuerpo, se comportan de manera diferente en la simulación, por ejemplo, no se ven afectados por la gravedad mundial.
También aprendimos que el eje y está invertido, y juego de forja La clase viene con una escala predeterminada para evitar que las personas tengan un cuerpo demasiado grande.
Actualmente, todavía tenemos bastantes elementos que manejar en nuestro código de juego:

  1. Llevando la generación de mapas al mundo físico
  2. arreglar la cámara
  3. Agregar detección de colisión entre elementos
  4. Límite de velocidad para evitar exceder los límites de Forge2D

Los cambios irán a la rama mencionada al principio, el próximo artículo cubrirá los puntos principales y más detalles sobre el trabajo de integración.

Intente encender el mundo de la física y vea si puede descubrir cómo maneja el contacto / colisión con el cuerpo del jugador.

LEER  Integración de Rust con el desarrollo de Android | Por Kofi Otto | Febrero de 2022

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba