次の方法で共有


SpriteKit in Xamarin.iOS

Apple の 2D グラフィックス フレームワークである SpriteKit の iOS 8 および OS X Yosemite には、いくつかの興味深い新機能が含まれています。 これらの機能としては、SceneKit との統合、シェーダーのサポート、照明、シャドウ、制約、法線マップの生成、物理機能の強化などがあります。 特に、新しい物理機能を使用すると、ゲームに現実的な効果を非常に簡単に追加できます。

物理ボディ

SpriteKit には、2D の剛体物理 API が含まれています。 すべてのスプライトには、質量や摩擦などの物理特性と、物理世界におけるボディのジオメトリを定義する物理ボディ (SKPhysicsBody) が関連付けられています。

テクスチャから物理ボディを作成する

SpriteKit では、スプライトの物理ボディをテクスチャから派生させることがサポートされるようになりました。 これにより、より自然に見える衝突を簡単に実装できます。

たとえば、次の衝突では、バナナとサルが各画像の表面でほぼ衝突していることに注目してください:

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

SpriteKit を使用すると、1 行のコードでこのような物理ボディを作成できます。 テクスチャとサイズを使用して SKPhysicsBody.Create を呼び出すだけです: sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, sprite.Size);

アルファしきい値

PhysicsBody プロパティをテクスチャから派生したジオメトリに直接設定するだけでなく、アプリケーションはジオメトリの派生方法を制御するためにアルファしきい値を設定できます。

アルファしきい値は、任意のピクセルが物理ボディに含められるために必要なアルファ値の最小値を定義します。 たとえば、次のコードでは、結果の物理ボディが少し異なったものになります:

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

このようなアルファしきい値を調整すると、前述の衝突を微調整できます。例えば、バナナと衝突したときにサルが倒れるという具合です:

The monkey falls over when colliding with the banana

物理フィールド

SpriteKit のもう 1 つの優れた追加機能は、新しい物理フィールドのサポートです。 これらを使用すると、渦場、放射状重力フィールド、ばねフィールドなどを追加することができます。これらはほんの一例です。

物理フィールドは、他の SKNode と同様にシーンに追加される SKFieldNode クラスを使用して作成されます。 さまざまな物理フィールドを作成するためのさまざまなファクトリ メソッドが SKFieldNode にはあります。 例えば、SKFieldNode.CreateSpringField() を呼び出すことでばねフィールドを作成でき、SKFieldNode.CreateRadialGravityField() を呼び出すことで放射状重力フィールドを作成できます。

SKFieldNode には、フィールドの強さ、フィールド領域、フィールド フォースの減衰などのフィールド属性を制御するプロパティもあります。

ばねフィールド

たとえば、次のコードは、ばねフィールドを作成し、シーンに追加します:

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

その後、スプライトを追加し、PhysicsBody プロパティを設定することで、物理フィールドがスプライトに影響を与えるようにすることができます。例えば、次のコードは、ユーザーが画面にタッチしたときに効果を発揮します:

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

これにより、バナナはフィールド ノードの周りのばねのように振動します:

The bananas oscillate like a spring around the field node

放射状重力フィールド

同じような方法で別のフィールドの追加もできます。 たとえば、次のコードは放射状重力フィールドを作成します:

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;

これにより、異なるフォース フィールドが作成されます。ここでは、バナナはフィールド内で放射状に引っ張られます:

The bananas are pulled radially around the field