SpineSpriteKit 1.0.0

SpineSpriteKit 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年3月

由Victor Maia Aldecoa维护。



spine-spritekit

非官方的iOS 7 SpriteKit运行时,用于Spine 2D (http://esotericsoftware.com)

官方运行时在这里:http://esotericsoftware.com/spine-runtimes

我为自己的项目编写了快速代码,该项目同时使用SpriteKit和Spine 2D。尽管它并不完全支持Spine 2D的所有功能,但它基本上,

  • 在SKScene (SpriteKit场景对象)上放置Bone和斯柯特附件
  • 使用SKAction对骨时间线进行动画,包括平移、旋转和缩放序列

直到esoteric软件的SpriteKit运行时官方发布,如果您考虑同时使用Spine和SpriteKit,它可能是一个快速启动器。

随时分叉并发送pull request!

更新

2013年10月22日

  • 附件(插槽)动画
  • 允许按骨骼(SpineSkeleton的spineContext属性)访问spine-c结构
  • 为'attachment'而非'slot'覆盖贴图

屏幕截图

iPad iPhone

构建和运行

一旦您已经克隆了此项目,别忘了初始化和更新spine-runtimes子模块,这是官方运行时。
$ git clone https://github.com/simonkim/spine-spritekit

$ git submodule init

$ git submodule update

从Xcode 5打开演示项目

  • 位于Spine-Spritekit-Demo/Spine-Spritekit-Demo.xcodeproject
  • 构建和运行

如何使用

下面的示例假设骨(.JSON)、图集(.atlas)和纹理图集图像(.png)被包含在应用包中。例如,演示应用包含以下文件用于spineboy和goblins骨骼:

  • spineboy.json
  • spineboy.atlas
  • spineboy.png
  • goblins.json
  • goblins.atlas
  • goblins.png

此外,示例中使用的骨骼名称参数用于通过附加扩展名(.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;
}