2011-01-08 63 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)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; 
    } 
0

你意識到你正在做的單軸加速度檢查,你是不是保證了加速重複(即搖)。換句話說,如果你放下你的手機,你的代碼會認爲有人在幾次(這是一次搖一搖)的時候搖晃設備並且每秒鐘發射很多次。所以,要麼對時間進行多軸檢查,要麼簡單地使用抖動UIEvent。你需要做的只是在你的UIView(或更好的UIWindow)中,實現- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event,確保視圖成爲第一響應者。這將處理所有加速過濾等,並且應用程序不會受到所有加速噪聲的轟擊(您可以將手機放在桌面上,並且不會因此而將其誤認爲是搖一搖)。

去這裏的DOC: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 
{ 

}