2013-08-12 2 views
0

Я ищу некоторую помощь, интегрирующую UIAccelerometer в мое приложение cocos2d. Мой текущий дизайн примерно следующее:Objective-c + cocos2d + акселерометр не работает

1 - Мой HelloWorldLayer слой имеет приватную переменную - класс под названием Manager - что я буду ссылаться как менеджер данных. Это основной класс управления данными, который предоставляет информацию для пользовательского интерфейса.

2 - Метод обновления HelloWorldLayer вызывает метод обновления данных диспетчером.

3 - Ясли данных выделяет новый объект - класс называется accelerationMeter - который предоставляет данные акселерометра и обновляет пользовательский объект данных, который я использую для отслеживания устройств тока ускорения.

4 -accelerationMeter класс устанавливает акселерометр следующим образом:

-(id) init 
{ 
    if (self == [super init]) 
    { 
    // the below call is only used if this object extends CCLayer. Right now it extends NSObject 
     // self.isAccelerometerEnabled = YES; 
     [[UIAccelerometer sharedAccelerometer] setUpdateInterval: 1/60]; 
     [[UIAccelerometer sharedAccelerometer] setDelegate: self];  

    // my data type to store acceleration information 
     self.currVector = [[vector alloc] init]; 
    } 
    return self; 
} 

// method called when the UIAccelerometer updates 
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    [self currVector].x = acceleration.x; 
    [self currVector].y = acceleration.y; 
    NSLog([NSString stringWithFormat:@"accelerometer: x = %f, y = %f",self.currVector.x,self.currVector.y]); 
} 

5 - После того, как (казалось бы, точно) 1 секунду успешного сбора данных от UIAccelerometer, то NSLog линия метод «акселерометра» останавливает каротаж. Поэтому делегированный метод перестает быть вызванным.

6 - По желанию, вот код, который я использую для интеграции акселерометра:

// source: HelloWorldLayer.mm 
// purpose: update scene 
-(void) update: (ccTime) dt 
{ 
<snip> 
    world->Step(dt, velocityIterations, positionIterations); 
    [self updateData]; 
<snip> 
} 

// source: HelloWorldLayer.mm 
// purpose: update data and use that for the accelerometer display 
-(void) updateData 
{ 
    if(dataManager) 
    { 
     [dataManager update] 
     <snip> 
     float accelX = [dataManager currentAcceleration].x; 
     float accelY = [dataManager currentAcceleration].y; 
     <snip> 
    } 
} 


// source: Manager.m (the data manager class) 
// called by updater method copied above this 
-(void) update 
{ 
    // replace outdated current accleration with the updated current accel 
    // right now, the accelMonitor class just returns the value of the current acceleration so I will omit the monitor class 
    currentAcceleration = [accelMonitor getCurrent]; 
    NSLog(@"Manger: Update called"); 
} 

// source accelerationMeter.m 
// called by (through an intermediate class) Manager 
// I have verified that this method continues to be called after the accelerometer stops working 
-(vector*) getCurrentAcceleration 
{ 
    NSLog(@"accelerationMeter: getCurrentAcceleration called"); 
    return self.currVector; 
} 

Примечание Я не использую тренажер IOS - я читаю журналы из консоль моего устройства.

Мои главные вопросы:
A - Почему метод делегированного акселерометра перестает выполняться?
B - Как я могу решить эту проблему, чтобы использовать данные акселерометра в течение> 1 секунды?

+0

Можете ли вы опубликовать, как вы интегрируете ускорениеМетр с остальной частью вашего кода? – giorashc

ответ

0

Решенный!

Я закончил тем, что добавил ускоритель в качестве узла к слою HelloWorldLayer. Я думаю, что это как-то связано с тем, что runloop выходит из сферы действия или режимов переключения, что, следовательно, помешает акселерометру собирать данные, хотя я не уверен.