iOS感測器:使用陀螺儀完成一個小球撞壁的小遊戲
上一次藉著實現一個隨螢幕旋轉的小玩意,瞭解了iPhone內建的加速計。今天我們們繼續搞點好玩的東東。按照計劃這次要看看陀螺儀了。
最終我們們會完成一個小球撞壁的小遊戲。小球可以感受到重力,從而能夠隨著手機的運動來一起運動。為了增加一點點趣味性,對小球的運動範圍做了限制。當小球碰到螢幕的邊緣的時候,會進行反彈,相反方向運動。我們們一起來看看實現後的實況錄影:
今天的程式碼比起上次的加速計稍微多了一點點,所以就提供了原始碼供大家批評。同時由於這部分Swfit和Objective-C略微有不太一樣的地方,所以原始碼提供了兩版。
其實不管是加速計還是今天的陀螺儀,都是用到了上次說的iOS當中的那個核心運動框架CoreMotion
。
1. 陀螺儀介紹
陀螺儀主要是用來測量沿著某個特定的座標軸旋轉速度的。在使用中,陀螺儀始終指向一個固定的方向,當運動物體的運動方向偏離預定方向時,陀螺儀就可以感受出來。
在手機上,僅用加速度計沒辦法測量或重構出完整的3D動作,測不到轉動的動作的,加速計只能檢測軸向的線性動作。但陀螺儀則可以對轉動、偏轉的動作做很好的測量,這樣就可以精確分析判斷出使用者的實際動作。而後根據動作,可以對手機做相應的操作。
1.1 陀螺儀的應用場景
各位童鞋相比都玩過Wii,那個體感手柄肯定就用到了陀螺儀。玩家通過揮動運動手柄,來控制遊戲。例如乒乓球、網球、賽車等等。有一些酷炫的APP會通過小幅度的傾斜,偏轉手機,實現彩蛋功能,例如放大縮小之類的。或者把手機螢幕翻轉,就可以拒接電話或者靜音啥的。
拍照類的APP也會通過陀螺儀把拍照時候手的抖動反饋交給影象處理器,以便抓到更清晰穩定的圖片。
還有一些是最近剛剛看到的好賤好賤的APP。例如Send Me To Heaven
,遊戲的玩法超級簡單,只需向天空拋擲手機,扔得越高,分數也就越高。
Throw Me App
另外一個賤不拉幾的APP。這是一個相機APP,使用時開啟APP並將手機拋向空中,當手機在空中時,使用陀螺儀和加速計探測手機是否達到了最高點,且攝像頭是否向下。隨後,該應用將啟用攝像頭快門進行拍照。
1.2 陀螺儀在iOS中的使用
iPhone、iPad、iWatch都有內建的陀螺儀,也都可以讓開發者進行呼叫。同樣,用一張圖展現一下:
2. 陀螺儀的使用
2.1 使用步驟
陀螺儀同樣也是通過CoreMotion
這個框架來管理的,所以和加速計一樣,四個標準步驟:
- 初始化CMMotionManager管理物件;2. 呼叫管理物件的物件方法獲取資料;3. 處理資料;4. 當不需要使用的時候,停止獲取資料。
2.2 陀螺儀資料獲取的兩種方法
CoreMotion中有2種獲取資料方式,一種叫做PUSH的方式,一種叫做PULL的方式。顧名思義,PUSH就是被動的獲取。設定完了之後,執行緒定時把獲取到的資料推送回來。可想而知,對於資源的消耗是會稍微大一點的。
PULL,就是要去索取。拉一下才會獲取到資料。不要不給。上一次加速計我們們給出的程式碼是OC的,今天我們們就用Swift的。
2.2.1 PULL的方式
private func useGyroPull() {
//判斷陀螺儀可不可用
if manager.isGyroAvailable {
//設定陀螺儀多久取樣一次
manager.gyroUpdateInterval = 0.1
//開始更新,後臺執行緒開始執行。這是Pull方式。
manager.startGyroUpdates()
}
//獲取並處理陀螺儀資料。這裡我們就只是簡單的做了列印。
print("X = \(manager.gyroData?.rotationRate.x ?? 0)","Y = \(manager.gyroData?.rotationRate.y ?? 0)","Z = \(manager.gyroData?.rotationRate.z ?? 0)")
}
2.2.2 PUSH的方式
private func useGyroPush() {
//判斷陀螺儀可不可用
if manager.isGyroAvailable {
//設定陀螺儀多久取樣一次
manager.gyroUpdateInterval = 0.1
//Push方式獲取和處理資料,這裡我們一樣只是做了簡單的列印。把取樣的工作放在了主執行緒中。
manager.startGyroUpdates(to: OperationQueue.main, withHandler: { (gyroData, error) in
print("X = \(self.manager.gyroData?.rotationRate.x ?? 0)","Y = \(self.manager.gyroData?.rotationRate.y ?? 0)","Z = \(self.manager.gyroData?.rotationRate.z ?? 0)")
})
} else {
print("陀螺儀不可用")
}
}
3. 開始我們的小遊戲
3.1 思維導圖
3.2 實現
3.2.1 以X軸邊界值處理及碰壁後速度處理為例
// 對球在X軸碰壁進行處理
if currentPoint.x <= imageWidth / 2 {
currentPoint.x = imageWidth / 2
ballXVelocity = -ballXVelocity * 0.8
}
if currentPoint.x >= bounds.size.width - imageWidth / 2 {
currentPoint.x = bounds.size.width - imageWidth / 2
ballXVelocity = -ballXVelocity * 0.8
}
3.2.2 開啟陀螺儀並更新
manager.deviceMotionUpdateInterval = 1 / 60
//注意一下,在Swift沒有了NSOperation。被OperationQueue取代了。
manager.startDeviceMotionUpdates(to: OperationQueue.main) { (motion, error) in
self.ballView!.accelleration = (motion?.gravity)!
//開啟主佇列非同步執行緒,更新球的位置。
DispatchQueue.main.async {
self.ballView!.updateLocation(multiplier: 5000)
}
3.2.3 更新小球的位置
func updateLocation(multiplier : Double) {
if (lastUpdateTime != nil) {
let updatePeriod : Double = Date.init().timeIntervalSince(lastUpdateTime!)
ballXVelocity = ballXVelocity + accelleration.x * updatePeriod
ballYVelocity = ballYVelocity + accelleration.y * updatePeriod
let coefficient = updatePeriod * multiplier
currentPoint = CGPoint(x: currentPoint.x + (CGFloat)(ballXVelocity * coefficient), y: currentPoint.y - (CGFloat)(ballYVelocity * coefficient))
}
lastUpdateTime = Date()
}
3.3 關於Swift中重寫set/get
其實寫到這裡的時候才突然想起來,我們們從來沒有說過Swift怎麼重寫Set/Get方法。而且貌似也沒有分享過iOS開發中多執行緒的東東。下個系列可以就謝謝多執行緒相關的玩意兒吧,如果多執行緒這部分不太明白的話,對不住對不住對不住,馬上補上。
在swift中其實重新set不太常見,但這都是OC留下來的臭毛病,就非要重新咋辦?
可以看看這篇文章iOS 重寫Swift中的set和get方法。](http://www.jianshu.com/p/bc67ca442c9c)。)
這個不是重點,我們們在寫小球的時候用到的是didSet這個方法。這是啥吶?這是swift當中的觀察者,用來監視屬性除了初始化之外的屬性變化。
-
didSet
:在屬性值改變後觸發,didSet可以帶一個oldName的引數,表示舊的屬性,不帶的話預設命名為oldValue。 -
willSet
:在屬性值改變前觸發,可以帶一個newName的引數,沒有的話,該引數預設命名為newValue。
原始碼下載地址:OC+Swift兩版。下載地址
iOS感測器系列之一:加速感測器
iOS感測器系列之二:陀螺儀
iOS感測器系列之三:磁力計
iOS感測器系列之四:指紋感測器&距離感測器
相關文章
- iOS中陀螺儀的使用iOS
- 深度的Android感測器:近距離和陀螺儀 (有原始碼)Android原始碼
- JavaScript 陀螺儀檢測裝置方向(重力感應)JavaScript
- iOS感測器:利用磁力計完成一個AR場景應用iOS
- canvas小球亂撞Canvas
- iOS學習筆記34 加速計和陀螺儀iOS筆記
- Xamarin Essentials教程陀螺儀GyroscopeROS
- Unity3d 陀螺儀Unity3D
- iOS中加速度感測器的使用iOS
- 對js陀螺儀的認知理解JS
- 工業測量儀表儀器核心-----輻射感測控制器 RGI Barcon 21
- iOS 感測器集錦iOS
- iOS感測器:實現一個隨螢幕旋轉的圖片iOS
- android 中感測器的使用Android
- 智慧掃地機器人陀螺儀構建地圖導航方案機器人地圖
- ios製作一個評分儀表iOS
- 感測器-雨滴感測器(雨刷)
- canvas實現的小球四壁碰撞效果程式碼例項Canvas
- 使用canvas實現一個圓球的觸壁反彈Canvas
- 家用儀器血壓測量儀電子方案
- 多功能便攜工具!VH501TC多型別感測器讀數儀,助你完成頻率、溫度、電壓和電流測量!H5多型型別
- 【cartographer_ros】五: 釋出和訂閱陀螺儀Imu資訊ROS
- 如何用樹莓派搭建一個顆粒物感測器樹莓派
- 如何使用 Arduino 製作一個繪圖儀UI繪圖
- android 感測器Android
- 感測器噪聲
- Android自定義view系列:手擼一個帶點兒科技感的儀表盤!AndroidView
- 一個小遊戲遊戲
- iOS 如何測試微信小遊戲&小程式?iOS遊戲
- iOS如何測試微信小遊戲&小程式?iOS遊戲
- 使用原生JS開發一個搶紅包的小遊戲JS遊戲
- 機器人與觸覺感測技術的碰撞,一文初探人類與機器人的觸覺感測機器人
- 工程安全監測儀器:振弦採集儀的應用與發展
- FBG感測器模型模型
- 物聯網感測器61個應用領域
- win10怎麼關閉感測器_win10禁用感測器功能的方法Win10
- 基於arduino uno的DHT11溫溼度感測器的使用UI
- 遲來的總結之一個有儀式感的2019啟航 | 掘金年度徵文