Iphone 只发出一次声音?

Iphone 只发出一次声音?,iphone,cocoa-touch,Iphone,Cocoa Touch,我正在尝试实现一个功能,检测用户摇晃iPhone,然后应用程序会发出吠声。到目前为止,我已经在下面附上了代码,并且它是有效的。但是,如果我使劲摇晃手机,它会让两个或更多的人一个接一个地吠叫。我如何确保每次摇动都只发生一次,无论多么困难 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { if (acceleration.

我正在尝试实现一个功能,检测用户摇晃iPhone,然后应用程序会发出吠声。到目前为止,我已经在下面附上了代码,并且它是有效的。但是,如果我使劲摇晃手机,它会让两个或更多的人一个接一个地吠叫。我如何确保每次摇动都只发生一次,无论多么困难

- (void)accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration {
        if (acceleration.x > kAccelerationThreshold ||
            acceleration.y > kAccelerationThreshold ||
            acceleration.z > kAccelerationThreshold) {
            // BARKING SOUND
        }
    }

为什么不在上次播放声音时保留一个值

time_t last_time_played_bark = 0;


#define MINIMUM_TIME_BETWEEN_BARKS 5   // in seconds
time_t now = time(NULL);

if (last_time_played_bark + MINIMUM_TIME_BETWEEN_BARKS < now) {
    // BARKING_SOUND
    last_time_played_bark = now;
}
time\u t last\u time\u play\u bark=0;
#定义两次叫声之间的最短叫声时间(以秒为单位)
time\u t now=时间(空);
如果(上次叫声+叫声之间的最小叫声时间<现在){
//吠声
上次玩的时候=现在;
}

大概你希望吠叫之间的最短时间至少与播放声音所需的时间一样长。

为什么不在上次播放声音时保留一个值

time_t last_time_played_bark = 0;


#define MINIMUM_TIME_BETWEEN_BARKS 5   // in seconds
time_t now = time(NULL);

if (last_time_played_bark + MINIMUM_TIME_BETWEEN_BARKS < now) {
    // BARKING_SOUND
    last_time_played_bark = now;
}
time\u t last\u time\u play\u bark=0;
#定义两次叫声之间的最短叫声时间(以秒为单位)
time\u t now=时间(空);
如果(上次叫声+叫声之间的最小叫声时间<现在){
//吠声
上次玩的时候=现在;
}

大概你会希望吠叫之间的最短时间至少与播放声音所需的时间一样长。

你可以使用NSTimer-看这里:

播放完声音后,将一个名为“hasBarked”的布尔变量设置为YES,然后调用计时器。两秒钟后,计时器将“hasBarked”设置为否并自动禁用。
最后,将整个声音播放方法放入一个if块中,该块仅在“hasBarked”为否时播放声音。

您可以使用NSTimer-请看这里:

播放完声音后,将一个名为“hasBarked”的布尔变量设置为YES,然后调用计时器。两秒钟后,计时器将“hasBarked”设置为否并自动禁用。
最后,将整个声音播放方法放入一个if块中,该块仅在“hasBarked”为否时播放声音。

作为旁注,如果您只想检测抖动手势,您可能会发现使用比尝试从原始加速计数据滚动自己的加速计更容易


我同意Epsilon Prime的建议,将上次播放声音的时间戳存储起来,作为限制播放频率的一种手段。

作为旁注,如果您只想检测抖动手势,您可能会发现使用该方法比尝试根据原始加速计数据滚动自己的加速计更容易


我同意Epsilon Prime的建议,将上次播放声音的时间戳存储起来,作为限制播放频率的一种手段。

。。这是Java函数吗?这在目标C中不起作用:time_t now=time();啊,忘记了time()的参数。修复了示例。是的,time()是标准的C调用。请稍候。。这是Java函数吗?这在目标C中不起作用:time_t now=time();啊,忘记了time()的参数。固定示例。是的,time()是一个标准的C调用。有趣的解决方案。我的解决方案和你的解决方案之间的权衡是NSTimer解决方案可能会产生一个线程或使用OS/硬件计时器(这取决于NSTimer实现)。time()解决方案在每次检查加速(这意味着任务切换)时都会增加操作系统调用的成本。有趣的解决方案。我的解决方案和你的解决方案之间的权衡是NSTimer解决方案可能会产生一个线程或使用OS/硬件计时器(这取决于NSTimer实现)。time()解决方案在每次检查加速时都会增加操作系统调用的开销(这意味着任务切换)。