1

だから私は少し裏話。ユーザーがiDeviceを振ったときに両方とも約3秒続くパーティクルエフェクトとサウンドエフェクトを実装したかったのです。しかし、シェイク用のUIEventのビルドが機能しなかったときに、最初の問題が発生しました。そこで、私は数人のココスのベテランのアドバイスを受けて、スクリプトを使用して「暴力的な」加速度計の入力を揺れとして取得しました。今までうまくいきました。

問題は、振とうし続けると、粒子が積み重なって何度も鳴るということです。これは、注意深く試みて、そうしない場合でも発生することを除いて、それほど大きな問題にはなりません。ですから、私が望んでいるのは、パーティクルエフェクト/サウンドエフェクトの開始時に加速度計を無効にし、終了したらすぐに再度有効にすることです。これをスケジュール、NStimer、またはその他の関数で実行する必要があるかどうかはわかりません。私はすべての提案を受け入れます。これが私の現在の「シェイク」コードです。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

    const float violence = 1;
    static BOOL beenhere;
    BOOL shake = FALSE;

    if (beenhere) return;
    beenhere = TRUE;
    if (acceleration.x > violence * 1.5 || acceleration.x < (-1.5* violence))
        shake = TRUE;
    if (acceleration.y > violence * 2 || acceleration.y < (-2 * violence))
        shake = TRUE;
    if (acceleration.z > violence * 3 || acceleration.z < (-3 * violence))
        shake = TRUE;
    if (shake) {
        id particleSystem = [CCParticleSystemQuad particleWithFile:@"particle.plist"];
        [self addChild: particleSystem];

    // Super simple Audio playback for sound effects!

        [[SimpleAudioEngine sharedEngine] playEffect:@"Sound.mp3"];
        shake = FALSE;
    }

    beenhere = FALSE;
}
4

2 に答える 2

1

UIAccelerationにはtimestampプロパティがあります。static NSTimeInterval timestampOfLastShakeコードを変更して、静的変数(おそらく?)でのシェイクが成功したときに現在のタイムスタンプを保存します。次に、に変更if (shake)しますif (shake && acceleration.timestamp - 3.0f >= timestampOfLastShake)

結果のコード:

  static NSTimeInterval timestampOfLastShake = 0.0f;
  if (shake && acceleration.timestamp - 3.0f >= timestampOfLastShake ) {
        timestampOfLastShake = acceleration.timestamp;
        id particleSystem = [CCParticleSystemQuad particleWithFile:@"particle.plist"];
        [self addChild: particleSystem];

    // Super simple Audio playback for sound effects!

        [[SimpleAudioEngine sharedEngine] playEffect:@"Sound.mp3"];
        shake = FALSE;
    }
于 2011-01-09T15:33:14.663 に答える
0

あなたは、単軸の加速チェックを行っていて、加速が繰り返されることを保証していないことに気づきました(つまり、揺れます)。言い換えれば、あなたがあなたの電話を落とすならば、あなたのコードはそれが誰かがデバイスを前後に数回振っていると考え(これは揺れが何であるか)そして1秒間に何回も発砲します。したがって、時間に対して多軸チェックを適用するか、単にshakeUIEventを使用します。あなたがする必要があるのはあなたのUIView(またはより良いUIWindow)で- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event、ビューがファーストレスポンダーになることを確認することを実装することです。これにより、すべての加速フィルタリングなどが処理され、アプリがすべての加速ノイズに襲われることはありません(スマートフォンをテーブルに落とすことができ、それをシェイクと間違えることはありません)。

ドキュメントについては、こちらをご覧ください:http: //developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

または:

-(BOOL)canBecomeFirstResponder {
    YESを返します。
}

//ここで[selfbecomeFirstResponder];を呼び出します どこかで、コントローラーのviewDidAppearで言います。   

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{{

}

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{{
     if(event.subtype == UIEventSubtypeMotionShake){
    //シェイクがあります、何かをします
     }
}

-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{{

}
于 2011-01-21T01:13:23.390 に答える