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