Xamarin.iOS 中的 SpriteKit
來自 Apple 的 2D 圖形架構 SpriteKit 在 iOS 8 和 OS X Yosemite 中有一些有趣的新功能。 其中包括與 SceneKit 整合、著色器支援、光源、陰影、條件約束、一般地圖產生,以及物理增強功能。 特別是,新的物理特徵可讓您輕鬆地將現實效果新增至遊戲。
物理主體
SpriteKit 包含 2D 剛性主體物理 API。 每個Sprite都有一個相關聯的物理主體 (SKPhysicsBody
) 定義物理特性,例如品質與摩擦,以及物理世界中主體的幾何。
從紋理建立物理主體
SpriteKit 現在支援從其紋理衍生 Sprite 的物理主體。 這可讓您輕鬆地實作看起來更自然的衝突。
例如,請注意下列衝突中香蕉和猴子在每張影像表面的碰撞方式:
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 閾值的效果微調先前的碰撞,使猴子在與香蕉相撞時摔倒:
物理欄位
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);
}
這會導致香蕉像欄位節點周圍的春天一樣振蕩:
星形重力欄位
新增不同的欄位很類似。 例如,下列程式代碼會建立星形重力欄位:
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;
這會產生不同的強制欄位,其中香蕉在欄位上以星形方式提取: