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:
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:
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:
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: