sábado, 24 de enero de 2015

Física

Corona incluye un motor de física que no requiere de amplios conocimientos previos en física para poder utilizarlo.

Para comenzar a trabajar con física, hace falta instanciar de esta manera:

local fis = require( "physics" )
 
Algunas funciones de la física son:
 

  • fis.start() — Inicia el motor de física o continúa si estaba en pausa. Debes iniciar la física antes de agregarla a cualquier elemento.
  • fis.pause() — Pausa la simulación de física.
  • fis.stop() — Destruye la simulación de física. Si sólo quieres detenerla, debes usar fis.pause().
Opciones de simulación de física 

physics.setGravity() Establece los componentes en x y y del vector de gravedad, en unidades: m/s². Por default es ( 0, 9.8 ) para simular la gravedad del planeta tierra, apuntando hacia abajo en el eje de las Y.

Cuerpos
El mundo de la física en Corona se basa en la interacción de cuerpos físicos. Corona trata a los objetos como cuerpos físicos.

Con el simulador de física activado, los objetos continuarán su estado normal en x y y, rotación, entre todas sus propiedades. Pero, si el objeto es de tipo "dinámico", el motor de física "luchará" contra los intentos de moverlos manualmente, según la fuerza de gravedad y colisiones por ejemplo.

Nota: Cuando eliminas un objeto con object:removeSelf() o display.remove(), esto elimina el objeto de la pantalla y también detiene la simulación física. Sin emargo, si deseas sólo reitarlo como elemento físico, pero que se siga viendo en pantalla, puedes usar: physics.removeBody().

Creando cuerpos

Para crear cuerpos, se hace de la siguiente manera:

physics.addBody( object, { properties } )
 
Las propiedades que puedes utilizar son:
 
Density
 
La densidad se multiplica por el área del cuerpo para determinar su masa. Este
parámetro se basa en el valor estándar 1.0 del agua. Así que los materiales que sean más ligeros
que el agua (como la madera) tienen una densidad menor a 1.0, y los más pesados (como la roca)
tiene una densidad por encima de 1.0.
 
 
Friction

La fricción nunca debe ser negativa. Un valor de 0 significa que no tiene fricción y 1.0
significa una fuerte fricción. El valor default es de: 0.3.

Bounce

El rebote determina la velocidad a la que un objeto regresa tras una colisión.
Los valores mayores a 0.3 suelen rebotar mucho, y un objeto con rebote de 1.0, rebotará por siempre.
Por ejemplo, Si un elemento lo tirán en el piso, rebotará casi a la misma distancia desde
la que fue soltado. Valores de rebote mayores a 1 son válidos, y estos tomarán impulso
trás cada rebote que realice. el valor por default es de 0.2, lo que hace los objetos
"algo rebotables". 

--Ejemplo 1
 
local crate = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate, { density=1.0, friction=0.3, bounce=0.2 } )

local balloon = display.newImage( "balloon.png", 200, 200 )
physics.addBody( balloon, { density=0.1, friction=0.1, bounce=0.4 } )
 
 
 -- Ejemplo 2

local crate1 = display.newImage( "crate1.png", 100, 200 )
local crate2 = display.newImage( "crate2.png", 180, 280 )

local crateMaterial = { density=1.0, friction=0.3, bounce=0.2 }

physics.addBody( crate1, crateMaterial )
physics.addBody( crate2, crateMaterial )


Tipos de cuerpos

dynamic

Estos cuerpos se pueden mover manualmente, pero son afectados totalmente por la física, colisiones y gravedad.

static

Estos cuerpos no se mueven, y simulan las masas físicas como la tierra. Estos cuerpos sólo pueden chocar contra cuerpos dinámicos y nunca con otros estáticos.

Dos formas de usarlos:

--Forma 1

physics.addBody( triangle, "static", { density=1.6, friction=0.5, bounce=0.2 } )
 
--Forma 2
 
physics.addBody( triangle, { density=1.6, friction=0.5, bounce=0.2 } )
triangle.bodyType = "static"
 
 
Formas de cuerpos 


Cuerpos rectangulares

Por default, todos los cuerpos físicos son rectangulares. Los bordes del rectángulo
rodean la imagen. Si la imagen tiene transparencias, estás también estarán dentro del rectángulo.
 
--Ejemplo
local platform = display.newImage( "platform.png", 600, 200 )
physics.addBody( platform, { density=1.0, friction=0.3, bounce=0.2 } ) 
  
Cuerpos circulares

Los cuerpos circulares se crean agregando el parámetro de radio. Esto funciona para pelotas, rocas y otros objetos que pueden tener aspecto circular. Los óvalos no existen, sólo puedes simularlos con polígonos.

--Ejemplo
local ball = display.newImage( "ball.png", 100, 100 )
physics.addBody( ball, { radius=50, density=1.0, friction=0.3, bounce=0.2 } )
 
 
 Cuerpos polígonos

Estos cuerpos pueden crearse con coordenadas en x,y de cada punto del objeto.


Sensores
Cualquier cuerpo puede ser un sensor, la gran diferencia de estos, es que no interactúan con otros cuerpos, pero al colisionar con otros, lanzan un evento de colisión, sin embargo pasan por encima de ellos.



--Forma 1
physics.addBody( goal, "static", { isSensor=true } )

--Forma 2
physics.addBody( goal, "static" )
goal.isSensor = true

 Balas

Las balas en videojuegos deben ser tratadas con características diferentes dada su peculiaridad:

local bullet = display.newCircle( 100, 100, 10 )
physics.addBody( bullet, "dynamic", { radius=10 } )
bullet.gravityScale = 0

--Make the object a "bullet" type object
bullet.isBullet = true

bullet:setLinearVelocity( 800,0 )
 
 
  
Funciones en los cuerpos físicos


SetLinearVelocity

Establece los componentes x, y para ejercer fuerza lineal en el cuerpo, en pixeles por segundo.

object:setLinearVelocity( 2, 4 )
 
GetLinearVelocity
 
Obtiene los componentes x, y de la fuerza ejercida, en pixeles por segundo.
 
local vx, vy = object:getLinearVelocity()
print( "Linear X velocity = " .. vx )
print( "Linear Y velocity = " .. vy )
 
 
applyForce
 
Se aplica una fuerza con componentes x, y en punto seleccionado relacionado con la pantalla.
Por ejemplo, si se aplica una fuerza, justo en el centro de un objeto, este se desplazará en línea recta
 
object:applyForce( 500, 2000, object.x, object.y )
 
  
 
  


















No hay comentarios:

Publicar un comentario