#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
#import "UIView+Extension.h"
#import "AudioTool.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *ball;
@property(nonatomic ,strong)CMMotionManager * manager;
//记录小球在X , Y 方向的加速度
@property(nonatomic ,assign)CGPoint speed;
//记录小球的坐标
@property(nonatomic ,assign)CGPoint loc ;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//创建运动事件管理者
CMMotionManager * manager = [[CMMotionManager alloc]init];
//使用一个属性来延长manager的生命周期 (否则block无法执行)
self.manager = manager;
//设置加速计数据更新间隔
manager.accelerometerUpdateInterval = 1/30;
//开始监测加速计数据更新
[manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
NSLog(@"%f , %f , %f" , accelerometerData.acceleration.x , accelerometerData.acceleration.y , accelerometerData.acceleration.z);
//我们要通过加速度 算出每一时刻小球的移动距离
//也就是 要通过 上一时间的位移+加速度 = 此时的位移量
//每一时刻的加速度
_speed.x += accelerometerData.acceleration.x;
//因为加速计的坐标的Y方向与手机坐标的Y是相反的
_speed.y -= accelerometerData.acceleration.y;
//更新小球的frame 的x , y 值
self.ball.x += self.speed.x;
self.ball.y += self.speed.y;
//判断小球的坐标, 不让小球移除屏幕范围
if (self.ball.x <= 0 ) {
self.ball.x = 0;
//让小球减速,因为加速一直变大, 小球的速度也就越快,位移也就越大,屏幕就无法捕捉到小球移动了
_speed.x *= -0.5;
}
if (self.ball.x >= self.view.width - self.ball.width) {
self.ball.x = self.view.width - self.ball.width;
_speed.x *= -0.5;
}
if (self.ball.y <= 0) {
self.ball.y = 0;
_speed.y *= -0.5;
}
if (self.ball.y >= self.view.height - self.ball.height) {
self.ball.y = self.view .height - self.ball .height;
_speed.y *= -0.5;
}
//判断小球是否碰撞到边缘
if (self.ball.x ==0 || self.ball.x == self.view.width - self.ball.width || self.ball.y == 0 || self.ball.y == self.view.height - self.ball.height) {
if (self.ball.x == self.loc.x || self.ball.y == self.loc.y) {
}else{
//播放音乐
[AudioTool playWithFileName:@"1.aif"];
}
}
//记录小球位置
_loc.x = self.ball.x;
_loc.y = self.ball.y;
}];
}
以上是CoreMotion框架实现加速计的demo,下面是已经过期的API 实现加速计的代码:
iOS 5.0 推出的UIAccelerometer 后不更新 被CoreMotion 框架替代
•加速计使用步骤
–1. 获取共享加速计对象
–2. 设置加速计数据更新频率
–3. 设置加速计对象代理
//检测 手机 三个方向 上的加速度值
//重力加速度
//加速计 设备 一个 硬件设备
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer = accelerometer;
accelerometer.updateInterval = 1/30.0;
//设置代理
accelerometer.delegate = self;
}
//更新了 加速度的值 就会调用 参数1 加速计 参数2 返回值
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSLog(@"%f %f %f",acceleration.x,acceleration.y,acceleration.z);
}