Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
生活随笔
收集整理的這篇文章主要介紹了
Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1,加速傳感器可以監(jiān)聽到x,y,z三個方向的加速度,使用步驟如下:
(1)實例化CMMotionManager類
(2)向CMMotionManager的accelerometerUpdateInterval屬性中設(shè)置通知間隔時間值。
(3)使用NSOperationQueue.currentQueue()建立一個監(jiān)聽隊列。
(4)使用startAccelerometerUpdatesToQueue方法更新監(jiān)聽隊列,并設(shè)置回調(diào)函數(shù)用于接受加速度通知。在回調(diào)函數(shù)中使用accelerometerData.acceleration相關(guān)屬性可以獲取x、y、z各個方向的加速度。
2,通知頻率設(shè)置建議
accelerometerUpdateInterval表示通知頻率,表示間隔多少秒通知一次。iPhone開發(fā)文檔中推薦使用的通知間隔如下:
(1)檢測設(shè)備朝向:1/10 ~ 1/20
(2)在游戲中需要實時使用加速傳感器時:1/30 ~ 1/60
(3)檢測敲擊設(shè)備或者劇烈搖動設(shè)備的情況下:1/70 ~ 1/100
3,x,y,z軸
(1)對于iphone手機(jī)來說,畫面上下為y軸,左右為x軸,貫穿屏幕為z軸。
(2)向上,向右,手機(jī)的前面分別是各軸的正方向。
4,加速度(原始加速度)
加速度不僅受震動手機(jī)時施加的作用力的影響,還會持續(xù)受到重力的影響。因此iphone手機(jī)如果垂直拿在手上的話,Y軸負(fù)方向?qū)⑹苤亓ψ饔?#xff0c;加速度y屬性將一直為負(fù)值(最小值為-1.0)
5,Gravity和UserAcceleration 網(wǎng)友cruise_H問:motionManager.deviceMotion.userAcceleration.x和motionManager.accelerometerData!.acceleration.x兩個獲取的acceleration有什么區(qū)別? 上面提到的原始的加速度(即通過startAccelerometerUpdates獲取的那個值)實際上是由兩種加速度合成而來的。一個是重力加速度(Gravity),一個是用戶對手機(jī)施加的加速度(UserAcceleration)(當(dāng)然我們也可以分別獲取這兩種加速度)。 所以當(dāng)手機(jī)垂直靜止時,雖然UserAcceleration是0,但由于有重力加速度,所以兩個合成后加速度y屬性便是為負(fù)值。
6,測試樣例
該應(yīng)用運(yùn)行后,將在畫面正中央顯示一個球體。傾斜手機(jī)時,球體將向著傾斜的方向運(yùn)動。碰撞到四壁后反彈回來。 (注意:由于需要用到設(shè)備的重力感應(yīng)器,所以要使用真機(jī)調(diào)試,模擬器運(yùn)行小球不會動。)
(3)使用NSOperationQueue.currentQueue()建立一個監(jiān)聽隊列。
(4)使用startAccelerometerUpdatesToQueue方法更新監(jiān)聽隊列,并設(shè)置回調(diào)函數(shù)用于接受加速度通知。在回調(diào)函數(shù)中使用accelerometerData.acceleration相關(guān)屬性可以獲取x、y、z各個方向的加速度。
2,通知頻率設(shè)置建議
accelerometerUpdateInterval表示通知頻率,表示間隔多少秒通知一次。iPhone開發(fā)文檔中推薦使用的通知間隔如下:
(1)檢測設(shè)備朝向:1/10 ~ 1/20
(2)在游戲中需要實時使用加速傳感器時:1/30 ~ 1/60
(3)檢測敲擊設(shè)備或者劇烈搖動設(shè)備的情況下:1/70 ~ 1/100
3,x,y,z軸
(1)對于iphone手機(jī)來說,畫面上下為y軸,左右為x軸,貫穿屏幕為z軸。
(2)向上,向右,手機(jī)的前面分別是各軸的正方向。
4,加速度(原始加速度)
加速度不僅受震動手機(jī)時施加的作用力的影響,還會持續(xù)受到重力的影響。因此iphone手機(jī)如果垂直拿在手上的話,Y軸負(fù)方向?qū)⑹苤亓ψ饔?#xff0c;加速度y屬性將一直為負(fù)值(最小值為-1.0)
5,Gravity和UserAcceleration 網(wǎng)友cruise_H問:motionManager.deviceMotion.userAcceleration.x和motionManager.accelerometerData!.acceleration.x兩個獲取的acceleration有什么區(qū)別? 上面提到的原始的加速度(即通過startAccelerometerUpdates獲取的那個值)實際上是由兩種加速度合成而來的。一個是重力加速度(Gravity),一個是用戶對手機(jī)施加的加速度(UserAcceleration)(當(dāng)然我們也可以分別獲取這兩種加速度)。 所以當(dāng)手機(jī)垂直靜止時,雖然UserAcceleration是0,但由于有重力加速度,所以兩個合成后加速度y屬性便是為負(fù)值。
6,測試樣例
該應(yīng)用運(yùn)行后,將在畫面正中央顯示一個球體。傾斜手機(jī)時,球體將向著傾斜的方向運(yùn)動。碰撞到四壁后反彈回來。 (注意:由于需要用到設(shè)備的重力感應(yīng)器,所以要使用真機(jī)調(diào)試,模擬器運(yùn)行小球不會動。)
| 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 ????????????????? ????????????????//動態(tài)設(shè)置小球位置 ????????????????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) ????????????}) ????????} ????} } |
總結(jié)
以上是生活随笔為你收集整理的Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java资源大全中文版
- 下一篇: 搜搜