Xamarin.iOS의 SpriteKit

Apple의 2D 그래픽 프레임워크인 SpriteKit에는 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 : 스프라이트. PhysicsBody = SKPhysicsBody.Create(스프라이트. 질감, 스프라이트. 크기);

알파 임계값

단순히 속성을 텍스처에서 파생된 기하 도형으로 직접 설정하는 PhysicsBody 것 외에도 애플리케이션은 기하 도형의 파생 방식을 제어하기 위해 알파 임계값을 설정할 수 있습니다.

알파 임계값은 픽셀이 결과 물리학 본문에 포함되어야 하는 최소 알파 값을 정의합니다. 예를 들어 다음 코드는 약간 다른 물리학 본문을 생성합니다.

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

이와 같은 알파 임계값을 조정하면 원숭이가 바나나와 충돌할 때 넘어지게 하여 이전 충돌을 미세 조정합니다.

The monkey falls over when colliding with the banana

물리학 필드

SpriteKit의 또 다른 훌륭한 추가는 새로운 물리학 필드 지원입니다. 이를 통해 소용돌이 필드, 방사형 중력 필드 및 스프링 필드와 같은 항목을 추가하여 몇 가지 이름을 지정할 수 있습니다.

물리학 필드는 다른 SKNode필드와 마찬가지로 장면에 추가되는 SKFieldNode 클래스를 사용하여 만들어집니다. 다양한 물리학 필드를 만들기 위한 다양한 팩터리 메서드 SKFieldNode 가 있습니다. 스프링 필드를 호출 SKFieldNode.CreateSpringField()하고, 방사형 중력 필드를 호출 SKFieldNode.CreateRadialGravityField()하여 만들 수 있습니다.

SKFieldNode 또한 필드 강도, 필드 영역 및 필드 힘 감쇠와 같은 필드 특성을 제어하는 속성이 있습니다.

스프링 필드

예를 들어 다음 코드는 스프링 필드를 만들어 장면에 추가합니다.

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