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:
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:
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 SKNode
hinzugefü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:
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: