我想在我的iOS游戏中将相同的效果应用于许多不同的精灵,所以我正在寻找一种通用方法,而不是在另一个程序中创建的动画,并使用其图像来创建UIImageView
动画。
这个效果是一个'爆炸'型动画,我的精灵图像被切入不同的部分,然后,使用物理引擎,这些部分会在掉落之前向不同方向爆炸。
我是SpriteKit的新手,但我假设我必须在Quartz中这样做?然后重新添加新图像作为精灵并应用动画?
我真的不知道从哪里开始,更不用说如何继续其余的步骤了。
有没有人有任何想法?
感谢。
答案 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的文档以获取更多信息。