Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-添加‘;爆炸’;效果(将雪碧分成小块,然后掉落)到雪碧中的雪碧_Ios_Sprite Kit_Quartz 2d - Fatal编程技术网

iOS-添加‘;爆炸’;效果(将雪碧分成小块,然后掉落)到雪碧中的雪碧

iOS-添加‘;爆炸’;效果(将雪碧分成小块,然后掉落)到雪碧中的雪碧,ios,sprite-kit,quartz-2d,Ios,Sprite Kit,Quartz 2d,我想在我的iOS游戏中对许多不同的精灵应用相同的效果,因此我希望采用通用方法,而不是在另一个程序中创建动画,并使用其图像创建UIImageView动画 这个效果是一个“爆炸”类型的动画,我的精灵的图像被切碎成不同的碎片,然后,使用物理引擎,这些碎片在下落之前被从不同的方向爆炸出来 我是SpriteKit的新手,但我假设我必须用石英做这个?然后将新图像重新添加为精灵并应用动画 我真的不知道从哪里开始,更不用说如何继续剩下的步骤了 有人有什么想法吗 谢谢。1)在初始化所述爆炸对象时,首先我们创建一个

我想在我的iOS游戏中对许多不同的精灵应用相同的效果,因此我希望采用通用方法,而不是在另一个程序中创建动画,并使用其图像创建
UIImageView
动画

这个效果是一个“爆炸”类型的动画,我的精灵的图像被切碎成不同的碎片,然后,使用物理引擎,这些碎片在下落之前被从不同的方向爆炸出来

我是SpriteKit的新手,但我假设我必须用石英做这个?然后将新图像重新添加为精灵并应用动画

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

有人有什么想法吗

谢谢。

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

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

- (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;
}
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*)]

注:物理反应发生在
SKScene
中。我们公开此动作,以便场景可以在场景中的对象上运行它。您还需要遵守场景中名为
skphysiccontactdelegate
的协议,并调用:

[myExplodingObject explosionSequence];
在委托方法中:

- (void)didBeginContact:(SKPhysicsContact *)contact
在这个
skphysiccontact
对象中有两个碰撞的物体。这两个实体(“爆炸对象”和“爆炸触发器”)都必须初始化其
SKPhysicsBody
属性,并设置其
contactTestBitMask
属性(以便该对象知道它会与什么发生冲突)。我还将设置
categoryBitMask
属性,以便我们可以直接内省身体的类型。我们参照这些碰撞体,如下所示:

- (void)didBeginContact:(SKPhysicsContact *)contact {
     if(contact.bodyA.categoryBitMask == explodingObjectCategory && contact.bodyB.categoryBitMask == explodingTriggerCategory) {
          [self.myExplodingObject explosionSequence];
     }
}
请查看苹果的文档以了解更多信息

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