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

我仍然没有得到任何快乐,我为握手表示歉意。我得到的只是一个白屏,但声音文件从不播放。我已经导入了正确的框架,只需一个按钮就可以播放声音,但我真的很想玩加速度计。谢谢

4

1 回答 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];
                }
            }
        }
    }];
}
于 2013-08-10T02:55:18.793 回答