共用方式為


Xamarin.iOS 中的 SpriteKit

來自 Apple 的 2D 圖形架構 SpriteKit 在 iOS 8 和 OS X Yosemite 中有一些有趣的新功能。 其中包括與 SceneKit 整合、著色器支援、光源、陰影、條件約束、一般地圖產生,以及物理增強功能。 特別是,新的物理特徵可讓您輕鬆地將現實效果新增至遊戲。

物理主體

SpriteKit 包含 2D 剛性主體物理 API。 每個Sprite都有一個相關聯的物理主體 (SKPhysicsBody) 定義物理特性,例如品質與摩擦,以及物理世界中主體的幾何。

從紋理建立物理主體

SpriteKit 現在支援從其紋理衍生 Sprite 的物理主體。 這可讓您輕鬆地實作看起來更自然的衝突。

例如,請注意下列衝突中香蕉和猴子在每張影像表面的碰撞方式:

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

SpriteKit 可讓您使用單行程式代碼來建立這類物理主體。 只要使用紋理和大小呼叫 SKPhysicsBody.Create :sprite 即可。PhysicsBody = SKPhysicsBody.Create (sprite.紋理,Sprite。大小] ;

Alpha 臨界值

除了直接將 屬性設定 PhysicsBody 為衍生自紋理的幾何之外,應用程式還可以設定和Alpha閾值來控制幾何的衍生方式。

Alpha 閾值會定義圖元必須包含在產生的物理主體中必須包含的 Alpha 最小值。 例如,下列程式代碼會產生稍微不同的物理主體:

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

調整像這樣的 Alpha 閾值的效果微調先前的碰撞,使猴子在與香蕉相撞時摔倒:

The monkey falls over when colliding with the banana

物理欄位

SpriteKit 的另一個絕佳補充是新的物理欄位支援。 這些可讓您新增一些專案,例如旋紋欄位、星形重力欄位和彈簧欄位。

物理欄位是使用 SKFieldNode 類別建立的,該類別會新增至場景,就像任何其他 SKNode一樣。 有各種不同的處理站方法 SKFieldNode 可建立不同的物理欄位。 您可以藉由呼叫 SKFieldNode.CreateSpringField()、呼叫 SKFieldNode.CreateRadialGravityField()星形重力欄位等等來建立彈簧欄位。

SKFieldNode 也有屬性可控制欄位屬性,例如欄位強度、欄位區域,以及場力的衰減。

Spring Field

例如,下列程式代碼會建立 spring 欄位,並將其新增至場景:

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

然後,您可以新增Sprite並設定其 PhysicsBody 屬性,讓物理欄位會影響Sprite,如下列程式代碼在使用者觸碰螢幕時所做的一樣:

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