[目次|前回|次回|Reference]

乱数+ボタン

Time-stamp: "2009-11-11 Wed 18:57 JST hig"

乱数を使おう

ゲームを作るなら, ボールがランダムな方向に発射されるような機能が必要ですよね.

関数Math.random()は, 0以上1未満の小数を返します. したがって次のようにすると, 変数selectには0以上5未満の整数が代入されます.


var nselect:Number=5;
var select:Number=Math.floor(Math.random()*nselect);

課題

これまでに作ったプログラムを変更して, 起動直後のボールの位置がランダムで, ランダムな向きに等速直線運動するようにしよう.

ボタンを押そう

次のサンプルを実行すると, 上下キーでボタンのフォーカスが移動し, 選択キーでボタンを押すことができることがわかります.


var moveEnabled:Boolean=false;

var ball:MovieClip = this.createEmptyMovieClip("ball",this.getNextHighestDepth());
ball.lineStyle(40,0x0000ff, 100, true, "none", "round","mitter",1);
ball.moveTo(-1,0);
ball.lineTo(+1,0);
ball.tabEnabled=false; // このムービークリップはフォーカスされない

ball.onEnterFrame=function(){
	if(moveEnabled){
		this._x+=1;
		this._y+=2;
	}
}

var button1:MovieClip = this.createEmptyMovieClip("button1",this.getNextHighestDepth());
button1.lineStyle(4,0xff0000, 100, true, "none", "round","mitter",1);
drawRect(button1,10,200,50,10);

var button2:MovieClip = this.createEmptyMovieClip("button2",this.getNextHighestDepth());
button2.lineStyle(4,0x00ff00, 100, true, "none", "round","mitter",1);
drawRect(button2,100,200,50,10);

button1.onPress = function(){
	moveEnabled=false;
}

button2.onPress = function(){
	moveEnabled=true;
}

function drawRect(mc:MovieClip, px:Number, py:Number, w:Number, h:Number):MovieClip{
	mc.moveTo(px,py);
	mc.lineTo(px,py+h);
	mc.lineTo(px+w,py+h);
	mc.lineTo(px+w,py);
	mc.lineTo(px,py);
	return mc;
}

onPressは, そのオブジェクトにフォーカスがある時に選択キーが押された場合に呼ばれるイベントハンドラです.

画面上にあるすべてのMovieClipオブジェクトはフォーカスを受けることができます. しかし今のサンプルではボールはフォーカスされません. それは, tabEnabledプロパティをfalseとしているからです.

選択キーを押す以外に, 数字キーを押すなど, さまざまなイベントを受け取ることができます. MovieClipクラスのドキュメントを調べてみましょう.

課題

物体の出現・消滅その1

例えばブロックが現れたり, 消えたりということを実現しましょう. とりあえず, 出現・消滅させることのできる単位は MovieClipオブジェクトです. 2つの可能性があります.

  1. attachMovieClip, removeMovieClipメソッドを使って, MovieClipオブジェクトを, 画面(というか親のMovieClipオブジェクトと)接続・切り離しする
  2. MovieClipオブジェクトが画面上に存在したまま, _alpha,_visibleなどの属性を操作して, 可視化, 不可視化する

ここでは後者の方法を利用します.


// 物体が消滅するサンプル
var moveEnabled:Boolean=true;

var ball:MovieClip = this.createEmptyMovieClip("ball",this.getNextHighestDepth());
ball.lineStyle(40,0x0000ff, 100, true, "none", "round","mitter",1);
ball.moveTo(-1,0);
ball.lineTo(+1,0);
ball.tabEnabled=false; // このムービークリップはフォーカスされない
ball._x=100;
ball._y=200;

var b1x:Number=0;
var b1y:Number=0;
var b1w:Number=120;
var b1h:Number=10;
var b2x:Number=120;
var b2y:Number=0;
var b2w:Number=120;
var b2h:Number=10;

var block1:MovieClip = this.createEmptyMovieClip("block1",this.getNextHighestDepth());
block1.lineStyle(4,0xff0000, 100, true, "none", "round","mitter",1);
drawRect(block1,b1x,b1y,b1w,b1h);

var block2:MovieClip = this.createEmptyMovieClip("block2",this.getNextHighestDepth());
block2.lineStyle(4,0x00ff00, 100, true, "none", "round","mitter",1);
drawRect(block2,b2x,b2y,b2w,b2h);

function drawRect(mc:MovieClip, px:Number, py:Number, w:Number, h:Number):MovieClip{
	mc.moveTo(px,py);
	mc.lineTo(px,py+h);
	mc.lineTo(px+w,py+h);
	mc.lineTo(px+w,py);
	mc.lineTo(px,py);
	return mc;
}

ball.onEnterFrame=function(){
	if(moveEnabled){
		this._x-=1;
		this._y-=2;
	}
	
	if(this._x>=b1x && this._x<b1x+b1w && this._y<b1y+b1h){
		block1._visible=false;
	}
	if(this._x>=b2x && this._x<b2x+b2w && this._y<b2y+b2w){
		block2._visible=false;
	}	
	
}

課題