• 加速计(小球dem)


    #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);
        
    }

  • 相关阅读:
    【poj1008】Maya Calendar
    【CodeVS4093】EZ的间谍网络
    2016.6.19 模拟考试
    【poj1129】Channel Allocation
    【poj2676】Sudoku
    Java 2D API
    Java 2D API
    IntelliJ IDEA
    IntelliJ IDEA 使用说明(For Eclipse user)
    IntelliJ IDEA
  • 原文地址:https://www.cnblogs.com/yuwei0911/p/5430181.html
Copyright © 2020-2023  润新知