我正在为 iPad 开发节拍器。我将CGAffineTransformRotate用于节拍器臂动画,将NSTimer(我对高精度不感兴趣)用于声音,并使用UIPanGestureRecognizer将节拍器重量拖到节拍器臂上。
我的问题是我不知道如何通过使用平底锅拖动重量来更新 bpm。现在我有这个:metronomeWeight.center.y
是240,这个位置的默认bpm是80。重量从前140到最大450。我已经实现了这个方法,但它不正确:
-(void)updateBPM
{
CGFloat weightYPosition = metronomeWeight.center.y;
NSUInteger newBPM = (weightYPosition/3);
self.bpm = newBPM;
}
平底锅的选择器是这样的:
-(void)handlePan:(UIPanGestureRecognizer*)gesture
{
CGPoint translation = [gesture translationInView:metronomeArm];
CGPoint location = [gesture locationInView:metronomeArm];
NSLog(@"miscarea pe oy are valoare de: %f", location.y);
CGPoint newCenter = CGPointMake(metronomeArm.frame.size.width/2, gesture.view.center.y + translation.y );
if (newCenter.y >= 140 && newCenter.y <= 450)
{
gesture.view.center = newCenter;
[gesture setTranslation:CGPointZero inView:metronomeArm];
[self updateBPMFromWeightLocation];
tempoLabel.text = [NSString stringWithFormat:@"%d", self.bpm];
NSLog(@"metronomeWeight position : %f ",metronomeWeight.center.y);
}
}
声音和动画更新但不符合要求,这意味着下限 bpm 应为 225,上限应为 1。在我的情况下,它们分别为 150 和 46。
我的计算不好,所以如果你能帮我解决这个问题,那就太棒了……我看了苹果的节拍器项目好几天了,不明白他们是怎么做到的……
谢谢
得益于@zimmryan 的建议,新的 updateBPM 方法
-(void)updateBPMFromWeightLocation
{
CGFloat weightYPosition = metronomeWeight.center.y;
float lengthInM = ((weightYPosition - 140) * 0.00041333);
float time = 2 * M_PI * sqrt(lengthInM / 9.8);
NSUInteger newBPM = floor(60.0 / time);
self.bpm = newBPM;
}