加速度や電子コンパスを使ってみる 1
取り合えずは3軸加速度と、電子コンパス(ジャイロセンサ)の値を取得してみる。
取得するところまでのソースなので、別に大変な内容とかではない。
ちなみに、テンプレートとしてはCocos2D+Box2Dサンプルを使用している。
◆ 加速度
Cocos2d+Box2dのサンプルで起動すると、実は加速度センサは既に
HelloWorldLayerに対して組み込まれている。
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { static float prevX=0, prevY=0; //#define kFilterFactor 0.05f #define kFilterFactor 1.0f // don't use filter. the code is here just as an example float accelX = (float) acceleration.x * kFilterFactor + (1- kFilterFactor)*prevX; float accelY = (float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY; prevX = accelX; prevY = accelY; // accelerometer values are in "Portrait" mode. Change them to Landscape left // multiply the gravity by 10 b2Vec2 gravity( -accelY * 10, accelX * 10); world->SetGravity( gravity ); }
この部分が加速度センサの値を取得する部分になっている。
本来、加速度センサの値を取得するには
ヘッダで指定しなければいけないが、これに関しては既にCCLayerで設定されている。
重力加速度なので、例えば端末を地面に対して水平に置いている場合は
acceleration.zの値が「1.0」となる。
◆ 電子コンパス
こちらは普通に組み込む必要がある。
まずは、Frameworksに「CoreLocations.framework」を追加する。
次に、ヘッダファイルで以下をimport
#import <CoreLocation/CoreLocation.h>
クラスにdelegateを設定
@interface HelloWorldLayer : CCLayer<CLLocationManagerDelegate> { CLLocationManager* locationManager_; ...
電子コンパスの初期化。init関数などで
locationManager_ = [[CLLocationManager alloc] init]; locationManager_.headingFilter = kCLHeadingFilterNone; locationManager_.desiredAccuracy = kCLLocationAccuracyBest; locationManager_.delegate = self; [locationManager_ startUpdatingHeading];
各要素の説明はまた今度。 取り合えず更新頻度の高い情報が必要なので
頻度の高い情報で取得しています。
あとはlocationManagerのdelegateを取得することで、値を取得できます。
例えば以下のような感じで。
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { }
値の変化をなだらかにするために、ローパスフィルタ処理などを行う必要も
ありますが、そちらも今度に回しましょうか。
気になったニュースとして、この辺。
◆ 魔界戦記ディスガイア for Android(仮)、5月16日より提供開始
VIVID Runtimeを利用したアプリケーションはGゲーを通じてしか出せないってことと
キャリアマーケット系のアプリ以外はAndroidMarketから締め出しを食らったことで
Gゲーが死亡したと思ってたんですが、色々とキラーコンテンツを出してくるものです。
塊魂とか、ソニックとか、一線を隔したアプリが多い印象です。
とはいえやはりGゲーでしか提供できないって制限は厳しいなぁ。