鏡シリーズ第3弾。今回はセル上に区切られた画面内の時間がバラバラに進む鏡。
これは色々展開できそうなのでもうちょっと探ってみる。
先輩に教えていただきました。Eventクラスのサブクラスを作る時は内部処理で参照することがあるからcloneメソッドとtoStringメソッドをオーバーライドしなくちゃいけないらしい。
という事は以前書いたDynamicEventクラスも修正しなくちゃいけない。
で、そのオーバーライドしたメソッドの中身はイナヅマtvログさんによると、こんな感じでいいらしい。
public override function clone():Event
{
return new DynamicEvent( type, bubbles, cancelable, [arguments] );
}
public override function toString():String
{
return formatToString( "DynamicEvent", "type", "bubbles", "cancelable", "eventPhase", [arguments] );
}
参考:イナヅマtvログ » EventサブクラスにtoString,cloneを追加しなければいけない?
Adobe Flex 3 ヘルプ
Event通知元から何かしらのメッセージを自由にリスナーオブジェクトに送信するためのメモ。
Dynamic化したカスタムEvent、DynamicEventを作り、dispatchEventでEventを送信する前にDynamicEventのインスタンスに適当にプロパティをぶっ込んでそのままdispatchEventで送ってやればOK。
これでEvent受信元は、引数で渡されるDynamicEventのさっき作ったプロパティから値が取り出せる。
DynamicEventクラスはこんな感じ。Eventクラス継承してDynamic付加してるだけ。
package
{
import flash.events.Event;
public dynamic class DynamicEvent extends Event
{
public static const SOMETHING:String = "something";
public function DynamicEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false):void
{
super( type, bubbles, cancelable );
}
}
}
送信元の処理はこんな感じ。
var event:DynamicEvent = new DynamicEvent( DynamicEvent.SOMETHING ); //適当なプロパティをこしらえる event.message = "クソ眠い"; //Event発行 dispatchEvent( event );
Eventオブジェクトを受け取るイベントハンドラはこんな感じ。
hoge.addEventListener( DynamicEvent.SOMETHING, function( e:DynamicEvent )
{
//「クソ眠い」が出力される。
trace( e.message );
});
#追記
@lalalilaさんに教えてもらったDataEventを使えばString型のデータなら同様の事が可能っぽい。lalalilaさんありがとうございます。
#さらに追記
Eventクラスのサブクラスについてもひとつ注意点が。
[AS3]Eventクラスのサブクラスを作る時の注意点 | source-lab. note

要ウェブカメラ、要FlashPlayer10以上
※追記
FlashPlayerのセキュリティ上、ウェブカメラを使おうとするとアクセス許可を求められるけど、このコンテンツ自体はウェブカメラの映像をどこかに流したりというような悪用はできないのでウェブカメラへのアクセスは許可しても大丈夫です。
課題で作った新しい鏡の提案。
要ウェブカメラ、要FlashPlayer10以上
先頃Adobe MAX2009でFlash CS5の製品概要が発表された。その中で衝撃的だったのはiPhoneアプリ開発のサポート、これによってActionScript3.0を使ったiPhoneアプリの開発が可能になる模様。
Flashから書き出したコードはネイティブアプリとしてコンパイルされるようなのでFlashPlayerのようなVMを経由しないそう。
その上、基本的にはOpenGL/ES経由でレンダリングを行うようなので、速度的にもObjective-Cで開発する時より極端に遅くなるような事はなさそう。イメージとしてはopenFrameworksで開発するのに近そうな感じ。
すでにFlash環境からパブリッシュされたアプリがApp Storeでいくつか公開されてるようなので、「Flashでアプリ開発してお小遣い稼ぎ」は問題ないみたい。
ちなみにiPhoneがFlashをサポートしたわけではないのでウェブブラウジングの際にFlashコンテンツが再生可能になるわけではないみたい。ただswfのロードは可能なようなので、Flashコンテンツを別アプリで実行ってことはできるのかもしれない。
いずれにせよiPhone〜Flash界隈が活況になるのは間違いなさそう。とりあえず2009年末にβ版が公開という事で期待。
参考:
Adobe Labs - Adobe Flash Professional CS5: Applications for iPhone
Developing for the Apple iPhone using Flash | Adobe Developer Connection
Applications for iPhone:Developer FAQ - Adobe Labs
例えばライブラリから読み込んだSpriteの子Spriteにインスタンス名でアクセスしたいとか。これを普通にライブラリから読み込んだSpriteの子にアクセスしようとして、
//ライブラリからアタッチ var sp:Sprite = new spriteAttachedFromLibrary() as Sprite; //子Spriteにアクセス var spChild:Sprite = sp.spriteAttachedFromLibraryChild;
とすると、
「1119: 未定義である可能性が高いプロパティ "インスタンス名" に静的型 flash.display:Sprite の参照を使用してアクセスしています。」
と怒られる。
これを回避するためには[]演算子でストリングリテラルを使ってアクセスする。
上記の場合だと、
//ライブラリからアタッチ var sp:Sprite = new spriteAttachedFromLibrary() as Sprite; //[]演算子で子Spriteにアクセス var spChild:Sprite = sp[ "spriteAttachedFromLibraryChild" ];
こうするとエラー回避してアクセスできる。(via 凹村さん、ありがとうございました。)
ちなみに以前むねごんさんに教えて頂いたんですが、これを応用するとFlashPlayerの上位バージョンで追加された新しいメソッドなども使える。
例えばFP10からFileReferenceに追加されたsaveメソッド、これをFP9までしか描き出せないFlashCS3からも利用できる。
var fr:FileReference = new FileReference(); fr[ "save" ]( byte, name );
書き方はこんな感じ。
ただしこのまま描き出したswfは対応バージョンが9になっているので、このsaveメソッドが実行されるとエラーがでる。なのでバイナリエディタでswfの対応バージョンを9から10に書き換えてやる。やり方はバイナリエディタでswfを開いて、4バイトめの「09」を「0A」に書き換えて保存。こんだけ。これでFlashCS3からもfileReference.saveを使ったローカルファイルアクセスができる。
使用は自己責任でお願いします。
前々回のエントリでBitmapDataの制限サイズがちっちぇえって話を書いたけど調べてたらちょうどいい便利クラス見つけた。
サイズ制限なしのBitmapData作ってくれるクラス。
BitmapDataUnlimited / formatlos
http://blog.formatlos.de/2008/05/28/bitmapdataunlimited/
どうも内部でGIFを作って、それをBytesArray経由でBitmapDataとして読み込んでサイズ制限迂回してるっぽい。
使い方はまずインスタンス化してcreate()。これで中に指定サイズのBitmapDataを作ってくれる。以降はインスタンスのbitmapDataプロパティから巨大BitmapDataにアクセスできる。これだけ。
ただ巨大なBitmapData作ると生成するのに時間がかかるから、BitmapDataUnlimitedEvent.COMPLETEイベントを待ってからアクセスする。これだけ注意。

[drag] or [double click anywhere]
Wonderfl使ってレンダリング実験してたのが一旦完結。クソ重いから公開するのどうしようかと思ったけど、静止画生成用のエンジンとして見切って作ってたからまぁいいや。
一応操作としてはドラッグ、もしくはダブルクリックで自動操縦になる。
で生成される静止画はこんな感じ。
あとついでにB0とかB1ぐらいの大判出力用にBitmapDataの高解像度出力する方法を模索してるんだけど、BitmapDataの大きさ制限のせいでなかなか効率のいい方法が見つからない。
一応今は2880pixel x 2880pixelのBitmapDataを複数作って目標のサイズを覆うようにタイリングして、drawする時はそれぞれのBitmapDataにSpriteを枚数分何度もdrawしてるって状態。そのせいですんごい処理負荷高い上に、書き出した複数の画像をあとからPhotoshopで合成しないといけなかったりしてすんごいめんどくさい。どうにかならんもんかね。
追記:
上のネットで公開してるバージョンはスクリーンサイズのBitmapDataにdrawしてるだけだから重いのは他が原因。
まずは追従してくる点を順番に線で結んでみる。
次は結ぶ順番を変えてみる。
線で結んでできた面を塗りつぶしてみる。
フレームレートを上げて、点の数を増やして長くしてみる。
一定の長さ以上縮まないようにしてみる。
Y軸方向に重力を加えて、多少伸縮するようにして弾力を持たせてみる。
奇跡がキャンバスに残るようにしてみる。
あとは色をうまいこと変化させたりして軌跡が良さ気に見えるように調整、調整。
西村斉輝(にしむらなおき)
1984年兵庫県生まれ。
現在多摩美術大学GD科在籍。
パーソナルサイト
source laboratory™運営。
Powerd by
MovableType 4.1