SpriteKit en Xamarin. iOSSpriteKit in Xamarin.iOS

SpriteKit, el marco de gráficos 2D de Apple, tiene algunas características nuevas interesantes en iOS 8 y OS X Yosemite.SpriteKit, the 2D graphics framework from Apple, has some interesting new features in iOS 8 and OS X Yosemite. Esto incluye la integración con SceneKit, compatibilidad del sombreador, iluminación, sombras, restricciones, generación normal de mapas y mejoras físicas.These include integration with SceneKit, shader support, lighting, shadows, constraints, normal map generation, and physics enhancements. En concreto, las nuevas características de la física hacen que sea muy fácil agregar efectos realistas a un juego.In particular, the new physics features make it very easy to add realistic effects to a game.

Cuerpos físicosPhysics Bodies

SpriteKit incluye una API de física de cuerpo 2D y rígida.SpriteKit includes a 2D, rigid body physics API. Cada Sprite tiene un cuerpo físico asociado (SKPhysicsBody) que define las propiedades de la física, como la masa y la fricción, así como la geometría del cuerpo del mundo físico.Every sprite has an associated physics body (SKPhysicsBody) that defines the physics properties such as mass and friction, as well as the geometry of the body in the physics world.

Crear un cuerpo físico a partir de una texturaCreating a Physics Body from a Texture

SpriteKit admite ahora la derivación del cuerpo de la física de un Sprite a partir de su textura.SpriteKit now supports deriving the physics body of a sprite from its texture. Esto facilita la implementación de colisiones que parecen más naturales.This makes it easy to implement collisions that look more natural.

Por ejemplo, observe en la siguiente colisión cómo los plátanos y Monkey entran en conflicto casi en la superficie de cada imagen:For example, notice in the following collision how the banana and monkey collide nearly at the surface of each image:

SpriteKit hace posible la creación de este cuerpo físico con una sola línea de código.SpriteKit makes creating such a physics body possible with a single line of code. Simplemente llame a SKPhysicsBody.Create con la textura y el tamaño: Sprite. PhysicsBody = SKPhysicsBody. Create (Sprite. Texture, Sprite. Tamaño);Simply call SKPhysicsBody.Create with the texture and size: sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, sprite.Size);

Umbral alfaAlpha Threshold

Además de establecer simplemente la propiedad PhysicsBody directamente en la geometría derivada de la textura, las aplicaciones pueden establecer y umbral alfa para controlar cómo se deriva la geometría.In addition to simply setting the PhysicsBody property directly to the geometry derived from the texture, applications can set and alpha threshold to control how the geometry is derived.

El umbral alfa define el valor alfa mínimo que debe tener un píxel para incluirse en el cuerpo físico resultante.The alpha threshold defines the minimum alpha value a pixel must have to be included in the resulting physics body. Por ejemplo, el código siguiente da como resultado un cuerpo de física ligeramente diferente:For example, the following code results in a slightly different physics body:

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

El efecto de ajustar el umbral alfa como este ajusta la colisión anterior, de modo que el Monkey se recurra al conflicto con el plátano:The effect of tweaking the alpha threshold like this fine-tunes the previous collision, such that the monkey falls over when colliding with the banana:

Campos de físicaPhysics Fields

Otra excelente adición a SpriteKit es el nuevo soporte de campo físico.Another great addition to SpriteKit is the new physics field support. Estos permiten agregar elementos, como los campos de Vortex, los campos de gravedad radial y los campos de muelle por nombrar solo unos pocos.These allow you to add things such as vortex fields, radial gravity fields and spring fields to name just a few.

Los campos de física se crean mediante la clase SKFieldNode, que se agrega a una escena como cualquier otro SKNode.Physics fields are created using the SKFieldNode class, which is added to a scene just like any other SKNode. Hay una variedad de métodos de generador en SKFieldNode para crear distintos campos físicos.There are a variety of factory methods on SKFieldNode to create different physics fields. Puede crear un campo de Spring llamando a SKFieldNode.CreateSpringField(), un campo de gravedad radial llamando a SKFieldNode.CreateRadialGravityField(), etc.You can create a spring field by calling SKFieldNode.CreateSpringField(), a radial gravity field by calling SKFieldNode.CreateRadialGravityField(), and so on.

SKFieldNode también tiene propiedades para controlar los atributos de campo, como la intensidad del campo, la región del campo y la atenuación de las fuerzas del campo.SKFieldNode also has properties to control field attributes such as the field strength, the field region, and the attenuation of field forces.

Campo SpringSpring Field

Por ejemplo, el código siguiente crea un campo Spring y lo agrega a la escena:For example, the following code creates a spring field and adds it to the scene:

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);

Después, 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:You can then add sprites and set their PhysicsBody properties so that the physics field will affect the sprites, as the following code does when the user touches the screen:

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 oscilan como un muelle alrededor del nodo de campo:This causes the bananas to oscillate like a spring around the field node:

Campo de gravedad radialRadial Gravity Field

Agregar un campo diferente es similar.Adding a different field is similar. Por ejemplo, el código siguiente crea un campo de gravedad radial:For instance, the following code creates a radial gravity field:

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, en el que los plátanos se extraen radialmente sobre el campo:This results in a different force field, where the bananas are pulled radially about the field: