//  加速计-传统用法

//

//  Created by 严焕培 on 15-05-19.

//  Copyright (c) 2015年 sibu. All rights reserved.

//

#import "MainViewController.h"

#import <QuartzCore/QuartzCore.h>

@interface MainViewController () <UIAccelerometerDelegate>

{

// 小球图像

UIImageView     *_ball;

// 小球速度

CGPoint         _ballVelocity;

// 游戏时钟

CADisplayLink   *_gameTimer;

}

@end

@implementation MainViewController

/*

使用DEPRECATED描述符的方法和对象,是不推荐使用的,同时也是官方停止更新的方法

但是,只要存在,就能使用!

提示:加速剂默认是不工作,因为工作会耗电,当设置了采样频率,加速剂开始工作,同时将采样获得的数据

通过代理方法,发送给调用方

UIAcceleration的说明

* timestamp    数据采样发生的时间

* x            x 方向的加速度

* y            y 方向的加速度

* z            z 方向的加速度

}

*/

- (void)viewDidLoad

{

[super viewDidLoad];

UIImage *image = [UIImage imageNamed:@"black.png"];

_ball = [[UIImageView alloc]initWithImage:image];

[_ball setCenter:self.view.center];

[self.view addSubview:_ball];

// 小球初始静止

_ballVelocity = CGPointZero;

// 加速计

// 1. 实例化加速计,因为在手机上有且仅有一个芯片,因此使用单例来访问加速计

UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];

// 2. 设置更新频率(采样频率)

[accelerometer setUpdateInterval:1 / 30.0];

// 3. 设置代理

[accelerometer setDelegate:self];

// 游戏时钟

// 1. 实例化

_gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];

// 2. 主运行循环

[_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

}

#pragma mark - 时钟监听方法

- (void)step

{

[self updateBallLocation];

}

#pragma mark - 更新小球位置

- (void)updateBallLocation

{

// 根据小球位置调整中心点位置

CGPoint center = _ball.center;

// 判断小球的位置是否超出边界,如果超出边界,将小球的方向求反

// 1) 水平方向

// 如果小球的最小x值,小于0,表示左边出界

// CGRectGetMinX(_ball.frame) = _ball.frame.origin.y

// 如果小球的最大x值,大于viewW,表示右边边出界

if (CGRectGetMinX(_ball.frame) < 0 || CGRectGetMaxX(_ball.frame) > self.view.bounds.size.width) {

_ballVelocity.x *= -0.8;

// 修复小球位置

if (CGRectGetMinX(_ball.frame) < 0) {

center.x = _ball.bounds.size.width / 2;

} else {

center.x = self.view.bounds.size.width - _ball.bounds.size.width / 2;

}

}

// 2)垂直方向

if (CGRectGetMinY(_ball.frame) < 0 || CGRectGetMaxY(_ball.frame) > self.view.bounds.size.height) {

_ballVelocity.y *= -0.8;

// 修复小球位置

if (CGRectGetMinY(_ball.frame) < 0) {

center.y = _ball.bounds.size.height / 2;

} else {

center.y = self.view.bounds.size.height - _ball.bounds.size.height / 2;

}

}

center.x += _ballVelocity.x;

center.y += _ballVelocity.y;

[_ball setCenter:center];

}

#pragma mark - 加速计代理方法

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration

{

// 使用加速度调整小球速度

_ballVelocity.x += acceleration.x;

_ballVelocity.y -= acceleration.y;

// 让加速剂仅负责采样数据,更新速度

[self updateBallLocation];

}

@end

最新文章

  1. (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6
  2. var ball0=new Ball(&quot;executing&quot;) 是怎样被执行的?
  3. 黑马程序员_ Objective-c 概述及面向对象与三大特性
  4. JS 传递对象问题,指针引用
  5. Smart210学习-----lcd驱动
  6. ProgressBar及其子类
  7. stack对象与heap对象
  8. Impala入门笔记
  9. QtSQL学习笔记(2)- 连接到数据库
  10. 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)
  11. 工厂类分离与java反射机制
  12. Swift中类的初始化器与继承
  13. 高级UIKit-07(AVAudioPlayer)
  14. USB中CDC-ECM的了解和配置
  15. Vue.js(一)了解Vue
  16. 给Ubuntu系统清理垃圾
  17. Non-negative Integers without Consecutive Ones
  18. gradle/maven/eclipse工程相互转化
  19. (转)【Java FTP及FTP服务器搭建】
  20. thinkphp中的验证器

热门文章

  1. python 日志logging设置按天进行保存,保存近7天,过期日志自动清理
  2. 初识python 之 爬虫:爬取某电影网站信息
  3. unittest_assert断言(4)
  4. iOS二进制方案真实落地经验(30分钟降低到10分钟以内)
  5. 机器学习&amp;恶意代码动态检测
  6. WebGL 与 WebGPU 比对[1] 前奏
  7. cv::copyMakeBorder()中用0值对齐矩阵,方便后续加速傅里叶变换
  8. thinkpad s5 电源功率不足提示
  9. windows10双系统删除linux
  10. unity3d之sokect通信