非官方的iOS 7 SpriteKit运行时,用于Spine 2D (http://esotericsoftware.com)
官方运行时在这里:http://esotericsoftware.com/spine-runtimes
我为自己的项目编写了快速代码,该项目同时使用SpriteKit和Spine 2D。尽管它并不完全支持Spine 2D的所有功能,但它基本上,
直到esoteric软件的SpriteKit运行时官方发布,如果您考虑同时使用Spine和SpriteKit,它可能是一个快速启动器。
随时分叉并发送pull request!
一旦您已经克隆了此项目,别忘了初始化和更新spine-runtimes子模块,这是官方运行时。
$ git clone https://github.com/simonkim/spine-spritekit $ git submodule init $ git submodule update
下面的示例假设骨(.JSON)、图集(.atlas)和纹理图集图像(.png)被包含在应用包中。例如,演示应用包含以下文件用于spineboy和goblins骨骼:
此外,示例中使用的骨骼名称参数用于通过附加扩展名(.json和.atlas)解析骨骼名称和图集文件
// Use DZSpineScene class to load skeleton JSON, atlas, and texture image files with scale parameter to build an SKScene object DZSpineScene * scene = [[DZSpineScene alloc] initWithSize:size skeletonName:@"spineboy" animationName:@"walk" scale:1]; // adjust root position scene.rootNode.position = CGPointMake(size.width /2, size.height /3); scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene to an SKView object SKView * skView = (SKView *)self.view; [skView presentScene:scene];
+ (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; }
+ (SKScene *) buildGoblinWithSize:(CGSize) size { SpineSkeleton *skeleton = [DZSpineSceneBuilder loadSkeletonName:@"goblins" scale:1]; // skin: "goblin" spSkeleton_setSkinByName(skeleton.spineContext->skeleton, "goblin"); spSkeleton_setSlotsToSetupPose(skeleton.spineContext->skeleton); DZSpineSceneDescription *sceneDesc = [DZSpineSceneDescription description]; NSArray *tracks = @[ // goblin @{ @"skeleton" : skeleton, @"scale" : @(1), @"position" : NSStringFromCGPoint(CGPointMake(0, -200)), @"animations" : @[ @{@"name" : @"walk"}, @{@"delay" : @(1.5)}, // delay for 1.5s @{@"name" : @"walk"}, @{@"name" : @"walk"}, @{@"delayUntil" : @(5)}, // delay until 5s from the beginning ], @"loop" : @(YES) } ]; [tracks enumerateObjectsUsingBlock:^(NSDictionary *track, NSUInteger idx, BOOL *stop) { [sceneDesc addTrackRaw: track]; }]; NSArray *nodes = [sceneDesc buildScene]; SKNode *placeHolder = [SKNode node]; placeHolder.position = CGPointMake(size.width /2, size.height /3); [nodes enumerateObjectsUsingBlock:^(SKNode *node, NSUInteger idx, BOOL *stop) { [placeHolder addChild:node]; }]; SKScene *scene = [[SKScene alloc] initWithSize:size]; scene.scaleMode = SKSceneScaleModeAspectFill; scene.backgroundColor = [UIColor whiteColor]; [scene addChild:placeHolder]; return scene; }
+ (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; }