2011-01-08 9 views
1

Итак, я немного предыстория. Я хотел реализовать эффект частиц и звуковой эффект, который длится около 3 секунд или около того, когда пользователь встряхивает свою iDevice. Но первый выпуск появился, когда сборка в UIEvent для коктейлей отказалась работать. Поэтому я принял совет нескольких ветеранов Cocos просто использовать какой-то сценарий, чтобы получить «сильные» акселерометры в качестве встряски. До сих пор вели себя отлично.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, убедившись, что представление становится первым ответчиком. Это позаботится обо всех фильтрах ускорения и т. Д., И приложение не будет подвергнуто бомбардировке всеми шумами ускорения (вы можете отбросить свой телефон на стол, и это не будет ошибкой для дрожания).

Перейти здесь документ: 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 
{ 

}