Compartir a través de


SpriteKit en Xamarin.iOS

SpriteKit, el marco de gráficos 2D de Apple, tiene algunas características nuevas interesantes en iOS 8 y OS X Yosemite. Entre ellas se incluyen la integración con SceneKit, la compatibilidad con sombreador, la iluminación, las sombras, las restricciones, la generación normal de mapas y las mejoras físicas. En concreto, las nuevas características físicas facilitan la adición de efectos realistas a un juego.

Cuerpos físicos

SpriteKit incluye una API de física corporal rígida 2D. Cada sprite tiene un cuerpo físico asociado (SKPhysicsBody) que define las propiedades físicas, como la masa y la fricción, así como la geometría del cuerpo en el mundo de la física.

Crear un cuerpo físico a partir de una textura

SpriteKit ahora admite la derivación del cuerpo físico de un sprite a partir de su textura. Esto facilita la implementación de colisiones que se ven más naturales.

Por ejemplo, observe en la siguiente colisión cómo el plátano y el mono colisionan casi en la superficie de cada imagen:

The banana and monkey collide nearly at the surface of each image

SpriteKit hace posible la creación de un cuerpo físico de este tipo con una sola línea de código. Simplemente llame a SKPhysicsBody.Create con la textura y el tamaño: sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, sprite.Size);

Umbral alfa

Además de establecer simplemente la propiedad de PhysicsBody directamente en la geometría derivada de la textura, las aplicaciones pueden establecer un umbral alfa para controlar cómo se deriva la geometría.

El umbral alfa define el valor alfa mínimo que un píxel debe incluirse en el cuerpo físico resultante. Por ejemplo, el código siguiente da como resultado un cuerpo físico ligeramente diferente:

sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, 0.7f, sprite.Size);

El efecto de ajustar el umbral alfa como este ajusta con precisión la colisión anterior, de modo que el mono cae al colisionar con el plátano:

The monkey falls over when colliding with the banana

Campos físicos

Otra gran adición a SpriteKit es la nueva compatibilidad con campos físicos. Estos le permiten agregar cosas como campos de vórtice, campos de gravedad radial y campos de muelle, por nombrar solo algunos.

Los campos físicos se crean mediante la clase SKFieldNode, que se agrega a una escena igual que cualquier otro SKNode. Hay una gran variedad de Factory Method en SKFieldNode para crear diferentes campos físicos. Puede crear un campo de muelle llamando a SKFieldNode.CreateSpringField(), un campo de gravedad radial llamando a SKFieldNode.CreateRadialGravityField(), etc.

SKFieldNode también tiene propiedades para controlar atributos de campo como la intensidad del campo, la región del campo y la atenuación de las fuerzas de campo.

Campo de muelle

Por ejemplo, el código siguiente crea un campo de muelle y lo agrega a la escena:

SKFieldNode fieldNode = SKFieldNode.CreateSpringField ();
fieldNode.Enabled = true;
fieldNode.Position = new PointF (Size.Width / 2, Size.Height / 2);
fieldNode.Strength = 0.5f;
fieldNode.Region = new SKRegion(Frame.Size);
AddChild (fieldNode);

A continuación, puede agregar sprites y establecer sus propiedades de PhysicsBody para que el campo físico afecte a los sprites, como hace el código siguiente cuando el usuario toca la pantalla:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    var touch = touches.AnyObject as UITouch;
    var pt = touch.LocationInNode (this);
    var node = SKSpriteNode.FromImageNamed ("TinyBanana");
    node.PhysicsBody = SKPhysicsBody.Create (node.Texture, node.Size);
    node.PhysicsBody.AffectedByGravity = false;
    node.PhysicsBody.AllowsRotation = true;
    node.PhysicsBody.Mass = 0.03f;
    node.Position = pt;
    AddChild (node);
}

Esto hace que los plátanos oscilen como un muelle alrededor del nodo de campo:

The bananas oscillate like a spring around the field node

Campo de gravedad radial

Agregar un campo diferente es similar. Por ejemplo, el código siguiente crea un campo de gravedad radial:

SKFieldNode fieldNode = SKFieldNode.CreateRadialGravityField ();
fieldNode.Enabled = true;
fieldNode.Position = new PointF (Size.Width / 2, Size.Height / 2);
fieldNode.Strength = 10.0f;
fieldNode.Falloff = 1.0f;

Esto da como resultado un campo de fuerza diferente, donde los plátanos se extraen radialmente sobre el campo:

The bananas are pulled radially around the field