SpriteKit in Xamarin.iOS
Apple の 2D グラフィックス フレームワークである SpriteKit の iOS 8 および OS X Yosemite には、いくつかの興味深い新機能が含まれています。 これらの機能としては、SceneKit との統合、シェーダーのサポート、照明、シャドウ、制約、法線マップの生成、物理機能の強化などがあります。 特に、新しい物理機能を使用すると、ゲームに現実的な効果を非常に簡単に追加できます。
物理ボディ
SpriteKit には、2D の剛体物理 API が含まれています。 すべてのスプライトには、質量や摩擦などの物理特性と、物理世界におけるボディのジオメトリを定義する物理ボディ (SKPhysicsBody
) が関連付けられています。
テクスチャから物理ボディを作成する
SpriteKit では、スプライトの物理ボディをテクスチャから派生させることがサポートされるようになりました。 これにより、より自然に見える衝突を簡単に実装できます。
たとえば、次の衝突では、バナナとサルが各画像の表面でほぼ衝突していることに注目してください:
SpriteKit を使用すると、1 行のコードでこのような物理ボディを作成できます。 テクスチャとサイズを使用して SKPhysicsBody.Create
を呼び出すだけです: sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, sprite.Size);
アルファしきい値
PhysicsBody
プロパティをテクスチャから派生したジオメトリに直接設定するだけでなく、アプリケーションはジオメトリの派生方法を制御するためにアルファしきい値を設定できます。
アルファしきい値は、任意のピクセルが物理ボディに含められるために必要なアルファ値の最小値を定義します。 たとえば、次のコードでは、結果の物理ボディが少し異なったものになります:
sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, 0.7f, sprite.Size);
このようなアルファしきい値を調整すると、前述の衝突を微調整できます。例えば、バナナと衝突したときにサルが倒れるという具合です:
物理フィールド
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);
}
これにより、バナナはフィールド ノードの周りのばねのように振動します:
放射状重力フィールド
同じような方法で別のフィールドの追加もできます。 たとえば、次のコードは放射状重力フィールドを作成します:
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;
これにより、異なるフォース フィールドが作成されます。ここでは、バナナはフィールド内で放射状に引っ張られます: