我有一个用户界面,允许某人移动一个拨号盘和拨号盘‘卡扣‘到拨号盘上的每个‘标记‘上。
我想给这个添加声音,我已经做了一个非常短的“咔嗒”的声音,这是一秒的分数。
我不想限制用户旋转表盘的速度,但我希望在表盘转到每个标记时播放声音。
所以我需要一个快速响应的音频库来使用,但是我也知道我需要限制它播放的次数,以防他们旋转得太快,否则声音会变成一个持续的噪音,而不是明显的点击。
我看到评论说AVFoundation
太慢了,AVAudioEngine
会给予更好的性能,但我仍然不确定这是否是最好的方法,以及如何解决限制“重复声音”,使其不仅仅是一个可怕的噪音。
我意识到这是游戏程序员比非游戏iOS应用程序开发人员处理更多的事情,但我仍然坚持一种方法。
1条答案
按热度按时间wyyhbhjk1#
一种方法……
每当“当前刻度线”***发生变化***时,播放“点击”声。
这将略有不同,这取决于你是如何动画的“拨号”-但概念是相同的。让我们以滚动视图为例。
对于可滚动的内容,我们将使用一个视图,并每隔20点绘制一个垂直的“刻度线”,甚至在100点的位置上更高。我们还将在水平中心附近用一条垂直线覆盖一个视图--所以当一个刻度点到那条线时,我们想播放一个“点击”。我们将调整内容的大小,以便只能水平滚动。
它看起来像这样:
在稍微滚动之后:
当使用典型的滚动视图实现
scrollViewDidScroll(...)
时,快速滚动是非常容易的。如此之快,以至于.contentOffset.x
可以在两次通话之间改变200+个点。如果我们尝试在每20点变化时播放滴答声,我们可能会在基本相同的时间播放10次。
所以,我们可以创建一个类属性:
然后计算
scrollViewDidScroll(...)
中的 * 当前刻度线 *。如果值不同,则播放滴答声:如果我们非常非常快地滚动/拖动,我们不需要点击每个刻度标记...因为我们没有看到每一个刻度线都穿过中线。
当滚动减速时--或者当拖动缓慢时--我们会在每个刻度上得到一个点击。
这里有一些快速的示例代码来尝试...
TickView-每20点打一次勾
MidLineView-要覆盖在滚动视图上的垂直线
ViewController-控制器示例