Compartilhar via


SpriteKit no Xamarin.iOS

SpriteKit, a estrutura gráfica 2D da Apple, tem alguns novos recursos interessantes no iOS 8 e no OS X Yosemite. Isso inclui integração com o SceneKit, suporte a sombreador, iluminação, sombras, restrições, geração de mapa normal e aprimoramentos de física. Em particular, os novos recursos de física tornam muito fácil adicionar efeitos realistas a um jogo.

Corpos de Física

O SpriteKit inclui uma API de física corporal rígida 2D. Cada sprite tem um corpo físico associado (SKPhysicsBody) que define as propriedades físicas, como massa e atrito, bem como a geometria do corpo no mundo da física.

Criando um corpo de física a partir de uma textura

O SpriteKit agora dá suporte à derivação do corpo físico de um sprite de sua textura. Isso facilita a implementação de colisões que parecem mais naturais.

Por exemplo, observe na colisão a seguir como a banana e o macaco colidem quase na superfície de cada imagem:

A banana e o macaco colidem quase na superfície de cada imagem

O SpriteKit possibilita a criação desse corpo físico com uma única linha de código. Basta chamar SKPhysicsBody.Create com a textura e o tamanho: sprite. PhysicsBody = SKPhysicsBody.Create (sprite. Textura, sprite. Tamanho);

Limite Alfa

Além de simplesmente definir a PhysicsBody propriedade diretamente para a geometria derivada da textura, os aplicativos podem definir e o limite alfa para controlar como a geometria é derivada.

O limite alfa define o valor alfa mínimo que um pixel deve ter que ser incluído no corpo da física resultante. Por exemplo, o código a seguir resulta em um corpo físico ligeiramente diferente:

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

O efeito de ajustar o limiar alfa como este ajusta a colisão anterior, de modo que o macaco cai ao colidir com a banana:

O macaco cai ao colidir com a banana

Campos de física

Outra grande adição ao SpriteKit é o novo suporte de campo de física. Isso permite adicionar itens como campos de vórtice, campos de gravidade radial e campos de mola para citar apenas alguns.

Os campos de física são criados usando a classe SKFieldNode, que é adicionada a uma cena como qualquer outra SKNode. Há uma variedade de métodos de fábrica em SKFieldNode para criar diferentes campos de física. Você pode criar um campo de mola chamando SKFieldNode.CreateSpringField(), um campo de gravidade radial chamando SKFieldNode.CreateRadialGravityField()e assim por diante.

SKFieldNode também tem propriedades para controlar atributos de campo, como a força do campo, a região do campo e a atenuação das forças de campo.

Campo spring

Por exemplo, o código a seguir cria um campo spring e o adiciona à cena:

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

Em seguida, você pode adicionar sprites e definir suas PhysicsBody propriedades para que o campo de física afete os sprites, como o código a seguir faz quando o usuário toca na tela:

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

Isso faz com que as bananas oscilam como uma mola ao redor do nó de campo:

As bananas oscilam como uma mola ao redor do nó de campo

Campo Gravidade Radial

Adicionar um campo diferente é semelhante. Por exemplo, o código a seguir cria um campo de gravidade radial:

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;

Isso resulta em um campo de força diferente, em que as bananas são puxadas radialmente sobre o campo:

As bananas são puxadas radialmente ao redor do campo