Archive for the ‘actionscript’ Category

[as3][sound] Trance Metal Generator α版 (トランスメタルジェネレータα)作りました。

Category:{ actionscript, flash, Heavy Metal, Wonderfl }  Tag:{, , , , } Comments:{ 1 Comment }
Posted:{ 2011.08.18 01:27:47 }

1ヶ月くらい前ですが、teraco – 東京てら子Vol.17 『俺的効果音の作り方&使い方』に行ってきました。

音がテーマということ、かつ最近「プチオレオレトランスメタルブーム(PORORTMB)」なので、前々から作ってみたかったメタルのジェネレーター「トランスメタルジェネレーター」をつくって発表しました。

そしてWonderflにアルファ版としてあげてみた↓。

- 上部サムネをタイムラインにドラッグドロップ
- 下部再生ボタンで再生。
- 手っ取り早く遊んでみたい場合は、緑色の「set sample」ボタンを押して、再生。

Trance Metal Generator(トランスメタルジェネレータ) – wonderfl build flash online

as3でシビアに音を使ったのは始めてだったので、
いまいち上手くいかないところもありつつ。
たとえば、複数サウンドをつなぎ目無く綺麗につなげる方法など。
(始めての再生の時はなんか綺麗に繋がらなかったり。数回再生、停止をしていると上手く言ったり)

このへんはSiON の時期バージョンで、
楽に実装出来るということなので(@keim_at_siさん談)、
そのうちそれを使って、ベータ版として、サイトで公開したい所。
※SiON要チェック!

あと、マトモな録音環境をもっていないので、だれか使わせてくれないかなーw

その他

最近オススメのトランスメタル

Crossfaith – "Stars Faded in Slowmotion" Official Music Video – YouTube

Crossfaith – "OMEN" (The Prodigy Cover) Official Music Video – YouTube

Silent Descent – Duplicity (Official Video) – For fans of Soilwork / In Flames / Blood Stain Child – YouTube

[AS3] Frame メタデータタグの factoryClass のローディングでハマった

Category:{ actionscript }  Tag:{, , } Comments:{ No Comments }
Posted:{ 2011.05.14 07:16:20 }

AS3 でローディングを作る時、下記 のような方法があります。

[1] 本体の swf とは別に、プリロード swf を作る。
[2] factoryClass でプリロードクラスを指定し、ドキュメントクラスより先に実行する。

[1] の方法は swf が2つ出来てなんか好みじゃないので、最近は [2] の方法をよく使っています。

※そもそも factoryClass って何?って人は、下記サイトが参考になります。
メタデータタグ[Frame]とは? | Mtok-blog

今回ハマった点

で、何でハマったかと言うと、
「 swf 全体が読み込まれた後にしか、ローディングがスタートしない」現象です。
※つまり、全くローディングになってない。

問題はドキュメントクラスを生成する部分でした。

/*  ※ Index.asをドキュメントクラスとした場合。*/
    var indexClass:Class = getDefinition('Index') as Class;
    //var index:Index = new indexClass() as Index;//←これだとダメ
    var index:DisplayObject = new indexClass() as DisplayObject;//←これはちゃんと動く
    addChild( index );

上記の Index の型指定 (2箇所) が問題でした。。。(´・ω・`)

なぜダメか?

Preloader クラス内に Index と書くと、そのフレームに Index が存在する事になり、結局それが読み込まれるまで Preloader クラスがスタートしないのです。
@bkzen に教えて頂きました。THX!)

どうしてハマった?

普段は型指定を DisplayObject にしているので問題ないのですが、
今回なぜこう書いてしまったのか?。

それは、Preloader から Index クラスに渡したいデータがあり、public メソッドを呼ぶために、何気なく型指定をしてしまっていたのでした。。

//↓こう言うことをしたかったが為にハマった。
index.setData(hoge);

分かってしまえば原因は単純ですが、ついやってしまいそうな落とし穴ですよね。

解決方法

結局プリローダーからドキュメントクラスに何かしらデータを渡したい場合、下記のような方法が良いでしょう。

・ドキュメントクラスにインターフェイスを実装する
一旦シングルトンクラスにデータを格納し、ドキュメントクラスから取得する。

その他

その他、ハマりやすいポイントとして、下記サイトも参考になります。

馬鹿全 – Frame メタデータタグでプリローダを作る時の注意

Flex SDK でプリローダー – kaityoの日記

以上。

では!よいプリロードライフを!

[AS3] モーダルな ErrorDialog (エラーダイアログ) クラスを作成しました。

Category:{ actionscript, flash }  Tag:{, } Comments:{ 1 Comment }
Posted:{ 2011.04.21 04:09:47 }

モーダルな ErrorDialog というクラスを作りましたので公開します。

以下、特徴など説明です。

どの階層で addChild しても必ず stage 最前面に表示

そもそもモーダルダイアログとは、
そのダイアログを閉じるまで、他の操作をできなくするタイプのウィンドウの事です。
( Photoshop で言うフィルタのウィンドウみたいな物ですね)

この ErrorDialog クラスは、手軽にそれを実装するため、
どんな階層でも、addChilde するだけで、必ず stage の最前面 (&中央) に表示されるようになっています。

 import jp.itoz.display.window.ErrorDialog;
 
//どんな深い階層でaddChildしてもOK!
var errorDialog:ErrorDialog = new ErrorDialog("タイトル","メッセージ",new Error());
addChild(errorDialog);
 
stage.addChilde(hoge);//←以降こんな事しても問題なし

複数addChildしても、addChildされた順番通り表示

「必ず最前面に表示される」ということは、
複数addChildしたらどうなるの?
と思った方もいるかも知れません。

そこはご安心を!

例えば下記のように意図的に3回エラーを起こして、addChildしてみます。

 
    var arr : Array;
    for (var i : int = 0; i < 3; i++) {
        try {
            arr.push(i);//newArray()していないのでエラーが起きる。
        } catch(error : Error) {
            //第三引数にはError継承クラスを渡せる
            var errorDialog : ErrorDialog = new ErrorDialog("Error"+ (i+1)+" 回目" , "Error message.", error);
           addChild(errorDialog);
        }
    }

結果はこのような動作になります。

[SWF] ErrorDialogSample.swf

ちゃんと順番よく表示されたと思います。

例えば、下層の様々なエラーの起きそうな場所に、(try catchとかで) このクラスを記述しておくことで、エラーが起こった順番通りに表示してくれます。

デザイン変更もサクっと出来る

1. サイズ、マージン変更はコンストラクタで変更

第4引数 以降に、幅、高さ、マージンを設定できます。

 
//幅と高さ300 マージン20にする
var errorDialog:ErrorDialog = new ErrorDialog("サイズ変更","サイズを変更しました",new Error(),300,300,20);
addChild(errorDialog);

[SWF] ErrorDialogSizeChangeSample.swf

ある程度自動でレイアウトされる様になっています。

が、微調整したい場合は、addChild 後に変更してください。
( ※ addChild 時に自動レイアウトされるため )

 
//位置微調整の例
addChild(errorDialog);
errorDialog.titleTextField.y+=10;
errorDialog.closeButton.y -=5;

2. 背面パネル、クローズボタン、テキストフォーマットは、プロパティで変更

 
// 背面パネル変更 
// ※これを変更すると、コンストラクタで設定したサイズが無効化され
//渡されたDisplayObjectContainerを元にレイアウトされます。
 
errorDialog.background =  [任意のDisplayObjectContainer]
 
//クローズボタン変更
//※CLICKイベントは自動的に付加されます。
 
errorDialog.closeButton = [任意のInteractiveObject]
 
//テキストフォーマット変更
 
errorDialog.titleTextFormat = newTextFormat(null,20,0xcc0000,true);
 
errorDialog.messageTextFormat  = newTextFormat(null,15,0x00cc00);
 
errorDialog.errorTextFormat = newTextFormat(null,20,0x0000cc);

以上、簡単に変更できます!

ざっとまとめると例えばこんな感じ。

 
//背面パネル用スプライト
var bg : Sprite = newSprite();
bg.graphics.beginFill(0xc6d5cd);
bg.graphics.drawRect(-200, -75, 400, 150);
bg.graphics.endFill();
 
var errorDialog : ErrorDialog = new ErrorDialog("デザインカスタマイズ", "デザイン変更しました", new Error(), 300, 300, 5);
errorDialog.background = bg;//※コンストラクタで指定したサイズ無効になる
errorDialog.closeButton = new PushButton(null, 0, 0, "pushbutton");//Minimalcompのプッシュボタン
errorDialog.titleTextFormat = new TextFormat(null, 20, 0xcc0000,null,null,null,null,null,TextFormatAlign.CENTER);
addChild(errorDialog);
errorDialog.titleTextField.y += 10;
errorDialog.closeButton.y -= 5;

上記をパブリッシュすると、

[SWF] ErrorDialogCustomizeSample.swf

と、如何様にでも出来ます。

フェードイン、フェードアウト演出を変更したい

この場合、 AbstractErrorDialog の継承クラスを作成します。
( ※ ErrorDialog クラスもこの継承です )

サンプルとして OrigineErrorDialog クラスを作成しました。

[SWF] OriginErrorDialogSample.swf
[AS] OriginErrorDialogSample.as

継承ポイントは下記です

・初期表示状態はsetLayout()内で定義。(これがaddChild時に呼ばれる)
・open()をoverrideしフェードイン演出を実装
・フェードイン完了時、openComplete()を必ず呼ぶ
・close()をoverrideしフェードアウト演出を実装
・フェードアウト完了時、closeComplete()を必ず呼ぶ

また、背景パネルやクローズボタンも当然ここで変えられます。

背景パネルは、createBackground() 内で作成し、return するだけ。
同じくクローズボタンは、createCloseButton() 内で作成しreturn するだけ。

です。

背面全体を覆っているカバーを変更したい

これも簡単。

 
errorDialog.cover= [任意のDisplayObjectContainer];

で変更でき、自動で拡縮し画面全体を覆います。
ただ注意点として、複数ダイアログでcoverを変更しても、
全て最後に設定されたものになってしまいます。

ダウンロード

Github にアップしました。

※要Tweener

その他

今後こんな機能も追加したい

・複数表示される場合、キャンセルできる。
・マージンは上下左右別々に設定できる。
・非表示切り替え。(リリースビルドなどの時用)
・メッセージテキストフィールドにスクロールバーを付ける

修正履歴

-2011.4.24 複数同時addChild時、2番目以降の表示オブジェクト位置を調整しても反映されないバグを修正しました。
-2011.4.24 クローズボタンにオーバーを追加しました。

※2011.4.24 teraco – 東京てら子Vol.15 『Error Handling&Security』の回で発表しました。

以上、バグ発見されましたら教えていただけるとありがたいです。

では!

[AIR][Android] CameraUIで撮影した写真の回転が、機種によってバラバラなのをExifで補整する!

Category:{ actionscript, AIR, Android }  Tag:{, , , , } Comments:{ 1 Comment }
Posted:{ 2011.04.04 03:32:27 }

タイトル通りなのですが、
Air for Andorid カメラアプリ作成してみてつまずいた部分です。

CameraUI で撮影して AIR に渡される画像の回転方向が機種によって違うのです。(;´Д`)ウソーン

※例えば
「横向き撮影がデフォルトとして設計されている機種(GalraxyTabとか)」があるようで、
本体を立てて撮影しても、−90度回転した状態でAIRに渡ってきます。

解決策は?

AIR からは Android の機種を判定できないので、方法としては
[1] : 画像を回転させる UI を作りユーザーが任意に回転出来るようにする。
[2] : Exif の回転情報を元に補正する。

などがあると思います。
今回は [2] : Exif の回転情報を元に補正について書いていきます。

Exif (イグジフ) とは?

Exifとは、デジタルカメラで撮影した画像データに、撮影条件に関する情報(メタデータ)を追加して保存できる、画像ファイル形式の規格のことである。
Exifでは、撮影した画像データと併せて、撮影した日時やデジタルカメラの機種、絞り値、画素数、ISO感度、色空間、といった情報をまとめて記録することができる。本体の画像データの他に、サムネイル画像のデータも記録しておくことができる。
Exifとは (Exchangeable image file format) エグジフ: – IT用語辞典バイナリより抜粋

上記を読むとExif には様々は情報が含まれてるのがわかります。
この中に、Orientation (回転情報)も含まれており、それは1〜8の整数で保存されています。
下記は「F」を正の位置とした場合の1〜8のそれぞれの状態を表しています。
Eixf Orientation
※参考 http://sylvana.net/jpegcrop/exif_orientation.html

  • 1: 通常
  • 2: 左右反転
  • 3: 180°回転
  • 4: 上下反転
  • 5: 上下反転 +90°回転
  • 6: -90°回転
  • 7: 上下反転 -90°回転
  • 8: +90°回転

Exif を取得する

AS3 で Exif を読めるライブラリは幾つかあるようですが、今回は ExifInfo(MITライセンス) というライブラリを使用しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
・・略・・
//ExifLoader作成
var _loaderExif:ExifLoader = new ExifLoader();
_loaderExif.contentLoaderInfo.addEventListener(Event.COMPLETE, onExifLoadComplete);
_loaderExif.load(new URLRequest("sample.jpg"));
// ロード完了
function onExifLoadComplete(e : Event) : void
{
    // 回転情報
    var exif : ExifInfo = _loaderExif.exif ;
    var orient:int = exif.ifds.primary.Orientation as int ;//★これが回転情報
    //ビットマップデータ
    var bmd:BitmapData = (_loader.content as Bitmap).bitmapData;
}

これで回転情報が取得できました。

※ExifInfo についての詳細はExifInfo のドキュメントを参照下さい。

Matrix クラスで補整する

上記で取得できた1〜8の値を元に、正の位置に補正した BitmapData を返すサンプルコードを Gist に上げました

この Function を利用して、先程の BitmapData を補整します。

1
2
3
4
5
6
・・略・・
    //ビットマップデータ
    var bmd:BitmapData = (_loader.content as Bitmap).bitmapData;
    bmd = correctExifOrient(bmd,orient);//★補整
    addChild(new Bitmap(bmd));//表示
・・略・・

これで正の位置に補整できました!

これで、CameraUI を利用した汎用的なカメラアプリが作成出来ますね!。

※このエントリは「東京てら子14、自由発表枠」での発表内容のまとめです。

その他/補足

1.Exif にはサムネイル情報も含まれています
例えば、画像一覧を表示するUIを作るとき、スマートフォンなどの場合は大きい画像を縮小表示するより、Exif内サムネ情報を利用したほうが、負荷が減る(のではないか?)と思います。

2.デジタルで撮影されたすべての画像に必ずExifがあるのか?というのが分かりませんでした。僕が確認したAndroid数機種ではあったのですが、ない場合も想定した実装にしたほうがベスト?かと思います。

3. Exif などの情報の一部は、画像加工ソフトなどで開いて保存しなおすと、消えたりする場合があるようです。

[AS3] ビット演算で属性検索!

Category:{ actionscript }  Tag:{ } Comments:{ 1 Comment }
Posted:{ 2011.03.06 04:25:20 }

「ビット演算」って聞いただけで、「ややこしそうっ!」ってなりますよね。
自分もそうでした。

まずは理解!

そもそもビット演算の理解には、下記サイトが参考になりました。

馬鹿全 – (AS3)ビット演算を倒す

BeInteractive! [ビット演算って面白いですよね]

符号つき2進数
 ↑このページ中央あたりにあるJAVAアプレット分かりやすいっ!

ピンっとくるまでには時間がかかりますが、なんか便利そうだ!?
と言う事がわかると思います。

で、何に使うの?

馬鹿全さんのブログでは、「RGB値、ターンチェンジ、移動フラグ、簡易3D座標 etc..」に使える、とありました。
が、僕はさらに「属性検索」に使える!と思いました。

サンプル

例えばゲームなら「勇者、戦士、僧侶…」みたいな、どの職を経験したか?などを、
その数ぶん Boolean 変数で管理したら大変 なので、そんな場合に2進数で保持しておいて、
それを元に検索すると便利だと思いました。
※その他「アイテム1 アイテム2 アイテム3…」など大量のアイテムを持っているユーザーを絞り込み検索するとか。

上記SWFは、
・ボタンの、オン状態を1、オフ状態を0 で管理。
・ボタン群のオンオフ状態の変化時、100100など、状態をイベントで配信。
・その状態に応じて、該当する属性をビット演算で検索。
みたいな感じです。

検索部のコードはこんな感じです
_arr はこんな XML をパースしたものです。

補足

当記事は東京てら子12(2011.1.11) での発表内容「ビット演算っておいしいの?」プラスアルファです。

[Android][AIR][AS3] 「日本の Flasher が誰も知らない? “BlackBerry SDK for AIR” が実は便利なんじゃないか!?」

Category:{ actionscript, AIR, Android }  Tag:{, , , , , } Comments:{ 1 Comment }
Posted:{ 2011.02.16 08:20:13 }

ちょっとっ!!!
そこの 「BlackBerryとか関係ないっ!」って思ったジャポネゼ!

騙されたとおもってちょいと聞いてください。

BrackBerry SDK for AIR

ググっても日本語サイトがほぼ無いのこの SDK。
(※ PlayBook が日本で未発売なのでしようがないですが)

これ、ヒジョーーにざっくり言うと「 Spark コンポネントの AS3 版」といった感じ。
(※ よく調べてないので言い過ぎかもしれない(;´Д`))

AS3 ベースで記述できて、 UI コンポーネントもひと通り揃っており
普通の WEB 用 SWF にも利用できるし、
他の Andorid 機でも全然使えるのです!
(※幾つかのクラスを GaraxyTab で動作確認しただけですが)

そしてそして!
なにより、AS3 なのに MXML っぽく「相対レイアウト」を記述できたりなんかして、
縦だの横だのグリグリ変化する、マルチなスクリーン時代にぴったり?なんじゃないかと思いました。
(もちろんWEBのリキッドレイアウトにも全然利用出来るのではないかと)

相対レイアウトサンプル

例えば、下記サンプルSWF。ウィンドウサイズをグリグリ変えてみてください。
[SWF] http://www.romatica.com/dev/blackberry_sdk/index.html
各パーツが中央揃えで、それぞれの間隔が相対に保たれています。

コードは下記。

[AS3] http://www.romatica.com/dev/blackberry_sdk/TestContainer.as
※一部抜粋

// 〜略〜
//  コンテナクラス
_container = addChild(new Container()) as Container;
_container.flow = ContainerFlow.VERTICAL;// ★このコンテナ内、縦並び
_container.align = ContainerAlign.MID;	// ★このコンテナ内、縦中央揃え
 
// コンテナ上部から20% スペースを空ける
_container.addChild(new Spacer(20));
 
// タイトルラベル
var titleLabel : Label = _container.addChild(new Label()) as Label;
titleLabel.text = "Liquid Layout Sample";
titleLabel.format = _TFM;
titleLabel.setSize(300, 35);
titleLabel.sizeMode = SizeMode.BOTH;			
 
// 10% スペースを空ける
_container.addChild(new Spacer(10));
// 〜略〜

qnx.ui.core.Container クラス に、縦並びや、中央揃えなどのプロパティを設定すれば、
あとは、DisplayObject を addChild するだけで相対レイアウトに!
new Spacer() で空きスペースを指定出来たりする所なんかステキ!です。
(かたくなにMXMLを書きたくない!なんて人 (自分) には最高?)

さっそくSDKの入手

BlackBerry(PlayBook) SDK for AIR のページへアクセスし、
3段目の「BlackBerry Tablet OS for AIR for ◯◯」から自分の環境にあったものをダウンロード。
※インストール時にFlash Builder Burrito (以下FB) のパスを聞かれますので先にインストールしておいたほうがよいかも?です。

[※追記] SDK はMPL ライセンスみたいですので基本、なにも気にせず利用してよいかと。

SDK は FB 内の sdks フォルダ にインストールされるので、
そのままFBで開発するなり、
そこにパスを通すなり、
必要な swc や as をそこからコピーしてくるなりして、利用します。

ドキュメント

http://www.blackberry.com/developers/docs/airapi/1.0.0/index.html

最後に

その他、UIコンポーネントなどもひと通りあるので、追って調査中。
間違いなどございましたら@itoz宛に教えていただけると助かりますm(__)m

では、
Happy AS Life!!

[GitHub] オレオレクラス (AS3) を公開しました。

Category:{ actionscript }  Tag:{, } Comments:{ 1 Comment }
Posted:{ 2011.01.26 12:41:42 }

GitHub

流行りのバージョン管理システム Git に手を出してみまして、使い方の学習も兼ねて、今までちまちま作っていたオレオレクラス群を GitHub にアップしました。
(README.textile に 逆引きINDEX を書いてあります。)
※使い勝手悪かったり、バグがあったり、何でこんなつくりやねん!って部分も多々ありますが、多めにみて(;´Д`)。

Gitクライアント

Gitクライアントは幾つか使ってみましたが、
コマンドで実行するのがやっぱり一番確実な感じ。
下記クライアントの印象。

Egit

Eclips から Git を利用するプラグイン。
FDT4 からも下記の方法で問題なくセットアップできました。
【コラム】イマドキのIDE事情 (52) EclipseでGitを使おう! EGitを試してみる | エンタープライズ | マイコミジャーナル
(ただ、commit が上手くいかない?ファイルがあったりしたので調査中)

Tower

デザイン的にもTower はなかなかいい感じ。
push がうまくいかない?時があり調査中)

参考書籍

下記 入門Git よかったです。thx! @funnythingz

[AS3] 2つのDataクラスから差(日/時/分/秒/ミリ秒)を取得するクラス

Category:{ actionscript, flash }  Tag:{, } Comments:{ No Comments }
Posted:{ 2010.11.24 03:47:29 }

AS3で2つのDataクラスの差を取得するクラスを作成しました。
特にカウントダウン等を作成する時、使えると思います。
戻り値はObject型で(日/時/分/秒/ミリ秒)が入っています。

(探せば誰かがこういうクラスを公開してそうですが、探すのが面倒くさかったので。)

Spark Project にアップしました。
svnで下記から取得してください。

http://www.libspark.org/svn/as3/Romatica/src/
以下の
src/com/romatica/utils/DataUtil.as
です。

srcフォルダを取得し、fla等からクラスパスを通して利用して下さい。

サンプルデータ

[fla] TestDateUtil.fla

[swf] TestDateUtil.swf

[svn] http://www.libspark.org/svn/as3/Romatica/sample

使い方

//
// 現在の時刻から2012/1/1 0:0:0 までの差(日/時/分/秒/ミリ秒)を取得
//
import com.romatica.utils.DateUtil;
var nowDate : Date = new Date();
var trgDate : Date = new Date( 2012, 1 - 1, 1, 0, 0, 0, 0 );
var diffDate : Object = DateUtil.diff( trgDate, nowDate, true );
trace( diffDate["d"] + "日と " 
       + diffDate["h"]+"時間 "
       + diffDate["m"]+"分 "
       + diffDate["s"]+"秒 "
       + diffDate["ms"]+"ミリ秒 ");
//trace結果 402日と 7時間 14分 25秒 768ミリ秒

その他

正確にデバッグしていないので、バグなど発見しましたら、報告頂けると有難いです。

[AS3] 簡単にカレント切り替えメニューが実装出来る SwitchMenuクラス

Category:{ actionscript }  Tag:{, } Comments:{ No Comments }
Posted:{ 2010.10.11 04:22:36 }

意外とこういうクラスを探しても無いので、自分用に作っていた、カレント切り替えメニューが簡単に実装出来る SwithMenuクラス [AS3]を公開します。

ポイント(というか設計思想というか)

スクリプトのみでメニュー群にマウスアクションの演出や、オーバーエリアの設定するのって、結構手間がかかったりして、意識して作らないと、すごく味気ないものになっちゃいますよね?
 このクラスは、出来るだけそういう負荷を減らすため、マウスアクションやオーバーエリアを、タイムライン上で設定する事を目的としています。(一応スクリプトでも出来ます)

動作サンプル

SwitchMenuクラスサンプル

(続きを読む…)

[as3]ImageLoadQueueクラスドキュメントとサンプルコードアップ

Category:{ actionscript }  Tag:{ } Comments:{ 1 Comment }
Posted:{ 2010.10.04 07:18:16 }

先日公開した、複数画像を非同期で順にロードするImageLoadQueue(イメージロードキュー)クラスのドキュメントとサンプルコードをアップしました。

ドキュメント

http://www.romatica.com/dev/imageloadqueue/asdoc/

サンプルコード

ダウンロード後のsample/ImageLoadQueueSample.asがサンプルコードファイルです

Spark Wiki

またSpark Wikiにも同じ内容をアップしてあります。
http://www.libspark.org/wiki/ImageLoadQueue


レンタルサーバー豆知識