0

我正在寻找一些帮助以集成UIAccelerometer到我cocos2d的基于应用程序中。我目前的设计大致如下:

1 --我的HelloWorldLayer层有一个私有变量——一个名为的类Manager——我将其称为数据管理器。它是向 UI 提供信息的主要数据管理类。

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 秒?

4

1 回答 1

0

解决了!

我最终将加速计作为节点添加到 HelloWorldLayer 层。我认为这与运行循环超出范围或切换模式有关,因此会阻止加速度计收集数据,尽管我不确定。

于 2013-08-12T14:45:35.853 回答