Introducción a la física de Sprite Kit

Login to Access Code

Las animaciones del Sprite Kit sólo le llevarán hasta cierto punto cuando esté creando juegos para iOS. Para recrear la plataforma, el tirador, o los juegos de desplazamiento lateral los cuales tienen gran éxito, tendrás que interactuar con la física del juego. En muchos sistemas y plataformas, sobre todo en el pasado, la física del juego era una verdadera monstruosidad de manejar. A menudo se necesitaba de un genio matemático que se dedicara a inventar y a perfeccionar las delicadas fórmulas matemáticas para que se comportaran predeciblemente mientras facilitaban a nuestros ojos creerse y gozarse las transiciones. Sprite Kit, sin embargo, hace que la física sea extremadamente sencilla; con el soporte incorporado para la detección de colisiones, la fuerza gravitacional, la velocidad, el impulso, y mucho más.

En esta parte, vamos a hacer un poco de limpieza y algo de física inicial muy rudimentaria para proveer un soporte para que nuestro héroe de saltos cada vez que se toque la pantalla. Usted ya debiera de estar familiarizado con Sprite Kit y para tener una mejor idea a cerca de esta tutoría, es recomendable darle un vistazo a nuestra tutoría sobre animación del Sprite Kit.

Sprites vs Atlas

En nuestra última tutoría bajamos múltiples archivos de imágenes individuales para que llamemos a cada imagen y así crear un marco para nuestro héroe corredor. Mientras que esto funcionó perfectamente, ese no es el método más eficiente para el uso de sprites. Para que Xcode haga menos llamadas y cachés más rápidas, se utiliza un atlas para combinar los múltiples archivos de imágenes en una única imagen optimizada en OpenGL. Esta imagen, entonces, es asignada a través de un plist para una referencia rápida y de alto rendimiento.

Un atlas es creado simplemente al nombrar un folder de imágenes con una extensión .atlas y bajándolo a su proyecto.

Xcode generará automáticamente un sprite optimizado y combinado para cada construcción, y ahora podremos recurrir a los archivos de imágenes desde una textura:

let heroAtlas = SKTextureAtlas(named: "hero.atlas")
var hero = SKSpriteNode(texture: heroAtlas.textureNamed("running1"))

Utilizando la física en un juego de Sprite Kit

En primer lugar, nuestro juego necesita la gravedad. Ya hemos declarado que nuestra clase inicial “Game Scene” herede al prototipo *SKPhysicsContactDelegate *dándonos la habilidad de darles a nuestra escena inicial propiedades físicas. Vamos a configurar una gravedad predeterminada para toda le escena, que tira hacia abajo sobre nuestro eje Y en una proporción de dos veces la gravedad de la Tierra (por lo menos me han dicho se basa en G, todavía tengo que comprobar que se de en cualquier lugar).

self.physicsWorld.gravity = CGVectorMake(0.0, -2)

Ahora démosle a nuestro un cuerpo físico. Hay una variedad de formas en que podemos definir los bordes físicos de nuestro héroe. Pero un método fácil es simplemente envolver el objeto en un Cuerpo Físico o Physics Body utilizando un círculo basándose en el tamaño del objeto.

// Enable physics around our hero using a circle to draw our radius
hero.physicsBody = SKPhysicsBody(circleOfRadius: hero.size.height / 2.75)
hero.physicsBody.dynamic = true

Si ejecutamos la aplicación con sólo la gravedad aplicada a nuestro héroe, lo verá cargarse y rápidamente caerá fuera de pantalla. Esto se debe al hecho de que hemos habilitado la opción dinámica en nuestro héroe, pero no le hemos dado un cuerpo físico a la tierra. Ahora habilitemos la física en nuestra Tierra:

let sprite = SKSpriteNode(texture: groundTexture)
let square = CGSize(width: groundTexture.size().width, height: groundTexture.size().height/4)
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: square)
sprite.physicsBody.dynamic = false

Ahora tenemos nuevamente a nuestro héroe corriendo en el mismo lugar que antes, pero con gravedad. Y estamos listos para la acción de saltar la cual vamos a bajar con el método touchesBegan. Voy a omitir las acciones animadas y mostraré la física hasta en este momento. Vamos a establecer la velocidad como cero inicialmente y luego aplicaremos un “empujón” o impulso solamente en el eje Y:

hero.physicsBody.velocity = CGVectorMake(0, 0)
hero.physicsBody.applyImpulse(CGVectorMake(0, 280))

Aquí está el juego actualizado completamente. Todavía hay errores en el código, pero vamos a corregir estos en el futuro.

https://gist.github.com/9f95994f0c105794478e.git