寺子屋管理者

  • アバター画像

教えて!iPhoneアプリ開発全般

公開寺子屋 1 年と 1 か月前に活動

iPhoneアプリ開発全般についての寺子屋です。

衝突音が残る理由が分りません。 (2件の投稿)

← 寺子屋講義   寺子屋講義案内
  • アバター画像 catiapple による3 年と 7 か月前の発言:

    UIDynamicAnimatorを使い、ボールが衝突する時に音が鳴る様にしました。

    ボールは自然にフェードアウトする様になっていますが、
    消えても、音だけがしばらくなり続けてしまいます。
    画面から見えなくなっても、Layerとしてまだ残っているのかと
    思うのですが、どのようにすればいいか分りません。

    ご教授よろしくお願いいたします。

    //touchesMovedでボールを出す。
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint p = [[touches anyObject]locationInView:self.view];
    UIView *circle =[[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
    circle.backgroundColor = [UIColor colorWithRed:0.236 green:0.658 blue:0.887 alpha:1];
    circle.layer.borderWidth = 0.0;
    circle.layer.cornerRadius = 20;
    circle. center = p;

    [self.view addSubview:circle];//画像の表示
    [self.gravity addItem:circle];//画像に重力の反映
    [self.collision addItem:circle];//画像の衝突判定の反映

    [UIView animateWithDuration:2.5f
    delay:1.0f
    options:UIViewAnimationOptionCurveEaseOut
    animations:^{
    circle.alpha = 0.0;
    }completion:^(BOOL finished){
    [circle removeFromSuperview];
    [self.gravity removeItem:circle];
    [self.collision removeItem:circle];

    }];

    //バウンドした時の動作ビヘビアー//
    UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc]initWithItems:@[circle]];
    itemBehavior.elasticity = 0.7;

    [self.animator addBehavior:itemBehavior];

    }

    //衝突時に呼ぶメソッド,衝突の都度色が変わる。衝突時に音が鳴る。
    -(void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id)item withBoundaryIdentifier:(id)identifier atPoint:(CGPoint)p
    {
    //NSLog(@”Boundary contact occurred – %@”, identifier);

    UIView* view = (UIView*)item;
    view.backgroundColor = [UIColor yellowColor];
    [UIView animateWithDuration:0.3 animations:^{
    view.backgroundColor = [UIColor orangeColor];
    }];

    //音を鳴らす
    AudioServicesPlaySystemSound(soundID);
    }

    もう一つ、
    アプリ申請後のファイルでrun出来無くなってしまいました。
    どこを直せば良いのでしょうか?

  • アバター画像 reborn による3 年と 6 か月前の発言:

     UIDynamicAnimatorは衝突を知らせるだけで、知らせた先で何をやってるかは関知しません。
     AudioServicesPlaySystemSoundは指定されたサウンドを鳴らし切って終わるという仕様なので、ボールが消える消えないに関係なく指定した音が鳴り続ける事になります。
     音を好きなタイミングで止めたい場合、私はAVAudioPlayerを使う事にしています。
     何か他にもっと簡単なやり方があればいいんですが、誰か知りませんかね〜

     消すタイミングはUIView animateWithDuration:〜の完了処理で判断すればいいでしょう。

     ここらへんをいろいろ面倒見てくれるようになってるのがミドルウエアのUnityです。