Я ищу некоторую помощь, интегрирующую 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 секунды?
Можете ли вы опубликовать, как вы интегрируете ускорениеМетр с остальной частью вашего кода? – giorashc