iPhone&Androidプログラミング記
英語─上達しないのは努力不足が原因ではなかった!
英語が話せない…を解決する博士開発の噂の英語教材!返品保証付!

2009年04月10日

iPhoneの加速度センサーを使って本体を振った事を検知する

一般的には傾きセンサーと呼ばれる事もありますが、公式では加速度センサーと言います。

この加速度センサーを利用して本体を振った事を検知してみます。

プロジェクトは「Window-Based Application」で作成しています。
お試しで何かやる時はお手軽かなぁと勝手に思ってる。
とりあえず「ShakeTest」と入力して作成。

プロジェクトが作成されたら新規ファイルの追加で「UIViewController subClass」でファイルを追加する。
「MyViewController」と入力して作成。


ShakeTestAppDelegate.hに以下の赤文字の部分を追記します。

#import <UIKit/UIKit.h>

@interface ShakeTestAppDelegate : NSObject
{
IBOutlet UIWindow *window;
IBOutlet UIViewController *m_view_controller;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end



MyViewController.hに以下の赤文字の部分を追記。
加速度センサーを使うためのプロトコルとラベルの表示を戻すボタンとラベルの宣言です。

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController <UIAccelerometerDelegate>
{
IBOutlet UIButton *btn_Reset;
IBOutlet UILabel *lbl_Shake;

}

- (IBAction) btn_Reset_DOWN:(id) sender;

@end


ここまで出来たら一旦ビルドなどしてファイルを保存します。

次にInterfaceBuilderでNIBファイルを開きます。
開いたらUIViewControllerを追加。
そのUIViewControllerにViewを追加し、さらにそのViewにボタンとラベルを追加します。
ピクチャ 18.png

上のメニューのToolsからMyViewControllerのInspectorを開きます。
開いたら右端のタブを選択し、Classの所をMyViewControllerに変更します。
ピクチャ 20.png


次に、宣言したIBOutletとIBActionをInterfaveBuilderで接続します。
MainWindowにあるShakeTestAppDelegateの行で右クリックすると以下のメニューが出ます。
ピクチャ 19.png
さっきShakeTestAppDelegate.hに追加したm_view_controllerがあります。
右の方にある○をMyViewControllerのウィンドウにドラッグします。
そうするとヘッダに宣言したm_view_controllerと接続されます。
ピクチャ 21.png


同様にMyViewControllerで宣言したボタンとラベルのIBOutletとボタンのIBActionも繋ぎます。
ピクチャ 22.png


アクションはボタンへドラッグするとどのアクションに接続するかのメニューが表示されます。
Touch Up Insideで良いと思います。
ピクチャ 23.png

接続が終わったら保存します。


Xcodeに戻ります。
「ShakeTestAppDelegate.m」に以下の赤文字の部分を追記します。
ビューをウィンドウに足す事と、ビューのリリースです。

#import "ShakeTestAppDelegate.h"

@implementation ShakeTestAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
// Override point for customization after application launch
[window addSubview:m_view_controller.view];
[window makeKeyAndVisible];
}

- (void)dealloc {
[m_view_controller release];
[window release];
[super dealloc];
}

@end



MyViewController.mに以下を記述します。
加速度センサーを有効にする事と加速度センサーの状態を受け取るメソッドの記述。
それと振った事を検知する処理です。

- (void)viewDidLoad
{
[super viewDidLoad];

// 加速度センサーを有効にする
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 15)];
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
const float violence = 1.5;
static BOOL beenhere;
BOOL shake = FALSE;

if (beenhere) return;

beenhere = TRUE;

if (acceleration.x > violence || acceleration.x < -1*violence)
shake = TRUE;
if (acceleration.y > violence || acceleration.y < -1*violence)
shake = TRUE;
if (acceleration.z > violence || acceleration.z < -1*violence)
shake = TRUE;

if (shake) {
// 振った時の処理
[lbl_Shake setText:@"振ったな!"];
}
beenhere = FALSE;
}

- (IBAction) btn_Reset_DOWN:(id) sender
{
// ラベルの表示を元に戻す
[lbl_Shake setText:@"振ってみて〜"];
}

@end


これでiPhoneを振った時の処理をする事が出来ます。
振り幅などの値を色々いじって反応を見てみると面白いと思います。

ピクチャ 24.png


posted by ラキシス at 18:46 | Comment(0) | TrackBack(0) | iPhoneプログラミング | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。