Vectorクラスのシャッフル

自分用のメモ。

参考元
http://www.bonth.nl/2010/07/25/as3-vector-shuffle-or-randomize/

上の参考例だと配列の長さをランダムで決めるときにレンジエラーがでてしまうので

汎用的ではありませんが下の様に改変
※下の例でTweetFormatクラスになっている部分をシャッフルしたいクラスで置き換えるとOK


public function shuffleVector(vec:Vector.<TweetFormat>):void{
	if (vec.length > 1){
		var i:int = vec.length - 1;
		while (i > 0) {
			var s:Number = Math.round(Math.random()*(vec.length)+0.5)-1;
			var temp:TweetFormat = vec[s];
			vec[s] = vec[i];
			vec[i] = temp;
			i--;
		}
	}
}

iOS7とAIR for iOSについて

2013/9/10現在 AIR for iOSで作成したアプリをストア登録しようとすると以下のようなエラーを返してきます。

1,Missing recommended icon file – The bundle does not contain an app icon for iPhone / iPod Touch of exactly ‘120×120′ pixels, in .png format.

→120pxのアイコン足りないぞ!

2,Non-PIE Binary – The executable ‘***.app’ is not a Position Independent Executable. Please ensure that your build settings are configured to create PIE executables. For more information, refer to Technical Q&A QA1788 – Building a Position Independent Executable

→PIEバイナリじゃないぞ

おそらくAIR3.9で対応されるものと思われますが、現状回避策がないような気がしています。
もし、AIR3.8以前での解決策などありましたらご教授願います!!

AIR for iOSの書き出しと証明書

すでに当たり前のことかもしれませんがメモ。

AIR for iOSでの書き出しに対応する証明書とプロビジョニングファイルについて

cap20130813

デバイスでのテスト → developper版の証明書/プロビジョニング

デバイスにインストールできる。デバイスでのtraceやエラーログが必要のないテスト版の出力。デバッガ接続の必要ないときにこれを選ぶ

デバイスでのデバッグ → developper版の証明書/プロビジョニング

デバイスにインストールできる。traceやエラーログを見たいときに選ぶ。デバッガへの接続ダイアログがでるので純粋に動作テストしたい場合は上のデバイスでのテストを選ぶ。

アドホック → production版の証明書/プロビジョニング

デバイスにインストールできる。デバッグやtraceはできない。NativeExtensionを使った通知など本番環境でのテストが必要なときこれを選ぶ。

App Store → production版の証明書/プロビジョニング

デバイスにインストールできない。ストアに登録するためだけの設定。

※インタープリタモードは試していませんがデバイスでのテスト/デバッグに準拠し、書き出しがデバイスでのテストよりも高速に行われると思います。

LeapMotionStatsβ AS3

LeapMotion用のStatsを作ってみました。Statsの横においてイケてる感じになるようにつくってあります。まだキットを持ってる人があんまりいないと思いますが、公開しておきます。
LeapMotionStatsでは両手の座標と速度、指の認識数を表示させています。

capleapstats

※このライブラリを使用するにはLeapMotionAS3が必要です。
※キャプチャはStatsが含まれていますが、大きさの比較用のためで別途読み込みが必要です。

使い方

var lstats:LeapStats = new LeapStats();
lstats.x = 61;
addChild(lstats);

swcのダウンロードはこちら

LeapMotionその 2 NativeExtension LeapMotionAS3について

順番が逆になってしまいましたが、次にLeapMotionでなにができてNativeExtensionでどういう仕組みになっているかを現時点3/28のバージョンをもとにメモしておこうと思います。

LeapMotinというデバイスはキネクトの小型版で卓上に置くと、その設置位置から上方およそ1mの立方体の範囲内をセンサーで感知するようにできています。

キネクトと違うところはキネクトは体(うでや足)の動きを識別するのに対して、LeapMotionでは手と指先を認知するようになっています。

LeapMotionのSDKにはas3用のAPIが用意されていないのでNativeExtensionでnativeのAPIをラップするような形になっているかと思われます。

LeapMotionAS3では

・フレームクラス … 一回のキャプチャによるデータがつまったコンテナ(この中にHandインスタンスやFingerインスタンスが格納されている)

・手クラス(Hand Class) … 手の位置、向き、移動方向、移動量、深度、認識されている指の数などが取得できます。

・指(Finger Class)… 個々の指の位置、向き、移動方向、移動量、深度などの情報が取得できます。それぞれの指には個別にIDが振られます。

・ジェスチャー(Gesture Class).. ジェスチャーを識別することができます。これはイベントではありません。ジェスチャーのタイプはスワイプ、手の回転、画面をタッチするような動き、指でキーを押すような動きを識別できます。デフォルトではこの4つですが自分でカスタマイズして新しいジェスチャーを作れそうです。

主に上の3つの情報を取得することができ、これらの情報を解析してアプリケーション側での挙動をコントロールすることになりそうです。

以下動画はLeapMotionAS3に同梱されているサンプルをAway3Dで走らせてみた感じです。トラッキングに関しては申し分なく、遅延など一切発生しませんが、指が重なった時の処理などがまだ甘く、ここらへんこれから改善されれば嬉しいなといった次第です。

LeapMotion 1 環境設定

leaptitle

leapmotionをゲットしたのでこれをFlashでもってどうこうする方法をメモしておきたいと思います。

leapmotionは3/20時点ではまだβ版なのでSDKの配布は登録デベロッパーのみに限定されています。※おそらくリリースされても、規約を読んだ感じだと登録しておかないとSDKは使えない予感?

1,とりあえずデベロッパー登録をする。登録はこちら

登録メールを送ると折り返しメールが飛んできてdevelopper登録用のフォームへのリンクがあり、そこに個人情報を色々入力します。

2,登録が完了したらdevページへログインできるようになるので、win/mac自分の環境にあったSDKのダウンロードを行います。DLはこちら

3,SDKをインストールします。

windowsの場合、インストール後にSDKをインストールしたパスを環境変数に登録します。環境変数への登録はこちらを参照。

環境変数を登録したあと、PCを再起動してください。再起動しないとAIRから接続できない。

4,usbでleapをPCに接続します。これはいつでもいい。

5,インストール後に、デスクトップにLeap起動用のショートカットが生成されるのでこちらを起動。

※初回起動時にDEV用アカウントとパスワードの入力を求められます。

6,leapMotion接続用のNativeExtensionをダウンロードします。

https://github.com/logotype/LeapMotionAS3

ダウンロードするファイルはLeapMotionAS3.ane ファイルです。こちらを開いて画面中央の「view Raw」リンクをクリックするとDLできると思います。

7,FlashCS6/FlashBuilder4.7を起動して新規AIRドキュメントを作成し、ドキュメントプロパティのスクリプト設定からダウンロードしたaneファイルを追加します。

以上で準備完了です。

AIR 端末振り分け サンプル

AIRでマルチデバイスで書き出したい場合の端末振り分け処理を行うサンプルです。
iPadやiPodもos.indexOf(“iPad3″)などと指定すればもっと細かく振り分けることができます。


import flash.system.Capabilities;

var os:String = Capabilities.os;

if (os.indexOf("Windows")>=0) {
	//デスクトップ,ノートのウィンドウズ
}else if (os.indexOf("Mac") >= 0) {
	//デスクトップ,ノートのMac
}else if (os.indexOf("Linux") >= 0) {
	//android,linux
}else if (os.indexOf("iPhone") >= 0) {
	//iOS
	if (os.indexOf("iPhone4") >= 0) {
		//iphone4
	}else if (os.indexOf("iPhone5") >= 0) {
		//iphone5
	}else if (os.indexOf("iPad") >= 0) {
		//iPad
	}else if (os.indexOf("iPod") >= 0) {
		//iPod
	}
}

leap motion メモ

leap motion https://leapmotion.com/

の情報が色々上がってきているのでメモ。

ライブラリ

・leapmotionAS3

https://github.com/logotype/LeapMotionAS3

・runway

https://github.com/rmhall/runway

facebookの自分のウォールに画像とメッセージを投稿する for AIRforAndroid,AIRforiOS

1,準備

2,ActionScript3

 


package
{
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.events.Event;
import com.facebook.graph.FacebookMobile;
import flash.geom.Rectangle;
import flash.media.StageWebView;

	public class Main extends MovieClip
	{

		//facebookアプリID
		protected static const FACEBOOK_APP_ID:String = "123456789";

		// 投稿するメッセージ
		private var postMsg:String = "hogehoge";
		// 投稿する画像
		private var postbmpd:BitmapData = new BitmapData(10,100,true,0xFF000000);

		//OAuth用stagewebview
		private var webview:StageWebView;

		public function Main()
		{
			this.addEventListener(Event.ADDED_TO_STAGE, onInit);
		}

		private function onInit(e:Event):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, onInit);

			webview = new StageWebView();
			webview.stage = this.stage;
			webview.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);

			//API初期化
			FacebookMobile.init(FACEBOOK_APP_ID, fbInitHandler);

		}

		//facebookAPI初期化完了時のイベント
		private function fbInitHandler(response:Object, fail:Object):void {
			if (response) {
				//初期化完了してたらログイン処理します
				FacebookMobile.login(handleLogin, this.stage, ['user_photos', 'publish_stream'],webview);
			}else {
				trace("初期化失敗しました");
			}
		}

		//ログイン完了時のイベント
		private function handleLogin(response:Object, fail:Object):void {
			//ログイン成功してたらデータ送信するよ
			if (response)postData();
		}

		//画像を投稿する
		private function postData():void {
			var values:Object = { message:postMsg, fileName:'FILE_NAME', image:postbmpd };
			FacebookMobile.api("/me/photos", handleUploadComplete, values,"POST");

		}

		//投稿完了時のイベント
		private function handleUploadComplete(response:Object, fail:Object):void {
			if(response)trace("uploadcomp");
		}
	}
}

as3 条件付きコンパイル定数

少し前までこの便利な機能を知りませんでした。。

たとえばFlashでアプリをつくっているとデバイスごとに同じ関数でも処理を変えたい場合があります。

またデバッグ時だけデバッグ用のコンソールやSTATSを表示させたいなど処理を分岐させたい場合に条件付きコンパイル定数が便利です。

Flashでの設定の方法

ここでは例えばAndroidとiOSで処理を分岐させたいと仮定してその方法を解説しています。

・メニュー「ファイル」>「ActionScriptの設定」を開き、「条件付きコンパイル定数」タブをひらきます。

タブ内の「+」ボタンをおして定数を追加します。

ここではとりあえずネームスペースを「PLATFORM」にして定数をANDROIDとIOSの2つをつくります。

・次に分岐処理させたいコードを書きます。

PLATFORM::ANDROID
function Mytest():void{
	trace("これはandroidだけの処理");
}

PLATFORM::IOS
function Mytest():void{
	trace("これはiosだけの処理");
}

Mytest();

見慣れない書式がまじっていますが、これがコンパイラ定数でネームスペース::定数で記述します。

この定数の直後に関数クラス定義を記述することができます。
先ほどの「Actionscript設定」画面で定数の値をtrueに設定したものだけがコンパイルされ、falseのものは無視されます。

なので上の例の場合だとPLATFORM::ANDROIDがtrueになっているので

trace(“これはandroidだけの処理”);

だけがコンパイルされ実行されます。

 

参考

上条さんのブログ http://cuaoar.jp/2010/10/actionscript-30.html

FlashDevelopの場合の設定 http://hkpr.info/flash/game/sample/s089.php