今回は、ひとつのシンボルから複数のインスタンスを作ってみました。あとループとか条件分岐などもやってみました。あとテキストフィールドの生成も、前回より多少つっこんでやってみました。

前回のシンボルを使い回しで、今度はステージいっぱいにASを使ってボールを置いてみようという事です。そして、ステージ中央に配置されたボールの数を出力するようにしました。タイムラインにはスクリプトと背景画像以外なにもありません。そして、前の同様flash.display.Spriteクラスのサブクラス"Ball"と定義しています。

//--------初期設定----------
const NUMOFBALL:uint = 1000;	//作成するボールの数(定数としました)
//--------------------------

//ボールを格納する配列を作成
var ballsArray:Array = [ ];	

//シンボルからボールのインスタンスを指定した数分作成し配列に追加する
for ( var i:uint = 0; i < NUMOFBALL; i++ ){
	var tmp:Sprite = new Ball();
	ballsArray.push ( tmp );
	//ボールの拡大縮小
	ballsArray[i].scaleX = 0.5;
	ballsArray[i].scaleY = 0.5;
}

//ボールを配置する間隔(=ボールの幅つまりぴったりくっつける)
var placePitch:uint = ballsArray[0].width;

//ボールを配置するx座標の初期値
var hPos:int = 0 - ( placePitch / 2 );

//ボールを配置するy座標の初期値
var vPos:int = placePitch / 2;

//ボールの数を数えるカウンタ
var count:int = 0;

//インスタンスをステージに配置
for each ( var src:Sprite in ballsArray ) {
	//ステージにボールを配置
	this.addChild (src);
	//ステージ右側にはみ出ないようにする措置
	if ( hPos > src.stage.stageWidth - placePitch ) {
		hPos = 0 - ( placePitch / 2 );
		vPos += placePitch;
	}
	//ステージ下にあふれるようだったら配置を終了
	if ( vPos >= src.stage.stageHeight ) {
		this.removeChild(src);
	} else {
		//ボールのx座標
		src.x = hPos + placePitch;
		//ボールのy座標
		src.y = vPos;
		//ボールを置く位置
		hPos += placePitch;
		//配置数に1を加算
		count ++;
	}
}

//配置された数を確認するテキストフィールドを作成
var tf:TextField = new TextField();	
tf.background = true;	//背景色をON
tf.backgroundColor = 0x333333;	//背景色(20%グレー)
tf.autoSize = TextFieldAutoSize.CENTER;	//文字を中央寄せ
tf.textColor = 0xFFFF00;	//文字色(黄色)

//テキストフィールドの属性の設定
var tformat:TextFormat = new TextFormat();
tformat.font = "Verdana";	//フォントファミリー
tformat.size = 16;	//フォントサイズ(単位はpt)

tf.defaultTextFormat = tformat;	//テキストフィールドに属性を追加
tf.text = "Balls: " + count;	//表示されるテキストを設定
this.addChild (tf);	//ステージに配置
tf.x = tf.stage.stageWidth / 2 - tf.width / 2;	//ステージ中央に
tf.y = tf.stage.stageHeight / 2 - tf.height / 2;	//同上

定数(const)に生成するインスタンスの数をとるようにしてあります。とりあえず1000個(笑)。でも、ステージからあふれた分は表示させないような仕組みを施しています(って配列に入れる段階でやった方がいいんだけど多分)

以下、ポイントとか自分用メモ

  • for..inだとSpriteオブジェクトの走査が出来なかった。このような処理の場合はAS3から追加されたfor each(..in..)を使うみたい。(foreachじゃなくてfor eachです。PHPやってるヒトは注意)
  • uint型で宣言したcountをTextField.textに設定しようと思ったら型のエラーが出ました。型が違うんだね。String型の文字列と+演算子で結合して代入したらうまく行った(このあたりは昔のAS同様アバウト)

実はこれ作って、またもや色々謎が噴出した。ループ内の処理の順序をどうやったらいいのかがよくわからなくなったんです。。トライアンドエラーで想定したものが出来たんですが、当初思ったアルゴリズムだとなんかうまくいかなかった。なのでもっと色々作って、そのあたりも覚えないといけないなと思いました。

・・・色々つくっていって思ったのですが、AS3のコードは、自分で後からソースコードを見た時に以前のASのソースよりもわかりやすいなあと思った。これって実は大事。改版とかバージョンアップとかの時や、ほかの人とコラボる時とか。あと使った事のないクラスを扱う場合に習得するのも速いのかもしれない。まあ完全にPG目線なんですけどもね。ただやはり、ちょっとしたものを作る際の手続きの煩雑さはなあ。。

++ Posted at 07/07/11(Wed)22:10:24 ++