SpriteKit в Xamarin.iOS

SpriteKit, 2D графические платформы apple, имеет некоторые интересные новые возможности в iOS 8 и OS X Yosemite. К ним относятся интеграция с SceneKit, поддержка шейдера, освещение, тени, ограничения, нормальное создание карты и улучшения физики. В частности, новые функции физики делают его очень легко добавить реалистичные эффекты в игру.

Физические тела

SpriteKit включает 2D-API физики жесткого тела. Каждый спрайт имеет связанное физическое тело (SKPhysicsBody), которое определяет свойства физики, такие как масса и трение, а также геометрия тела в мире физики.

Создание физического тела на основе текстуры

SpriteKit теперь поддерживает извлечение физического тела спрайта из текстуры. Это упрощает реализацию конфликтов, которые выглядят более естественными.

Например, обратите внимание на следующее столкновение, как банан и обезьяна сталкиваются почти на поверхности каждого изображения:

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

SpriteKit делает создание такого физического тела возможным с помощью одной строки кода. Просто вызов текстуры SKPhysicsBody.Create и размера: sprite. PhysicsBody = SKPhysicsBody.Create (sprite). Текстура, спрайт. Размер);

Альфа-пороговое значение

Помимо простого задания свойства непосредственно геометрии, производной от текстуры, приложения могут задать PhysicsBody и альфа-пороговое значение, чтобы управлять производным геометрией.

Альфа-порог определяет минимальное альфа-значение пикселя, которое необходимо включить в результирующее тело физики. Например, следующий код приводит к немного другому физическому телу:

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

Эффект настройки альфа-порога, как это тонко настраивает предыдущее столкновение, таким образом, что обезьяна падает наверх при столкновении с бананом:

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

Затем можно добавить спрайты и задать их 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