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 10:40 (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!// | ||
- | |||
- | Let's now have a look at our config data. You can find more info on the config parameters in the [[en: | ||
- | First, we created implicitely many walls using the '' | ||
- | |||
- | <code ini> | ||
- | ChildList = Wall1 # Wall2 # Wall3 # Wall4; # Wall5 # Wall6</ | ||
- | |||
- | As we can see, our '' | ||
- | You can remove this ''';''' | ||
- | |||
- | Let's now see how we define our walls and their physical properties.\\ | ||
- | Let's begin with the shape we'll use for both '' | ||
- | |||
- | <code ini> | ||
- | Type = box | ||
- | Restitution = 0.0 | ||
- | Friction | ||
- | SelfFlags | ||
- | CheckMask | ||
- | Solid = true | ||
- | Density | ||
- | |||
- | Here we request a part that will use a box shape with no '' | ||
- | We also define the '' | ||
- | The first ones defines the identity flags for this part, and the second ones define to which idendity flags it'll be sensitive (ie. with who it'll collide).\\ | ||
- | Basically, if we have two objects: '' | ||
- | |||
- | <code c> | ||
- | |||
- | //NB: As we don't specify the '' | ||
- | |||
- | Now we need to define our bodies for the boxes and the walls. | ||
- | |||
- | <code ini> | ||
- | PartList = FullBoxPart | ||
- | |||
- | [BoxBody] | ||
- | PartList | ||
- | Dynamic | ||
- | |||
- | We can see they both use the same part ((they can have up to 8 parts, but only 1 is used here)).\\ | ||
- | As '' | ||
- | For the '' | ||
- | //NB: As there can't be any collision between two non-dynamic (ie. static) objects, walls won't collide even if they touch or overlap.// | ||
- | |||
- | Now that we have our bodies, let's see how we apply them to our objects.\\ | ||
- | First, our boxes. | ||
- | |||
- | <code ini> | ||
- | Graphic | ||
- | Position | ||
- | Body = BoxBody | ||
- | Scale = 2.0</ | ||
- | |||
- | As you can see, our '' | ||
- | We can also notice it's random position, which means everytime we create a new box, it'll have a new random position in this range. | ||
- | |||
- | Let's now see our walls. | ||
- | |||
- | <code ini> | ||
- | Body = WallBody | ||
- | |||
- | [VerticalWall@WallTemplate] | ||
- | Graphic = VerticalWallGraphic; | ||
- | Scale = @VerticalWallGraphic.Repeat; | ||
- | |||
- | [HorizontalWall@WallTemplate] | ||
- | Graphic = HorizontalWallGraphic; | ||
- | Scale = @HorizontalWallGraphic.Repeat; | ||
- | |||
- | [Wall1@VerticalWall] | ||
- | Position = (0, 24, 0) | ||
- | |||
- | [Wall2@VerticalWall] | ||
- | Position = (768, 24, 0) | ||
- | |||
- | [Wall3@HorizontalWall] | ||
- | Position = (0, -8, 0) | ||
- | |||
- | [Wall4@HorizontalWall] | ||
- | Position = (0, 568, 0) | ||
- | |||
- | [Wall5@VerticalWall] | ||
- | Position = (384, 24, 0) | ||
- | |||
- | [Wall6@HorizontalWall] | ||
- | Position = (0, 284, 0)</ | ||
- | |||
- | As we can see we use inheritance once again.\\ | ||
- | First we define a '' | ||
- | We then inherits from this section with '' | ||
- | Now that we have our wall templates for both vertical and horizontal wall, we only need to specify them a bit more by adding a position.\\ | ||
- | That's what we do with '' | ||
- | ===== Recursos ===== | ||
- | |||