iOS - 在SpriteKit中添加'爆炸'效果(将Sprite分解成碎片然后掉落)到sprite

时间:2014-06-05 18:03:06

标签: ios sprite-kit quartz-2d

我想在我的iOS游戏中将相同的效果应用于许多不同的精灵,所以我正在寻找一种通用方法,而不是在另一个程序中创建的动画,并使用其图像来创建UIImageView动画。

这个效果是一个'爆炸'型动画,我的精灵图像被切入不同的部分,然后,使用物理引擎,这些部分会在掉落之前向不同方向爆炸。

我是SpriteKit的新手,但我假设我必须在Quartz中这样做?然后重新添加新图像作为精灵并应用动画?

我真的不知道从哪里开始,更不用说如何继续其余的步骤了。

有没有人有任何想法?

感谢。

1 个答案:

答案 0 :(得分:2)

1)在初始化所述爆炸对象时,首先我们创建一个SKTextureAtlas来保存所有动画的图像。您必须具有可用的纹理图集资源。

2)将所有相关的SKTexture加载到数组中。此数组应该对发生爆炸的对象是私有的。 一种安全的方法:

- (void)loadContactImages {
     NSMutableArray *frames = [NSMutableArray array];
     SKTextureAtlas *explosionFrames = [SKTextureAtlas atlasNamed:@"explosionFrames"];
     for(int i = 0; i < explosionFrames.textureNames.count; i++) {
          NSString *textureName = [NSString stringWithFormat:@"explosionFrame_%d" , i]; 
          SKTexture *texture = [explosionFrames textureNamed:textureName];
          if(texture) {
              [frames addObject:texture];
         }
    }
    self.contactFrames = frames;
}

3)然后,您将定义一个为爆炸设置动画的方法。查看SKAction标题以获取更多信息。每帧的插入时间对爆炸有意义

- (SKAction *)runExplosion {
    return [SKAction animateWithTextures:self.contactFrames timePerFrame:0.1];     
}
4)对于爆炸件,你应该预加载它们,以便限制将碎片发送到随机方向的开销(这样我们就不会有额外的开销来创建当时的所有新精灵)爆炸)。不要忘记给他们物理机构(SKPhysicsBody)并将isAffectedByGravity属性设置为YES

- (SKAction *)explosionOfPieces {
     return [SKAction runBlock:^ {
         for(SKSpriteNode *piece in self.explodingPieces)   {
              piece.hidden = NO;
              piece.position = self.position;
              [self addChild:piece];
              [piece.physicsBody applyImpulse:CGVectorMake(dx , dy)]; //specify the direction here
          }
     }];
}

5)将所有这些结合在一起,公开一种方法来返回这些动作的序列。如果您希望将这两个操作一起发生,SKAction上还有一个名为[SKAction group: (NSArray *)]

的类方法
- (void)explosionSequence {
     [self runAction: [SKAction sequence:@[ [self runExplosion] , [self explosionOfPieces]]]];
}

注意:物理反应发生在SKScene中。我们公开此动作,以便场景可以在场景中的对象上运行它。您还需要符合场景中名为SKPhysicsContactDelegate的协议并致电:

[myExplodingObject explosionSequence];

在委托方法中:

- (void)didBeginContact:(SKPhysicsContact *)contact

在这个SKPhysicsContact对象中有两个碰撞体。这两个实体(&#34;爆炸对象&#34;和#34;爆炸触发器&#34;)必须初始化SKPhysicsBody属性并设置其contactTestBitMask属性(因此该对象知道什么它可以碰撞)。我还会设置categoryBitMask属性,这样我们就可以直接反省尸体了。类型。我们像这样引用这些碰撞体:

- (void)didBeginContact:(SKPhysicsContact *)contact {
     if(contact.bodyA.categoryBitMask == explodingObjectCategory && contact.bodyB.categoryBitMask == explodingTriggerCategory) {
          [self.myExplodingObject explosionSequence];
     }
}

请查看Apple的文档以获取更多信息。