I wrote a quick code for my own project that uses Spine 2D Skeletal Animation Tool (http://esotericsoftware.com) and iOS 7 SpriteKit for my own project. Though it does not fully support all the features of Spine 2D, it basically,
- Places Bones and Skot Attachments on SKScene (SpriteKit Scene object)
- Animates Bone and Texture (Slot Attachment) Timelines using SKAction for translate, rotate, scale and texture sequences
- Allows you to change the skin of a Skeleton before animation starts
Official runtimes are here: http://esotericsoftware.com/spine-runtimes
Until the official release of SpriteKit Runtime from Esoteric software, hope it's a quick starter for your projects if you are considering use of Spine and SpriteKit at the same time.
Feel free to fork and send pull requests!
simon
![]()
Usage Examples
Simple
+ (SKScene *) buildSpineboyLoopWithSize:(CGSize) size
{
SKScene *scene = [[SKScene alloc] initWithSize:size];
scene.scaleMode = SKSceneScaleModeAspectFill;
scene.backgroundColor = [UIColor whiteColor];
SpineSkeleton *skeleton = [DZSpineSceneBuilder loadSkeletonName:@"spineboy" scale:1];
DZSpineSceneBuilder *builder = [DZSpineSceneBuilder builder];
SKNode *node = [builder nodeWithSkeleton:skeleton animationNames:@[@"walk", @"jump", @"walk"] loop:YES];
// place holder node for position adjustment
SKNode *placeHolder = [SKNode node];
placeHolder.position = CGPointMake(size.width /2, size.height /3);
[placeHolder addChild:node];
[scene addChild:placeHolder];
return scene;
}
Two Skeletons
+ (SKScene *) buildComplexSceneWithSize:(CGSize) size
{
SpineSkeleton *goblin = [DZSpineSceneBuilder loadSkeletonName:@"goblins" scale:1];
// skin: "goblingirl"
spSkeleton_setSkinByName(goblin.spineContext->skeleton, "goblingirl");
spSkeleton_setSlotsToSetupPose(goblin.spineContext->skeleton);
DZSpineSceneDescription *sceneDesc = [DZSpineSceneDescription description];
NSArray *tracks = @[
// spineboy
@{ @"skeleton" : @"spineboy",
@"scale" : @(1),
@"position" : NSStringFromCGPoint(CGPointMake(-80, -100)),
@"animations" : @[
@{@"name" : @"walk"},
@{@"name" : @"walk"},
@{@"name" : @"jump"},
@{@"name" : @"walk"},
@{@"name" : @"jump"},
@{@"delayUntil" : @(8)},
@{@"name" : @"jump"},
@{@"name" : @"walk"}],
@"loop" : @(YES),
@"wait" : @(YES) },
// goblin
@{ @"skeleton" : goblin,
@"scale" : @(0.8),
@"position" : NSStringFromCGPoint(CGPointMake(30, -200)),
@"animations" : @[
@{@"name" : @"walk"},
@{@"name" : @"walk"},
@{@"name" : @"walk"},
@{@"delayUntil" : @(8)},
@{@"name" : @"walk"},
@{@"name" : @"walk"},
],
@"loop" : @(YES),
@"wait" : @(YES) },];
[tracks enumerateObjectsUsingBlock:^(NSDictionary *track, NSUInteger idx, BOOL *stop) {
[sceneDesc addTrackRaw: track];
}];
NSArray *textures = @[@{ @"skeleton" : @"spineboy",
@"textureName" : @"goblinhead4spineboy",
@"attachment" : @"head"}];
[textures enumerateObjectsUsingBlock:^(NSDictionary *texture, NSUInteger idx, BOOL *stop) {
[sceneDesc addCustomTextureRaw: texture];
}];
NSArray *nodes = [sceneDesc buildScene];
SKNode *placeHolder = [SKNode node];
placeHolder.position = CGPointMake(size.width /2, size.height /2);
// Give zPosition to each character so they don't mix sprites in draw orders
CGFloat __block zPosition = 1000;
[nodes enumerateObjectsUsingBlock:^(SKNode *node, NSUInteger idx, BOOL *stop) {
node.zPosition = zPosition;
[placeHolder addChild:node];
zPosition += 100;
}];
SKScene *scene = [[SKScene alloc] initWithSize:size];
scene.scaleMode = SKSceneScaleModeAspectFill;
scene.backgroundColor = [UIColor whiteColor];
[scene addChild:placeHolder];
return scene;
}