This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
es:orx:tutorials:physics [2012/03/03 09:17 (13 years ago)] – [Detalles] zera | es:orx:tutorials:physics [2020/08/19 21:14 (5 years ago)] (current) – Old content sausage | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tutorial de Física ====== | ||
- | |||
- | |||
- | |||
- | ===== Sumario ===== | ||
- | |||
- | Ver los anteriores [[main# | ||
- | |||
- | Este tutorial muestra como añadirle propiedades físicas a los objetos y manejar colisiones. | ||
- | |||
- | Como puedes ver, las propiedades físicas son completamente manipuladas por datos. Así, creando un objeto con propiedades físicas (ej. con un cuerpo) o sin ellas, resulta en exactamente la misma linea de código. | ||
- | |||
- | Los objetos pueden ser enlazados a un cuerpo, que puede ser estático o dinámico.\\ | ||
- | Cada cuerpo puede estar hecho de hasta 8 partes. | ||
- | |||
- | Un cuerpo es definido por: | ||
- | * su forma (actualmente caja, esfera y malla(ej. poligono convexo) son los únicos disponibles) | ||
- | * información acerca del tamaño de la forma (esquinas para la caja, centro y radio para la esfera, vértices para la malla) | ||
- | * si el tamaño de los datos no es especificado, | ||
- | * las banderas propias de colisión definen esta parte | ||
- | * la máscara de chequeo de colisión define con que otra parte ella puede colisionar ((dos partes en el mismo cuerpo nuncá colisionarán)) | ||
- | * una bandera sólida('' | ||
- | * varios atributos como son restitución, | ||
- | |||
- | En este tutorial creamos muros estáticos sólidos alrededor de la pantalla. Entonces reproducimos cajas en el medio.\\ | ||
- | El número de cajas creadas serán ajustadas a través del fichero de configuración y es 100 por defecto. | ||
- | |||
- | La única interacción posible es usando los botones izquierdo y derechos del ratón (o las teclas izquierda y derecha) para rotar la cámara.\\ | ||
- | Como mismo lo rotamos, podemos actualizar el vector de gravedad de nuestra simulación.\\ | ||
- | Haciendo eso, nos da la impresión de que las cajas siempre están cayendo contra el fondo de nuestra pantalla, no importa como la cámara es rotada. | ||
- | |||
- | Registramos también los eventos físicos para añadir un FX visual en los dos objetos que colisionan.\\ | ||
- | Por defecto el FX es un parpadeo de color rápido y es, como norma, ajustable en tiempo real (ej. recargando la configuración histórica aplicaremos los nuevos ajustes inmediatamente si el FX no se mantiene en la cache por defecto). | ||
- | |||
- | Actualizando la escala de un objeto (incluso cambiando su escala con FXs) actualizaremos sus propiedades físicas (ej. su cuerpo).\\ | ||
- | Ten en mente que escalando un objeto con cuerpo físico es más caro que si tenemos que eliminar la correspondiente forma y recreándolo en tamaño correcto.\\ | ||
- | Esto está hecho de esta manera ya que nuestro correspondiente plugin físico está basado en Box2D, que no permite rescalado en tiempo real de formas. | ||
- | |||
- | Este tutorial solo nos muestra un control básico de físicas y colisiones, pero, por ejemplo, tú puede también ser notificado con eventos por objetos separados o mantener el contacto. | ||
- | ===== Detalles ===== | ||
- | |||
- | Como es usual, empezamos por cargar nuestro fichero de configuración, | ||
- | Por favor, referirse a los [[main# | ||
- | |||
- | Creamos también nuestros muros. Actualmente no los crearemos uno por uno, los agrupamos en una lista de hijos('' | ||
- | |||
- | <code c> | ||
- | |||
- | Esto luce como si hubiéramos creado un solo objeto llamado '' | ||
- | |||
- | Por último, creamos nuestras cajas. | ||
- | |||
- | <code c>for(i = 0; i < orxConfig_GetU32(" | ||
- | { | ||
- | orxObject_CreateFromConfig(" | ||
- | }</ | ||
- | |||
- | Como puedes ver, no especificamos nada respecto a las propiedades físicas de nuestros muros o cajas, eso es enteramente hecho en el fichero de configuración y completamente manejado por datos. | ||
- | |||
- | Registramos entonces los eventos físicos. | ||
- | |||
- | <code c> | ||
- | |||
- | Nada realmente nuevo hasta aquí, miremos directamente a nuestra llamada de retorno '' | ||
- | |||
- | <code c> | ||
- | { | ||
- | orxOBJECT *pstObject1, | ||
- | |||
- | pstObject1 = orxOBJECT(_pstEvent-> | ||
- | pstObject2 = orxOBJECT(_pstEvent-> | ||
- | |||
- | orxObject_AddFX(pstObject1, | ||
- | orxObject_AddFX(pstObject2, | ||
- | }</ | ||
- | |||
- | Básicamente, | ||
- | |||
- | Veamos ahora nuestra función '' | ||
- | |||
- | < | ||
- | { | ||
- | orxFLOAT fDeltaRotation = orxFLOAT_0; | ||
- | |||
- | if(orxInput_IsActive(" | ||
- | { | ||
- | fDeltaRotation = orx2F(4.0f) * _pstClockInfo-> | ||
- | } | ||
- | if(orxInput_IsActive(" | ||
- | { | ||
- | fDeltaRotation = orx2F(-4.0f) * _pstClockInfo-> | ||
- | } | ||
- | |||
- | if(fDeltaRotation != orxFLOAT_0) | ||
- | { | ||
- | orxVECTOR vGravity; | ||
- | |||
- | orxCamera_SetRotation(pstCamera, | ||
- | |||
- | if(orxPhysics_GetGravity(& | ||
- | { | ||
- | orxVector_2DRotate(& | ||
- | orxPhysics_SetGravity(& | ||
- | } | ||
- | } | ||
- | }</ | ||
- | |||
- | Como puedes ver, obtenemos la actualización desde las entradas '' | ||
- | Si una rotación necesita ser aplicada, entonces actualizamos nuestra cámara con '' | ||
- | De esta manera, nuestras cajas siempre parecerán que caen al fonde de nuestra pantalla, sin importar la rotación de la cámara.\\ | ||
- | Note el uso de '' | ||
- | |||
- | //PD: Todas las rotaciones en el código de orx siempre son expresadas en radianes!// | ||
- | |||
- | ===== Recursos ===== | ||
- | |||