Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下:
(2)向CMMotionManager的accelerometerUpdateInterval属性中设置通知间隔时间值。
(3)使用NSOperationQueue.currentQueue()建立一个监听队列。
(4)使用startAccelerometerUpdatesToQueue方法更新监听队列,并设置回调函数用于接受加速度通知。在回调函数中使用accelerometerData.acceleration相关属性可以获取x、y、z各个方向的加速度。
2,通知频率设置建议
accelerometerUpdateInterval表示通知频率,表示间隔多少秒通知一次。iPhone开发文档中推荐使用的通知间隔如下:
(1)检测设备朝向:1/10 ~ 1/20
(2)在游戏中需要实时使用加速传感器时:1/30 ~ 1/60
(3)检测敲击设备或者剧烈摇动设备的情况下:1/70 ~ 1/100
3,x,y,z轴
(1)对于iphone手机来说,画面上下为y轴,左右为z轴,贯穿屏幕为z轴。
(2)向上,向右,手机的前面分别是各轴的正方向。
4,加速度(原始加速度)
加速度不仅受震动手机时施加的作用力的影响,还会持续受到重力的影响。因此iphone手机如果垂直拿在手上的话,Y轴负方向将受重力作用,加速度y属性将一直为负值(最小值为-1.0)
力加速度(Gravity),一个是用户对手机施加的加速度(UserAcceleration)(当然我们也可以分别获取这两种加速度)。
所以当手机垂直静止时,虽然UserAcceleration是0,但由于有重力加速度,所以两个合成后加速度y属性便是为负值。
6,测试样例
该应用运行后,将在画面正中央显示一个球体。倾斜手机时,球体将向着倾斜的方向运动。碰撞到四壁后反弹回来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import UIKit import CoreMotion class ViewController : UIViewController , UIAccelerometerDelegate { var ball: UIImageView ! var speedX: UIAccelerationValue =0 var speedY: UIAccelerationValue =0 var motionManager = CMMotionManager () override func viewDidLoad() { super .viewDidLoad() //放一个小球在中央 ball= UIImageView (image: UIImage (named: "ball" )) ball.frame= CGRectMake (0,0,50,50) ball.center= self .view.center self .view.addSubview(ball) motionManager.accelerometerUpdateInterval = 1/60 if (motionManager.accelerometerAvailable) { var queue = NSOperationQueue .currentQueue() motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData : CMAccelerometerData !, error : NSError !) in //动态设置小球位置 self .speedX += accelerometerData.acceleration.x self .speedY += accelerometerData.acceleration.y var posX= self .ball.center.x + CGFloat ( self .speedX) var posY= self .ball.center.y - CGFloat ( self .speedY) //碰到边框后的反弹处理 if posX<0 { posX=0; //碰到左边的边框后以0.4倍的速度反弹 self .speedX *= -0.4 } else if posX > self .view.bounds.size.width { posX= self .view.bounds.size.width //碰到右边的边框后以0.4倍的速度反弹 self .speedX *= -0.4 } if posY<0 { posY=0 //碰到上面的边框不反弹 self .speedY=0 } else if posY> self .view.bounds.size.height{ posY= self .view.bounds.size.height //碰到下面的边框以1.5倍的速度反弹 self .speedY *= -1.5 } self .ball.center= CGPointMake (posX,posY) }) } } } |
(上面是使用Xcode6.4编写的,在Xcode7 beta4中由于语法变化,会报“Type of expression is ambiguous without more context”错误,可使用如下代码。标注的表示修改的地方)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import UIKit import CoreMotion class ViewController : UIViewController , UIAccelerometerDelegate { var ball: UIImageView ! var speedX: UIAccelerationValue =0 var speedY: UIAccelerationValue =0 var motionManager = CMMotionManager () override func viewDidLoad() { super .viewDidLoad() //放一个小球在中央 ball= UIImageView (image: UIImage (named: "ball" )) ball.frame= CGRectMake (0,0,50,50) ball.center= self .view.center self .view.addSubview(ball) motionManager.accelerometerUpdateInterval = 1/60 if (motionManager.accelerometerAvailable) { let queue = NSOperationQueue .currentQueue() motionManager.startAccelerometerUpdatesToQueue(queue!, withHandler: { (accelerometerData : CMAccelerometerData ?, error: NSError ?) -> Void in //动态设置小球位置 self .speedX += accelerometerData!.acceleration.x self .speedY += accelerometerData!.acceleration.y var posX= self .ball.center.x + CGFloat ( self .speedX) var posY= self .ball.center.y - CGFloat ( self .speedY) //碰到边框后的反弹处理 if posX<0 { posX=0; //碰到左边的边框后以0.4倍的速度反弹 self .speedX *= -0.4 } else if posX > self .view.bounds.size.width { posX= self .view.bounds.size.width //碰到右边的边框后以0.4倍的速度反弹 self .speedX *= -0.4 } if posY<0 { posY=0 //碰到上面的边框不反弹 self .speedY=0 } else if posY> self .view.bounds.size.height{ posY= self .view.bounds.size.height //碰到下面的边框以1.5倍的速度反弹 self .speedY *= -1.5 } self .ball.center= CGPointMake (posX,posY) }) } } } |
Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例的更多相关文章
- Swift - 委托(delegate)的介绍,及使用样例
1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...
- 加速传感器(CoreMotion) swift
// // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...
- Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下: 组件代码:Score ...
- Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)
前面的几篇文章讲解了自动布局库SnapKit的使用方法.本文通过一个完整的样例(登录页面)来演示在实际项目中如何使用SnapKit来实现自动化布局的.1,效果图如下
- Android 获取加速传感器的值,并去除杂音
1.注册和注销传感器 private void registerSensor() { manager.registerListener(this, manager.getDefaultSensor(S ...
- 设备加速传感器(accelerometer) ---- HTML5+
模块:Accelerometer Accelerometer模块管理设备加速度传感器,用于获取设备加速度信息,包括x(屏幕水平方向).y(垂直屏幕水平方向).z(垂直屏幕平面方向)三个方向的加速度信息 ...
- Pro Android学习笔记(一五四):传感器(4):陀螺仪、加速传感器
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei. 陀螺仪 陀螺仪(Gyr ...
- Swift - 使用socket进行通信(附聊天室样例)
在Swift开发中,如果我们需要保持客服端和服务器的长连接进行双向的数据通信,使用socket是一种很好的解决方案. 下面通过一个聊天室的样例来演示socket通信,这里我们使用了一个封装好的sock ...
- Swift语言 简明基础 代码演示样例
开发环境: Mac.Xcode6.0 下面内容均可创建ios common line项目来測试 1.Hello World演示样例 使用xcode创建新的common line项目,查看主文件main ...
随机推荐
- C/C++ 内存布局详解(经典)(很久前不知哪儿转载的)
一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...
- log4cpp的初步使用
(1)下载log4cpp的工程,编译生成lib文件和dll库 下载路径为:http://sourceforge.net/projects/log4cpp/files/latest/download 如 ...
- Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- 转:onConfigurationChanged的作用
API原文说明:android:configChangesLists configuration changes that the activity will handle itself. When ...
- 【译】在ASP.NET中创建PDF-iTextSharp起步
原文 [译]在ASP.NET中创建PDF-iTextSharp起步 .Net framework 中自身并不包含可以和pdf打交道的方法.所以,当你需要你的ASP.Net Web应用程序中包含创建或与 ...
- splinter python浏览器自动化操作,模拟浏览器的行为
Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...
- VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案
右键工程属性 -> 配置属性 -> 生成事件 ->生成后事件,命令行中的路径加上双引号,如 copy $(ProjectDir)\export\win32\Debug\$(Proje ...
- 在不同编译环境中如何使用sleep()函数
今天在学习有关时间函数时,想让程序暂时挂起,一段时间后在继续执行! 用到了系统函数sleep(): 在vc下sleep函数是以毫秒为单位,如果想让其停留3秒,需要这样做 sleep(3*1000); ...
- sql: sql developer tunnel转接
Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和i ...
- 嵌入式环境:CentOS下添加用户并且让用户获得root权限
CentOS下添加用户并且让用户获得root权限 http://www.centoscn.com/CentOS/config/2014/0810/3471.html 1.添加用户,首先用adduser ...