SpriteKit in Xamarin.iOS
SpriteKit, il framework grafico 2D di Apple, ha alcune nuove funzionalità interessanti in iOS 8 e OS X Yosemite. Questi includono l'integrazione con SceneKit, supporto shader, illuminazione, ombreggiature, vincoli, generazione normale della mappa e miglioramenti della fisica. In particolare, le nuove caratteristiche della fisica rendono molto facile aggiungere effetti realistici a un gioco.
Corpi fisici
SpriteKit include un'API fisica del corpo rigida 2D. Ogni sprite ha un corpo fisico associato (SKPhysicsBody
) che definisce le proprietà fisiche come massa e attrito, nonché la geometria del corpo nel mondo della fisica.
Creazione di un corpo fisico da una trama
SpriteKit ora supporta la derivazione del corpo fisico di uno sprite dalla sua trama. In questo modo è facile implementare collisioni che sembrano più naturali.
Si noti, ad esempio, nella collisione seguente il modo in cui la banana e la scimmia si scontrano quasi sulla superficie di ogni immagine:
SpriteKit rende possibile la creazione di un corpo fisico di questo tipo con una singola riga di codice. È sufficiente chiamare SKPhysicsBody.Create
con la trama e le dimensioni: sprite. PhysicsBody = SKPhysicsBody.Create (sprite. Trama, sprite. Dimensioni);
Soglia alfa
Oltre a impostare semplicemente la PhysicsBody
proprietà direttamente sulla geometria derivata dalla trama, le applicazioni possono impostare e alfa soglia per controllare la modalità di derivazione della geometria.
La soglia alfa definisce il valore alfa minimo di un pixel deve essere incluso nel corpo fisico risultante. Ad esempio, il codice seguente genera un corpo fisico leggermente diverso:
sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, 0.7f, sprite.Size);
L'effetto di modificare la soglia alfa come questo ottimizza la collisione precedente, in modo che la scimmia cade quando si scontra con la banana:
Campi di fisica
Un'altra grande aggiunta a SpriteKit è il nuovo supporto per il campo fisico. Questi consentono di aggiungere cose come campi vortice, campi di gravità radiale e campi di primavera per denominare solo alcuni.
I campi di fisica vengono creati usando la classe SKFieldNode, che viene aggiunta a una scena esattamente come qualsiasi altro SKNode
oggetto . Esistono diversi metodi di fabbrica per SKFieldNode
creare campi fisici diversi. È possibile creare un campo di primavera chiamando SKFieldNode.CreateSpringField()
, un campo di gravità radiale chiamando SKFieldNode.CreateRadialGravityField()
e così via.
SKFieldNode
dispone inoltre di proprietà per controllare gli attributi dei campi, ad esempio il livello di forza del campo, l'area del campo e l'attenuazione delle forze di campo.
Campo primavera
Ad esempio, il codice seguente crea un campo spring e lo aggiunge alla scena:
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);
È quindi possibile aggiungere sprite e impostarne PhysicsBody
le proprietà in modo che il campo di fisica influirà sugli sprite, come nel codice seguente quando l'utente tocca lo schermo:
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);
}
Ciò fa sì che le banane oscillano come una molla intorno al nodo del campo:
Campo gravità radiale
L'aggiunta di un campo diverso è simile. Ad esempio, il codice seguente crea un campo di 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;
Ciò comporta un campo di forza diverso, in cui le banane vengono estratte radialmente sul campo: