作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何为具有多个子节点的节点创建 SpriteKit 动画,并将节点的多个部分作为一个组进行动画操作?
我有以下节点结构:
在下面的例子中,我想制作整只鸟的动画,让所有的 child 都弯腰捡起一颗种子。弯腰时,鸟儿张开嘴吃种子。请注意,喙不是鸟的子节点,而是头节点的子节点。
//body does this action
SKAction* bendDown = [SKAction rotateToAngle:M_PI*0.3 duration:lookUpTiming];
//beak does this action
SKAction* openBeak = [SKAction rotateToAngle:-M_PI*0.175 duration:beakDuration + arc4random()%20/100.0];
//I need both actions to be played together as a group:
SKAction* bendAndOpenBeak = [SKAction group:@[bendDown, openBeak]];
//if I call this, the body will perform both actions.
[self runAction:bendAndOpenBeak completion:^{
}];
这是我可以在头节点上运行的代码,它的子节点使用 runAction:onChildWithName:
执行操作但是,我需要将其与主体(的父节点)一起运行父)节点
-(SKAction*)openBeak
{
float angleUp = -M_PI*0.175;
float duration = beakDuration + arc4random()%20/100.0;
SKAction* rotateUp = [SKAction rotateToAngle:angleUp duration:duration];
rotateUp.timingMode = SKActionTimingEaseOut;
SKAction* rotateDown = [SKAction rotateToAngle:-angleUp duration: duration];
rotateUp.timingMode = SKActionTimingEaseOut;
return [SKAction group:@[[SKAction runAction:rotateUp onChildWithName:@"beakUpper"],
[SKAction runAction:rotateDown onChildWithName:@"beakLower"] ]];
}
最佳答案
[SKAction runAction:onChildWithName:]
具有瞬时持续时间,因此您的组操作不会等待其完成。
让组等待所有 Action 完成的简单方法是向组添加一个[SKAction waitForDuration:]
,并使用传入的 Action 的持续时间属性[SKAction runAction:onChildWithName:]
因此在您的示例中,所需的代码如下所示
-(SKAction*)openBeak {
float angleUp = -M_PI*0.175;
float duration = beakDuration + arc4random()%20/100.0;
SKAction* rotateUp = [SKAction rotateToAngle:angleUp duration:duration];
rotateUp.timingMode = SKActionTimingEaseOut;
SKAction* waitForRotateUp = [SKAction waitForDuration:rotateUp.duration];
SKAction* rotateDown = [SKAction rotateToAngle:-angleUp duration: duration];
rotateUp.timingMode = SKActionTimingEaseOut;
SKAction* waitForRotateDown = [SKAction waitForDuration:rotateDown.duration];
return [SKAction group:@[[SKAction runAction:rotateUp onChildWithName:@"beakUpper"],
[SKAction runAction:rotateDown onChildWithName:@"beakLower"],
waitForRotateDown, waitForRotateUp]];
}
我在上面的示例中使用了 SKActions duration 属性,尽管您明确设置了持续时间值,因为这种方法可用于未明确设置持续时间的 Action ,例如 Sprite 动画。
关于animation - iOS7 SpriteKit 如何对两个或多个 Sprite 节点 child 的动画进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918421/
我是一名优秀的程序员,十分优秀!