从加速度计执行操作

3

我很新手 Xcode 编程,并已经遇到了难题。 我想做的是,在检测到足够的加速度时播放声音。 可以有人请教我我在做什么错了吗?(我怀疑是每件事都错了)。

代码:

#import "LZDViewController.h"

@interface LZDViewController ()

@end

@implementation LZDViewController

- (void)viewDidLoad;{

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CMAccelerometerData *accelerometerData = self.motionManager.accelerometerData;
if (fabsf(accelerometerData.acceleration.x) > 1.2
    || fabsf(accelerometerData.acceleration.y) > 1.2
    || fabsf(accelerometerData.acceleration.z) > 1.2)
{
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio.wav", [[NSBundle mainBundle] resourcePath]]];
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    audioPlayer.numberOfLoops = 0;



    [audioPlayer play];


}
}

@end

编辑: 这是我 .h 文件的代码

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
#import <AVFoundation/AVFoundation.h>
@interface LZDViewController : UIViewController
//{AVAudioPlayer *audioPlayer;}

@property (strong, nonatomic) CMMotionManager *motionManager;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;




@end

我仍然无法得到任何快乐,对于手把手的帮助我深表歉意。 我只看到一个白屏,但声音文件从未播放过。我已经导入了正确的框架,并且可以通过一个按钮播放声音,但我真的想要使用加速度计来播放声音。 谢谢。

1个回答

1

首先,你需要在接口文件或实现文件的接口扩展中定义两个属性。这些属性将是运动管理器和音频播放器。

@property (strong, nonatomic) CMMotionManager *motionManager;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

然后我们可以在viewDidLoad中完成其他所有工作。下面的代码为运动管理器设置了一个新的操作队列以接收加速度计事件,在初始化音频播放器和运动管理器之后,开始以每秒30次的间隔获取加速度计更新。最后,在加速度计更新块中,只需使用您已经构建的相同逻辑来检查加速度数据,如果符合要求,则继续到下一个条件。
**我已配置此示例,如果播放器已经在播放,则不会重新开始播放声音
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSOperationQueue *motionQueue = [NSOperationQueue new];

    NSURL *url = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"audioFile" ofType:@"m4a"]];
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [self.audioPlayer prepareToPlay];

    self.motionManager = [CMMotionManager new];
    [self.motionManager setAccelerometerUpdateInterval:1.0f/30.0f];

    [self.motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        if (fabsf(accelerometerData.acceleration.x) > 1.8 || fabsf(accelerometerData.acceleration.y) > 1.8 || fabsf(accelerometerData.acceleration.z) > 1.8) {
            NSLog(@"%@",accelerometerData);
            if (self.audioPlayer) {
                if (!self.audioPlayer.isPlaying) {
                    [self.audioPlayer play];
                }
            }
        }
    }];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接