SpriteKit dans Xamarin.iOS
SpriteKit, le framework graphique 2D d’Apple, offre de nouvelles fonctionnalités intéressantes dans iOS 8 et OS X Yosemite. Il s’agit notamment de l’intégration à SceneKit, de la prise en charge des nuanceurs, de l’éclairage, des ombres, des contraintes, de la génération de carte normale et des améliorations de la physique. En particulier, les nouvelles fonctionnalités physiques permettent d’ajouter très facilement des effets réalistes à un jeu.
Corps physiques
SpriteKit inclut une API de physique du corps rigide 2D. Chaque sprite a un corps physique associé (SKPhysicsBody
) qui définit les propriétés physiques telles que la masse et la friction, ainsi que la géométrie du corps dans le monde de la physique.
Création d’un corps physique à partir d’une texture
SpriteKit prend désormais en charge la dérivation du corps physique d’un sprite à partir de sa texture. Cela facilite l’implémentation de collisions qui semblent plus naturelles.
Par exemple, notez dans la collision suivante comment la banane et le singe se heurtent presque à la surface de chaque image :
SpriteKit rend possible la création d’un tel corps physique avec une seule ligne de code. Appelez SKPhysicsBody.Create
simplement avec la texture et la taille : sprite. PhysicsBody = SKPhysicsBody.Create (sprite. Texture, sprite. Taille);
Seuil alpha
En plus de définir simplement la PhysicsBody
propriété directement sur la géométrie dérivée de la texture, les applications peuvent définir et le seuil alpha pour contrôler la façon dont la géométrie est dérivée.
Le seuil alpha définit la valeur alpha minimale qu’un pixel doit être inclus dans le corps physique résultant. Par exemple, le code suivant entraîne un corps physique légèrement différent :
sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, 0.7f, sprite.Size);
L’effet d’ajuster le seuil alpha comme cela ajuste finement la collision précédente, de telle sorte que le singe tombe au-dessus lors d’une collision avec la banane:
Champs physiques
Un autre ajout important à SpriteKit est la nouvelle prise en charge du champ physique. Ceux-ci vous permettent d’ajouter des éléments tels que des champs de vortex, des champs de gravité radiale et des champs de ressort pour n’en nommer que quelques-uns.
Les champs physiques sont créés à l’aide de la classe SKFieldNode, qui est ajoutée à une scène comme n’importe quelle autre SKNode
. Il existe une variété de méthodes d’usine sur SKFieldNode
pour créer différents champs physiques. Vous pouvez créer un champ spring en appelant SKFieldNode.CreateSpringField()
, un champ de gravité radiale en appelant SKFieldNode.CreateRadialGravityField()
, et ainsi de suite.
SKFieldNode
a également des propriétés pour contrôler les attributs de champ, tels que la force du champ, la région de champ et l’atténuation des forces de champ.
Champ de printemps
Par exemple, le code suivant crée un champ spring et l’ajoute à la scène :
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);
Vous pouvez ensuite ajouter des sprites et définir leurs PhysicsBody
propriétés afin que le champ physique affecte les sprites, comme le fait le code suivant lorsque l’utilisateur touche l’écran :
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);
}
Cela fait osciller les bananes comme un ressort autour du nœud de champ :
Champ de gravité radiale
L’ajout d’un autre champ est similaire. Pour instance, le code suivant crée un champ de gravité radiale :
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;
Il en résulte un champ de force différent, où les bananes sont tirées radialement sur le champ :