ios - SpriteKit,使用加速度计返回前景时, Sprite 移动得非常快

标签 ios iphone objective-c sprite-kit

在我的 Sprite Kit 游戏中,角色通过倾斜 iPhone 来移动。我已经使用 CMMotionManager 完成了此任务。它就像一个魅力。

- (void)processUserMotionForUpdate:(NSTimeInterval)currentTime
{
    CMAccelerometerData *data = self.motionManager.accelerometerData;

    //NSLog(@"data is %2@", data);

    if (fabs(data.acceleration.x) > 0.2)
        {
            [self.player.physicsBody applyForce:CGVectorMake(40 * data.acceleration.x, 0)];
        }
}

谢谢雷·温德利希!

我使用以下代码启动和停止加速度计。

[self.motionManager startAccelerometerUpdates];
[self.motionManager stopAccelerometerUpdates];

这也很好用。

我遇到的问题是当应用程序进入后台然后返回前台时。我让加速度计在进入后台时停止,并在到达前台时重新启动。但是,如果我在应用程序处于后台时倾斜 iPhone,然后返回应用程序,我的 Sprite 会到处乱射。这几乎就像加速计在后台保存了缓存中的数据并立即将其全部取出!

为了解决这个问题,我尝试使用加速计更新间隔。我用 NSLogged 这个值,结果是 0.010000。因此,当应用程序进入后台时,我将其设置为一个非常高的数字,希望加速度计能够记录更多数据。

self.motionManager.accelerometerUpdateInterval = 11111;

但是没有用。如果我倾斜手机,回到应用程序时角色仍然会四处射击。如果我保持非常稳定,这种情况就不会发生。当应用程序进入前台时,我什至将角色的速度设置为零,但这也不起作用。有谁知道如何处理这个问题?提前致谢!!

编辑#1

这就是我的更新方法。

-(void)update:(CFTimeInterval)currentTime
{
    // Called before each frame is rendered
    NSTimeInterval delta = currentTime - self.previousUpdateTime;

    if (delta > 0.02)
    {
        delta = 0.02;
    }

    self.previousUpdateTime = currentTime;
    [self.player update:delta];
}

其中 previousUpdateTime 是 NSTimeInterval。

编辑#2

根据 Theis 的建议,我记录了一个从 0 开始并在每次调用该方法时递增的数字,然后我还记录了该方法被调用的时间,并在应用程序后台运行时获得了以下结果,然后将其带入到前台。

2014-07-12 10:42:34.838 ChargedUp[439:60b] number is 245.000000 at , 33078.175972
2014-07-12 10:42:34.855 ChargedUp[439:60b] number is 246.000000 at , 33078.192806
2014-07-12 10:42:34.871 ChargedUp[439:60b] number is 247.000000 at , 33078.209226

进入后台,返回后我就明白了

2014-07-12 10:42:42.762 ChargedUp[439:60b] number is 248.000000 at , 33086.082453
2014-07-12 10:42:42.798 ChargedUp[439:60b] number is 249.000000 at , 33086.125970
2014-07-12 10:42:42.803 ChargedUp[439:60b] number is 250.000000 at , 33086.142641
2014-07-12 10:42:42.822 ChargedUp[439:60b] number is 251.000000 at , 33086.159510
2014-07-12 10:42:42.837 ChargedUp[439:60b] number is 252.000000 at , 33086.176046

因此,该方法似乎定期被调用。我还记录了当前时间的加速度计的值并得到了。

2014-07-12 10:50:30.367 ChargedUp[452:60b] data is x 0.288071 y -0.562469 z -0.778046 @ 33553.664755 at , 33553.704597
2014-07-12 10:50:30.382 ChargedUp[452:60b] data is x 0.286469 y -0.550476 z -0.794571 @ 33553.684229 at , 33553.721224
2014-07-12 10:50:30.399 ChargedUp[452:60b] data is x 0.292175 y -0.541321 z -0.808090 @ 33553.703698 at , 33553.737901

进入后台然后返回,我明白了。

2014-07-12 10:50:41.716 ChargedUp[452:60b] data is x -0.241135 y -0.416245 z -0.877899 @ 33565.009330 at , 33565.036282
2014-07-12 10:50:41.756 ChargedUp[452:60b] data is x -0.253601 y -0.390457 z -0.879852 @ 33565.067755 at , 33565.087821
2014-07-12 10:50:41.765 ChargedUp[452:60b] data is x -0.253601 y -0.390457 z -0.879852 @ 33565.067755 at , 33565.104657
2014-07-12 10:50:41.783 ChargedUp[452:60b] data is x -0.246246 y -0.403030 z -0.869965 @ 33565.087311 at , 33565.121255
2014-07-12 10:50:41.799 ChargedUp[452:60b] data is x -0.250214 y -0.405685 z -0.860123 @ 33565.106754 at , 33565.137892

201

opps,我想我不需要额外的 currentTime 阅读!感谢您的帮助。

编辑#3 [解决方案]

感谢泰斯的帮助,我终于弄清楚了。我最终记录了加速度计的所有数据,发现它立即进入后台时并没有停止。我正在使用通知暂停我的游戏。

[[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(willResignActive) 名称:UIApplicationWillResignActiveNotification 对象:nil];

在 willResignActive 方法中暂停我的游戏。但是,我将这些通知放置在保存 Sprite Kit 场景的 View Controller 中。因此,当应用程序实际执行 Resign Active 时,加速计需要一些时间才能真正停止。事实上,直到我触摸多任务 View 中的另一个窗口。所有这些数据都由加速度计保存,然后在返回时使用。所以我只需将通知放在场景本身中,现在一切正常。感谢大家的见解。

最佳答案

我认为让它进入后台、恢复然后返回游戏没有多大意义,而不在最后一次读数和你回来后得到的第一个读数之间进行插值。在游戏术语中,它基本上意味着用户可以无限快地“移动”设备。也就是说,用户可以将设备向左倾斜,然后将其置于背景中。在后台向右倾斜,然后再次打开。现在加速度计数据出现了巨大的跳跃,这意味着巨大的跳跃。解决它的一种方法是让加速度计不设置移动物理对象的速度,但有一个随时间影响速度的中间变量。

关于ios - SpriteKit,使用加速度计返回前景时, Sprite 移动得非常快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687585/

相关文章:

ios - 在 iOS 设备上实现 WebRTC

ios - 使用 IOS 更新 Amazon S3 上的文件名

ios - 检测 iOS 设备类型

objective-c - 在iOS上将立体声音频拆分为单声道流

ios - 将图像添加到 navigationItem 的标题

iphone - Objective-C 泄漏

android - 移动应用程序中 webview 和 native 代码之间的通信

iphone - UIPickerView:发送到实例的无法识别的选择器 - 仅在 ios 3.1.x 上

iphone - UIGraphicsGetImageFromCurrentImageContext - 将图像分成两部分创建黑色背景

ios - 将刷新按钮添加到导航栏