Share via


SpriteKit in Xamarin.iOS

SpriteKit, das 2D-Grafikframework von Apple, bietet einige interessante neue Features in iOS 8 und OS X Yosemite. Dazu gehören die Integration in SceneKit, Shaderunterstützung, Beleuchtung, Schatten, Einschränkungen, normale Kartengenerierung und Physikverbesserungen. Insbesondere die neuen Physikfeatures machen es sehr einfach, einem Spiel realistische Effekte hinzuzufügen.

Physikkörper

SpriteKit enthält eine 2D-API für starre Körperphysik. Jeder Sprite hat einen zugeordneten Physikkörper (SKPhysicsBody), der die physikalischen Eigenschaften wie Masse und Reibung sowie die Geometrie des Körpers in der Physikwelt definiert.

Erstellen eines Physikkörpers aus einer Textur

SpriteKit unterstützt jetzt die Ableitung des Physikkörpers eines Sprites aus seiner Textur. Dies macht es einfach, Kollisionen zu implementieren, die natürlicher aussehen.

Beachten Sie beispielsweise in der folgenden Kollision, wie Banane und Affe fast an der Oberfläche jedes Bilds kollidieren:

Banane und Affe kollidieren fast an der Oberfläche jedes Bildes.

SpriteKit ermöglicht das Erstellen eines solchen Physikkörpers mit einer einzigen Codezeile. Rufen SKPhysicsBody.Create Sie einfach mit der Textur und Größe auf: sprite. PhysicsBody = SKPhysicsBody.Create (sprite. Textur, Sprite. Größe);

Alphaschwellenwert

Zusätzlich zum einfachen Festlegen der PhysicsBody Eigenschaft direkt auf die von der Textur abgeleitete Geometrie können Anwendungen den Alphaschwellenwert festlegen, um zu steuern, wie die Geometrie abgeleitet wird.

Der Alpha-Schwellenwert definiert den minimalen Alphawert, den ein Pixel in den resultierenden Physiktext einbeziehen muss. Der folgende Code ergibt beispielsweise einen etwas anderen Physiktext:

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

Der Effekt der Optimierung der Alpha-Schwelle wie dieser stimmt die vorherige Kollision so, dass der Affe beim Zusammenstoß mit der Banane umfällt:

Der Affe fällt um, wenn er mit der Banane kollidieren

Physikfelder

Eine weitere großartige Ergänzung von SpriteKit ist die neue Physik-Feldunterstützung. Mit diesen können Sie Dinge wie Vortexfelder, radiale Schwerkraftfelder und Federfelder hinzufügen, um nur einige zu nennen.

Physikfelder werden mit der SKFieldNode-Klasse erstellt, die einer Szene wie jeder anderen SKNodehinzugefügt wird. Es gibt eine Vielzahl von Factorymethoden, SKFieldNode um verschiedene Physikfelder zu erstellen. Sie können ein Federfeld erstellen, indem Sie ein radiales Schwerkraftfeld aufrufen SKFieldNode.CreateSpringField(), indem Sie usw. aufrufen SKFieldNode.CreateRadialGravityField().

SKFieldNode verfügt auch über Eigenschaften zum Steuern von Feldattributen wie der Feldstärke, dem Feldbereich und der Abschwächung von Feldkräften.

Springfeld

Der folgende Code erstellt beispielsweise ein Federfeld und fügt es der Szene hinzu:

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

Anschließend können Sie Sprites hinzufügen und deren PhysicsBody Eigenschaften so festlegen, dass sich das Physikfeld auf die Sprites auswirkt, wie der folgende Code dies tut, wenn der Benutzer den Bildschirm berührt:

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

Dies bewirkt, dass die Bananen wie eine Feder um den Feldknoten herum schwingen:

Die Bananen oszillieren wie eine Quelle um den Feldknoten

Radiales Schwerkraftfeld

Das Hinzufügen eines anderen Felds ist ähnlich. Für instance erstellt der folgende Code ein radiales Schwerkraftfeld:

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;

Dies ergibt ein anderes Kraftfeld, bei dem die Bananen radial um das Feld gezogen werden:

Die Bananen werden radial um das Feld gezogen