Cocos2d встряска / проблема акселерометра - PullRequest
1 голос
/ 08 января 2011

Итак, я немного предыстории. Я хотел реализовать эффект частиц и звуковой эффект, который длится около 3 секунд или около того, когда пользователь встряхивает свой iDevice. Но первая проблема появилась, когда сборка в UIEvent от сотрясений отказалась работать. Поэтому я воспользовался советом нескольких ветеранов Cocos, чтобы просто использовать какой-нибудь скрипт для получения «сильных» входов акселерометра в виде встряхиваний. Отлично работал до сих пор.

Проблема в том, что если вы продолжаете трясти, это просто складывает частицы и звучит снова и снова. Теперь это не так уж важно, за исключением случаев, когда вы стараетесь и не делаете этого. Поэтому я надеюсь отключить акселерометр при запуске эффекта частиц / звукового эффекта, а затем снова включить его, как только он закончится. Теперь я не знаю, должен ли я сделать это по расписанию, 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;
}

Ответы [ 2 ]

1 голос
/ 09 января 2011

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 голосов
/ 21 января 2011

Вы понимаете, что выполняете одноосные проверки ускорения и не гарантируете, что ускорение повторяется (т. Е. Встряхивание).Другими словами, если вы уроните свой телефон, ваш код будет думать, что кто-то несколько раз трясет устройство назад-четвертым (что и есть сотрясение) и срабатывает много раз в секунду.Итак, примените многоосевые проверки ко времени или просто используйте встряхивание 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
{

}
...