SpriteKit в Xamarin.iOS
SpriteKit, 2D графические платформы apple, имеет некоторые интересные новые возможности в iOS 8 и OS X Yosemite. К ним относятся интеграция с SceneKit, поддержка шейдера, освещение, тени, ограничения, нормальное создание карты и улучшения физики. В частности, новые функции физики делают его очень легко добавить реалистичные эффекты в игру.
Физические тела
SpriteKit включает 2D-API физики жесткого тела. Каждый спрайт имеет связанное физическое тело (SKPhysicsBody
), которое определяет свойства физики, такие как масса и трение, а также геометрия тела в мире физики.
Создание физического тела на основе текстуры
SpriteKit теперь поддерживает извлечение физического тела спрайта из текстуры. Это упрощает реализацию конфликтов, которые выглядят более естественными.
Например, обратите внимание на следующее столкновение, как банан и обезьяна сталкиваются почти на поверхности каждого изображения:
SpriteKit делает создание такого физического тела возможным с помощью одной строки кода. Просто вызов текстуры SKPhysicsBody.Create
и размера: sprite. PhysicsBody = SKPhysicsBody.Create (sprite). Текстура, спрайт. Размер);
Альфа-пороговое значение
Помимо простого задания свойства непосредственно геометрии, производной от текстуры, приложения могут задать PhysicsBody
и альфа-пороговое значение, чтобы управлять производным геометрией.
Альфа-порог определяет минимальное альфа-значение пикселя, которое необходимо включить в результирующее тело физики. Например, следующий код приводит к немного другому физическому телу:
sprite.PhysicsBody = SKPhysicsBody.Create (sprite.Texture, 0.7f, sprite.Size);
Эффект настройки альфа-порога, как это тонко настраивает предыдущее столкновение, таким образом, что обезьяна падает наверх при столкновении с бананом:
Физические поля
Еще одним большим дополнением к 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);
Затем можно добавить спрайты и задать их 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;
Это приводит к другому принудительному полю, где бананы вытягиваются радиально о поле: