2007年6月アーカイブ

わほーい。
CS3 日本語版が届いたよい。

追記:

と思ったらインストール失敗して使えないよ。
やたら時間浪費したあげく、結局今日はあきらめた。

desktop.jpg

1280×1024 3画面満タン埋まってます。

あとエディタ用の画面があればなあ。なんて。

あんまり画面が広いと、マウス操作が面倒になってきます。

結局あんまり触ってないなあ。

次に触る時は日本語版。
なんかいろいろ忘れてしまいそう。。。

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 の仕組みを理解するためにも、もんどりうって作ってみる。

以下はその時の経過をメモ。

クラス内に
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でパブリッシュするのはまだまだ先なんだろうけども。

flash as をひっくり返しただけ。

と思いつつ、AS3のクラスを使ってAS2のメソッド丸ごと実装しようとしてる自分がいたり。
みんなどうしてるのかな。
これじゃあんまりAS3の恩恵得られてねえんじゃねいの?
って思いつつ。