1

所以我有点背景故事。我想实现一个粒子效果和声音效果,当用户摇动他们的 iDevice 时,它​​们都会持续大约 3 秒左右。但是当 UIEvent 中的奶昔构建拒绝工作时,第一个问题就出现了。所以我听取了一些 Cocos 资深人士的建议,只是使用一些脚本来获得“暴力”加速度计输入作为震动。到现在为止工作得很好。

问题是,如果你一直摇晃它,它只会一遍又一遍地堆积粒子和声音。现在这不是什么大不了的事,除非即使你小心翼翼地尝试而不这样做,它也会发生。所以我希望做的是在粒子效果/声音效果开始时禁用加速度计,然后在它们完成后立即重新启用它。现在我不知道我是否应该按计划、NStimer 或其他一些功能来执行此操作。我愿意接受所有建议。这是我目前的“摇”代码。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

    const float violence = 1;
    static BOOL beenhere;
    BOOL shake = FALSE;

    if (beenhere) return;
    beenhere = TRUE;
    if (acceleration.x > violence * 1.5 || acceleration.x < (-1.5* violence))
        shake = TRUE;
    if (acceleration.y > violence * 2 || acceleration.y < (-2 * violence))
        shake = TRUE;
    if (acceleration.z > violence * 3 || acceleration.z < (-3 * violence))
        shake = TRUE;
    if (shake) {
        id particleSystem = [CCParticleSystemQuad particleWithFile:@"particle.plist"];
        [self addChild: particleSystem];

    // Super simple Audio playback for sound effects!

        [[SimpleAudioEngine sharedEngine] playEffect:@"Sound.mp3"];
        shake = FALSE;
    }

    beenhere = FALSE;
}
4

2 回答 2

1

UIAcceleration 有一个时间戳属性。我会修改您的代码以将当前时间戳保存在静态变量(也许static NSTimeInterval timestampOfLastShake?)中的成功摇动中。然后修改if (shake)if (shake && acceleration.timestamp - 3.0f >= timestampOfLastShake)

结果代码:

  static NSTimeInterval timestampOfLastShake = 0.0f;
  if (shake && acceleration.timestamp - 3.0f >= timestampOfLastShake ) {
        timestampOfLastShake = acceleration.timestamp;
        id particleSystem = [CCParticleSystemQuad particleWithFile:@"particle.plist"];
        [self addChild: particleSystem];

    // Super simple Audio playback for sound effects!

        [[SimpleAudioEngine sharedEngine] playEffect:@"Sound.mp3"];
        shake = FALSE;
    }
于 2011-01-09T15:33:14.663 回答
0

您意识到您正在执行单轴加速度检查,并且您无法确保重复加速(即摇晃)。换句话说,如果你的手机掉了,你的代码会认为是有人来回摇晃设备几次(这就是摇晃的意思)并每秒触发很多次。因此,要么对时间应用多轴检查,要么简单地使用抖动 UIEvent。您需要做的就是在您的 UIView(或者更好的 UIWindow)中,- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event确保视图成为第一响应者。这将处理所有加速过滤等,并且应用程序不会被所有加速噪音轰炸(您可以将手机放在桌子上,它不会误认为是震动)。

去这里获取文档:http: //developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

或者:

- (BOOL)canBecomeFirstResponder {
    返回是;
}

// 现在调用 [self becomeFirstResponder]; 某处,在控制器的 viewDidAppear 中说。   

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{

}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
     if (event.subtype == UIEventSubtypeMotionShake) {
    // 你有震动,做点什么
     }
}

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{

}
于 2011-01-21T01:13:23.390 回答