2011-01-08 17 views
1

だから私は少し裏付けです。ユーザーがiDeviceを振ると、約3秒かそこらのパーティクルエフェクトとサウンドエフェクトを実装したかったのです。しかし、最初の問題は、シェイクのためのUIEventを構築することが拒否されたときに到着しました。だから私はいくつかのココスのベテランのアドバイスを取って、 "暴力的な"加速度計入力を揺れとして取得するためのスクリプトを使用しました。今まで素晴らしい仕事をしていました。Cocos2d振動/加速度計の問題

あなたが揺れ続けていると、粒子と音が重なり合うだけです。これを試して慎重にしていても、これは起こることを除いて、これほど大きな取引ではありません。だから、私がしたいことは、パーティクルエフェクト/サウンドエフェクトが開始されたときに加速度計を無効にし、終了するとすぐに再度有効にすることです。今私はスケジュール、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; 
} 

答えて

1

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

if (shake)を変更します。

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; 
    } 
0

あなたは1軸加速度チェックを行っている、あなたは加速が繰り返される確保されていないことを実現する(すなわち振ります)。言い換えれば、携帯電話を落とすと、あなたのコードはデバイスを何度も振り回していると思うでしょう(これは揺れです)、何度も何度も発砲します。したがって、時間に対して複数の軸のチェックを適用するか、または単純にシェイクUIEventを使用します。 UIView(またはUIWindowの方が良い)には、- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)eventを実装して、ビューが最初のレスポンダになるようにするだけです。これは、すべての加速フィルタリングなどを処理し、アプリケーションはすべての加速ノイズ(あなたの携帯電話をテーブルに落とすことができ、それは揺れに間違いません)に砲撃されることはありません。 http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

または::

 
- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

// Now call [self becomeFirstResponder]; somewhere, say in viewDidAppear of the controller. 

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

} 

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if (event.subtype == UIEventSubtypeMotionShake) { 
    // You've got a shake, do something 
    } 
} 

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

} 

は、docのためにここに行きます

関連する問題