ActionScript (Flash)

今は docomo の携帯で動かす事を考えて、ActionScript2 + Flash 8 で開発してます。 いちお Flex SDK + FlashDeveloper の環境も作ったから、そのうちのりかえたいところ。
作ったものはこちら

ActionScript2 の Tips

配列

array はいきなり宣言したらいい。
長さ 3 の配列 A を確保。
var A:Array = new Array(3)
要素が[1,2,3] の配列 B を作成。
var B:Array = new Array(1,2,3)
大かっこで宣言もできる。
var C:Array = ["a",""]
配列といっても、中にはどんな型でも入れることができる。 例えば、[123, "abc"] みたいに文字列と数値を同じ配列にいれちゃうこともできる。

アクションを書く場所

自分的なコーディングスタイルがようやくできてきた。 アクションはフレームに書く。
this.onLoad = function(){

};

this.onEnterFrame = function(){

};

文字列名から変数の値にアクセス

ふつうの言語だと、変数名と文字列はあまり関係がない。 例えば、
var apple = 123;
での apple という変数と、
"apple"
という文字列は、べつに関係がない。(C みたいなコンパイルする言語だと変数名は機械語になると消えちゃうから、あたりまえといえばあたりまえ)
でも、actionscript では、インタプリタ型の特徴を生かして、"apple" という文字列からいきなり変数の中身を参照できる。 たとえば、ふつうの fla ファイルの中(_root スコープ) なら、
apple = 123;
trace(_root["apple"]);
みたいに書ける。 ( this["apple"] でもいけたはず )

関数の返り値を複数持てる? ... 残念ながらだめ。

Python みたく、返り値に複数の値(タプル)を持てるかと思ったらだめだった…
function f0(){
 return 2,3;
}

x,y = f();
ではうごきません。
function f(){
  return [2,3];
}

A = f();
x = A[0]; y = A[1]; 
なら OK です。あんまかくいみないですけど。
関数宣言 function f(){ }; _root.f() _root.f = function(){ }; this.mc = root_mc.createEmptyMovieClip("avc", 0); trace(x + ", " + y); ムービークリップ this.onEnterFrame = function(){ }; シンボル onClipEvent(enterFrame){ this._x -= 2; } キーボード シンボルを作って、その中の onClipEvent(load){ var twip = 2; } onClipEvent(enterFrame){ this._x -= twip; } on(keyPress ""){ twip += 1; } on(keyPress ""){ twip -= 1; }

XML 読み込み

本質的に非同期なので、XML を全部読んで xx する、みたいに 一続きの関数に書こうとしないほうがよい。
func(){
  read_all();
  process_it();
}
ではなくて、以下のように書く。
function init(){
var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success) { _root.parseDataXML(success ? this : null);};
xml.load(list_xml);
if(xml.status != 0){ trace("err");  return;}
_root.images = new Array();
}


function parseDataXML(xml_data){
var paths:Array = new Array();
var descs:Array = new Array();
var A:Array = xml_data.firstChild.childNodes;
for (var i = 0; i < A.length; i++) {
		    var e:XMLNode = A[i];
		    for (var j = 0; j < e.childNodes.length; j++) {
					key = e.childNodes[j].nodeName;
					val = e.childNodes[j].firstChild.nodeValue;
					if(key == "path")     { paths[i] = val; }
					else if(key == "desc"){ descs[i] = val;}
					}
					}
					loadImages(paths, descs);
}
var A = new Array();
var B = [2,3];
A[0] = B;

trace(A[0][1]);