gpt4 book ai didi

animation - iOS7 SpriteKit 如何对两个或多个 Sprite 节点 child 的动画进行分组?

转载 作者:行者123 更新时间:2023-12-05 04:17:30 25 4
gpt4 key购买 nike

我如何为具有多个子节点的节点创建 SpriteKit 动画,并将节点的多个部分作为一个组进行动画操作?

我有以下节点结构:

  • Bird 有 body 、尾部、头部等子节点
  • 头部有上喙、下喙等子节点

在下面的例子中,我想制作整只鸟的动画,让所有的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com