返回列表 發帖

[其它範例] 加速計應用示範 - Shake 搖動偵測

說明:示範抓取加速計的資料來判斷iPhone的Shake搖動動作

示範:

搖晃前的預設文字:沒事


用力搖晃後畫面將顯示為:搖動

程式碼:
AccelerometerDemoViewController.h
  1. #import <UIKit/UIKit.h>

  2. @interface AccelerometerDemoViewController : UIViewController <UIAccelerometerDelegate>{
  3.         IBOutlet UILabel *mylabel;
  4. }

  5. @property (nonatomic,retain) UILabel *mylabel;

  6. @end
複製代碼
AccelerometerDemoViewController.m
  1. #import "AccelerometerDemoViewController.h"

  2. @implementation AccelerometerDemoViewController

  3. @synthesize mylabel;

  4. - (void)viewDidLoad {
  5.         UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
  6.         accelerometer.delegate = self;
  7.         accelerometer.updateInterval =  1.0f/60.0f;
  8.     [super viewDidLoad];       
  9. }

  10. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
  11.        
  12.         static NSInteger shakeCount=0;
  13.         static NSDate *shakeStart;
  14.        
  15.         NSDate *now=[[NSDate alloc] init];
  16.         //搖晃時間在2秒內
  17.         NSDate *checkDate=[[NSDate alloc] initWithTimeInterval:2.0f sinceDate:shakeStart];
  18.        
  19.         //超過2秒則重新計算搖晃次數
  20.         if ([now compare:checkDate]==NSOrderedDescending||shakeStart==nil){
  21.                 shakeCount=0;
  22.                 [shakeStart release];
  23.                 shakeStart=[[NSDate alloc] init];                               
  24.         }
  25.        
  26.         [now release];
  27.         [checkDate release];
  28.        
  29.         //三軸搖晃的G力超過2則列入計次
  30.         if (fabsf(acceleration.x)>2.0 || fabsf(acceleration.y)>2.0|| fabsf(acceleration.z)>2.0){
  31.                 shakeCount++;
  32.                
  33.                 //2秒內偵測到4次則判定為Shake搖晃手機
  34.                 if (shakeCount>4){
  35.                         shakeCount=0;
  36.                         [shakeStart release];
  37.                         shakeStart=[[NSDate alloc] init];
  38.                        
  39.                         //畫面顯示搖動文字
  40.                         mylabel.text=@"搖動";
  41.                        
  42.         //設定2秒後自動還原               
  43.         [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(cleartext) userInfo:nil repeats:NO];
  44.                 }
  45.         }
  46. }               
  47.                        
  48. -(void)cleartext{
  49.         //預設文字
  50.         mylabel.text=@"沒事";
  51. }
複製代碼
此範例的應用相當的廣泛而有趣,早期App Store上的創意軟體如花女棒、打火機及蠟燭等軟體都是利用相同的原理實作的喔,看看您是否也能想出更好的創意。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
1

評分人數

寫的很好 !
這一篇是由Beginning iPhone Development這本書中第十五章的範例修改來的。

另外我實在太愛DAVE MARK及JEFF LAMARCHE這兩位作者了,寫出這麼棒的開發書。
如果能夠寫出選擇樂器 然後依方向震動有不同結果
如打一套功夫,能表現出力與美 還有聲音的輔助
那我想很多人整天搖搖晃晃 變成一種全民運動喔

先寫先贏喔
唔~娃娃魚大哥,你這範例是for SDK3.0???....我是2.2.1的,不能complie,一定要付費才能拿到3.0beta的SDK嗎?T_T
我是換成3.0的sdk沒錯,不過原始碼...不能編譯嗎?
不好意思,想問是否一定要用iphone先試到這個效果呢? 可否在simulator那裏試呢?
麥斯
不好意思,想問是否一定要用iphone先試到這個效果呢? 可否在simulator那裏試呢?
sony1688 發表於 2009-4-8 21:33


加速計和定位功能相同,都只能在實機上測試。
如果能夠寫出選擇樂器 然後依方向震動有不同結果
如打一套功夫,能表現出力與美 還有聲音的輔助
那我想很多人整天搖搖晃晃 變成一種全民運動喔

先寫先贏喔 ...
cseserv 發表於 2009-3-25 09:07


我有想過一個project,讓玩家兩手各拿一支iPhone或iPod Touch,然後用藍芽去控制mac主機上的交響樂團,就彷彿自己是音樂指揮家一樣,不過iPhone好像沒有開放藍芽控制= =
我有想過一個project,讓玩家兩手各拿一支iPhone或iPod Touch,然後用藍芽去控制mac主機上的交響樂團,就彷彿自己是音樂指揮家一樣,不過iPhone好像沒有開放藍芽控制= = ...
seireimai 發表於 2009-4-9 15:02


這個有趣喔,在3.0之後應該會更容易實現,藍芽、Wi-Fi都可以,或是把iPhone拿來當類似Wii搖桿然後直接玩PC或Mac上的節奏遊戲也不錯。
3.0啊啊啊啊啊啊~我的身分證跟passport都傳過去四天了,apple還沒有回我,天哪~~
整個apple應該最近都忙翻了吧,呵呵。
太棒了!!謝謝分享!
it is amazing, i really want it
請問我要用加速度計來控制一個主角在畫面中前後左右的移動
可以直接用   fabsf(acceleration.x)>2.0 像這樣的對XYZ取值嗎?
返回列表