2007年6月アーカイブ
結局あんまり触ってないなあ。
次に触る時は日本語版。
なんかいろいろ忘れてしまいそう。。。
import flash.display.Sprite;
import flash.events.Event;
this.addEventListener( Event.ENTER_FRAME , enterframe1 );
this.addEventListener( Event.ENTER_FRAME , enterframe2 );
this.addEventListener( Event.ENTER_FRAME , enterframe2 );
var obj = { };
obj.clipChild = new Sprite();
var grandChild:Sprite = new Sprite();
obj.clipChild.addEventListener( Event.ENTER_FRAME , enterframe3 );
grandChild.addEventListener( Event.ENTER_FRAME , enterframe4 );
obj.clipChild.addChild( grandChild );
this.addChild( obj.clipChild );
function enterframe1( e:Event )
{
trace("enterframe1");
this.removeEventListener( Event.ENTER_FRAME , enterframe1 );
}
function enterframe2( e:Event )
{
trace("enterframe2");
delete obj.clipChild;
this.removeEventListener( Event.ENTER_FRAME , enterframe2 );
}
function enterframe3( e:Event )
{
trace("enterframe3");
trace( obj.clipChild );
obj.clipChild.removeEventListener( Event.ENTER_FRAME , enterframe3 );
}
function enterframe4( e:Event )
{
trace("enterframe4");
grandChild.removeEventListener( Event.ENTER_FRAME , enterframe4 );
}
出力結果は
enterframe1 enterframe2 enterframe3 undefined TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at test_fla::MainTimeline/enterframe3() enterframe4 enterframe3 undefined TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at test_fla::MainTimeline/enterframe3() … …以下メモ:
・this参照は Event でもないし、追加したオブジェクトでもなく Function を定義している場所。
・同じ Function は2重に定義できない。
・違う Function であれば同じイベントを複数追加できる。
・removeEventListener を実行する前に そのリスナーオブジェクトを削除するとイベントが消せなくなる。
・enterFrame の実行される順序は、addした順。
var str = "abcdefghijklmnopqrstuvwxyz";
var obj = {}
for(var i=0;i<10;i++){
var s = str.substr(i,1);
obj[s] = i+"";
}
obj["en"] = "english";
obj["jp"] = "japanese";
delete obj["d"];
for ( var val in obj ){
trace(val);
}
AS2までの for in では
jp en j i h g f e c b aと出力されていた。
一応追加された逆順になっている。
これをAS3で実行すると
h c i jp j e f a en g b
こんな具合。
さっぱりルールが分からない。
ちなみに AS3 で追加された for each を使うとこんな感じ。
7 2 8 japanese 9 4 5 0 english 6 1
バラバラ事件です。
AS2 で使用していたクラスは、これのせいで一部仕様変更しないといけなくなっちゃいました。
先日のエントリーに書いたクラスファイルを下記の場所にアップ。
http://blog.seyself.com/archives/classicEvent.zip
やたらといろいろ定義しないといけないのが面倒なのと、覚えるのも一苦労しそうなので
AS2 ベースのイベント、メソッドを持ったクラスを作成。
たぶんみんなおんなじようなことはやってるだろうから、探せばどっかにあるんだろうけど
まずは AS3 の仕組みを理解するためにも、もんどりうって作ってみる。
以下はその時の経過をメモ。
クラス内に
と警告されてしまう。
onLoad, onRelease, onPress 等も同様。
public ステートメントを付けると更に上書きもできなくなってしまう。
でも onEnterFrame や onRelease は定義した直後から自動的にイベントを受け取ってほしいので
でもこれだと同じく警告が出てしまう。
で、Proxy クラスを用いて onEnterFrame プロパティに
無理やり setter , getter を再定義する方法を試みてみる。
こんな感じに。
でもこれだとどうしても this.onEnterFrame と書くのが難しかった。
いろいろ試行錯誤していると、
getter 無しだと警告が出てなかった。
理由は良く分からない。
でもこれだと onEnterFrame で定義した function を抜き出すことができないので
これだと警告も出ないし、モーマンタイ。
この調子でいろいろイベントを作成していく。
気にくわないのは onSetFocus の getter の名前が
「getSetFocus」になってしまったこと。
get なんだか set なんだか。。。
AS2 ベースのイベント、メソッドを持ったクラスを作成。
たぶんみんなおんなじようなことはやってるだろうから、探せばどっかにあるんだろうけど
まずは AS3 の仕組みを理解するためにも、もんどりうって作ってみる。
以下はその時の経過をメモ。
クラス内に
public function onEnterFrame():void {}
と書くとWarning: 1090: Migration issue: The onEnterFrame is not triggered automatically by Flash Player at run time in ActionScript 3.0. You must first register this handler for the event using addEventListener ( 'enterFrame', callback_handler).
と警告されてしまう。
onLoad, onRelease, onPress 等も同様。
public ステートメントを付けると更に上書きもできなくなってしまう。
public var onEnterFrame:Function;これだと警告は出ない。
でも onEnterFrame や onRelease は定義した直後から自動的にイベントを受け取ってほしいので
public function set onEnterFrame( func:Function ):void
{
__onEnterFrame = func;
this.addEventListener( Event.ENTER_FRAME, __enterFrameCall );
}
public function get onEnterFrame():Function
{
return __onEnterFrame;
}
private function __enterFrameCall( e:Event ):void
{
__onEnterFrame.apply( target , null );
}
private var __onEnterFrame:Function;
と書きたい。でもこれだと同じく警告が出てしまう。
で、Proxy クラスを用いて onEnterFrame プロパティに
無理やり setter , getter を再定義する方法を試みてみる。
override flash_proxy function getProperty( name )
{
return classicEvent['__'+name];
}
override flash_proxy function setProperty( name, func ):void
{
var str = name.toString();
var tmp = str.split('on').join('');
classicEvent['__'+name] = func;
classicEvent['__set'+tmp+'Event']();
}
こんな感じに。
でもこれだとどうしても this.onEnterFrame と書くのが難しかった。
いろいろ試行錯誤していると、
public function set onEnterFrame( func:Function ):void
{
__onEnterFrame = func;
}
private var __onEnterFrame:Function;
getter 無しだと警告が出てなかった。
理由は良く分からない。
でもこれだと onEnterFrame で定義した function を抜き出すことができないので
public function set onEnterFrame( func:Function ):void
{
__onEnterFrame = func;
}
public function getEnterFrame():Function
{
return __onEnterFrame;
}
private var __onEnterFrame:Function;
として、中身の取得も可能にする。これだと警告も出ないし、モーマンタイ。
この調子でいろいろイベントを作成していく。
気にくわないのは onSetFocus の getter の名前が
「getSetFocus」になってしまったこと。
get なんだか set なんだか。。。
昨日、今日と Flash CS3 で AS3 をあれこれ触ってみて、
for(var i=0;i<10;i++){
trace(i);
}
for(var i=0;i<10;i++){
trace(i);
}
これに何でエラーが出るのかまったく分からず四苦八苦してた。
どうも同じスクリプト内で i が2回 var で宣言されてるのがダメらしい。
for(var i=0;i<10;i++){
trace(i);
}
for( i=0;i<10;i++){
trace(i);
}
こうすると無事実行してくれる。
早く発売されないかな~。
されても仕事でバージョン9でパブリッシュするのはまだまだ先なんだろうけども。
と思いつつ、AS3のクラスを使ってAS2のメソッド丸ごと実装しようとしてる自分がいたり。
みんなどうしてるのかな。
これじゃあんまりAS3の恩恵得られてねえんじゃねいの?
って思いつつ。
