Как обнаружить событие встряхивания в cocos2d? - PullRequest
1 голос
/ 30 июня 2010

Я хочу обнаружить дрожание в cocos2d для iPad.

Я нашел многообещающую статью об этом и попытался осуществить это, но потерпел неудачу. http://www.softvelopment.com/index.php/blogs/2010/03/19/3-adding-shake-recongnition-to-cocos2d-iphone-library-

В частности, я не уверен, куда мне поместить слушателя. И более того, есть ли другой хороший способ заставить iPad обнаруживать дрожание с помощью cocos2d?

1 Ответ

2 голосов
/ 30 июня 2010

Может быть, следующий код поможет вам.Я нашел это некоторое время назад (не помню где) и убрал это.Вы можете настроить значения в didAccelerate, в настоящее время это 0,8 и 0,2, чтобы определить, насколько чувствительно оно к встряхиванию и насколько устойчиво вы должны держать устройство, чтобы иметь возможность снова встряхивать.

Заголовок

@protocol ShakeHelperDelegate
-(void) onShake;
@end

@interface ShakeHelper : NSObject <UIAccelerometerDelegate>
{
    BOOL histeresisExcited;
    UIAcceleration* lastAcceleration;

    NSObject<ShakeHelperDelegate>* delegate;
}

+(id) shakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del;
-(id) initShakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del;

@end

Реализация

#import "ShakeHelper.h"


@interface ShakeHelper (Private)
@end

@implementation ShakeHelper

// Ensures the shake is strong enough on at least two axes before declaring it a shake.
// "Strong enough" means "greater than a client-supplied threshold" in G's.
static BOOL AccelerationIsShaking(UIAcceleration* last, UIAcceleration* current, double threshold) 
{
    double
    deltaX = fabs(last.x - current.x),
    deltaY = fabs(last.y - current.y),
    deltaZ = fabs(last.z - current.z);

    return
    (deltaX > threshold && deltaY > threshold) ||
    (deltaX > threshold && deltaZ > threshold) ||
    (deltaY > threshold && deltaZ > threshold);
}

+(id) shakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del
{
    return [[[self alloc] initShakeHelperWithDelegate:del] autorelease];
}

-(id) initShakeHelperWithDelegate:(NSObject<ShakeHelperDelegate>*)del
{
    if ((self = [super init]))
    {
        delegate = del;
        [UIAccelerometer sharedAccelerometer].delegate = self;
    }

    return self;
}

-(void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{
    if (lastAcceleration)
    {
        if (!histeresisExcited && AccelerationIsShaking(lastAcceleration, acceleration, 0.8)) 
        {
            histeresisExcited = YES;

            [delegate onShake];
        }
        else if (histeresisExcited && !AccelerationIsShaking(lastAcceleration, acceleration, 0.2))
        {
            histeresisExcited = NO;
        }
    }

    [lastAcceleration release];
    lastAcceleration = [acceleration retain];
}

-(void) dealloc
{
    CCLOG(@"dealloc %@", self);

    [UIAccelerometer sharedAccelerometer].delegate = nil;
    [lastAcceleration release];
    [super dealloc];
}

@end

Вы используете это так:

[ShakeHelper shakeHelperWithDelegate:self];

Очевидно, что объект self должен реализовывать протокол ShakeHelperDelegate.Сообщение onShake будет отправлено объекту делегата при обнаружении сотрясения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...