【问题标题】:How do I stop endlessly playing SpriteKit emitter?如何停止无休止地播放 SpriteKit 发射器?
【发布时间】:2014-06-07 19:21:52
【问题描述】:

我试图阻止发射器在我的 Sprite Kit 项目中无休止地播放。 Lifetime 设置设置为Start=1End=0,它显示了我想要的正确结果(只发出一次)。

当我在更新方法中调用它时,问题就来了,它不断发射,我尝试使用removeFromParentremoveAllAction,但没有运气。你能帮我解决这里的问题吗?

-(void)update:(NSTimeInterval)currentTime {

    [self updateheartPositionFromMotionManager];
    [self matchIt];

    if ( _heart.position.x == 512 && _heart.position.y == 484 ){
        SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:
                  [[NSBundle mainBundle] pathForResource:@"sparkly" ofType:@"sks"]];

        emitter.position = CGPointMake(self.frame.size.width/2,               
                                       CGRectGetMidY(self.frame)+100);;
        emitter.name = @"exhaust";
        emitter.targetNode =_heart;
        [self addChild:emitter];

    }else{

        [self removeFromParent];
    }
}

【问题讨论】:

  • 从更新方法中删除。
  • 所以如果_heart的位置匹配,你就创建了一个发射器。对我来说似乎很难看,你很有可能在这里每秒创建 60 个发射器。就像@akashg 所说,从更新方法中删除创建。我建议你看看 SKEmitterNode 的属性numParticlesToEmit
  • 我知道我在做一些不同的事情。让我今天试一试并更新我的结果

标签: sprite-kit skemitternode


【解决方案1】:

//第一步取一个全局变量 @property BOOL 闪亮添加;在你的 .h 文件中

.m 文件的 init 或实例方法

sparklyAdded=FALSE;

-(void)粒子添加 {

}

-(void)update:(NSTimeInterval)currentTime {

  [self updateheartPositionFromMotionManager];
  [self matchIt];

 if (( _heart.position.x>= 512 && _heart.position.y=< 484 ) && !sparklyAdded){
     SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:
              [[NSBundle mainBundle] pathForResource:@"sparkly" ofType:@"sks"]];

     emitter.position = CGPointMake(self.frame.size.width/2,               
                                   CGRectGetMidY(self.frame)+100);;
     emitter.name = @"exhaust";
     emitter.targetNode =_heart;
     [self addChild:emitter];
     sparklyAdded=TRUE;

  }else{

    [self removeEffect];
 }

}

-(void) removeEffect

{ [self enumerateChildNodesWithName:@"exhaust" usingBlock:^(SKNode *node, BOOL *stop) {

    [node removeAllActions];
    [node removeFromParent];
     sparklyAdded=FALSE;
}];

}

//添加粒子时记住几个大腿 1) 它们是昂贵的 cpu 调用,因此只能从更新循环中添加和删除它们一次

【讨论】:

  • 非常感谢您的专家 cmets,我今天晚上会试试这个并发布我的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2016-06-01
  • 1970-01-01
相关资源
最近更新 更多