Condividi tramite


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:

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

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:

The monkey falls over when colliding with the 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 SKNodeoggetto . 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:

The bananas oscillate like a spring around the field node

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:

The bananas are pulled radially around the field