物理計算は全くやってないがなんとなくそれっぽくなってきた気がする。
ブロック画像いちいち敷き詰めるのがメンド臭いので
スクリプトでテキトーに描画してみた。
一応バーと同じムービークリップ内に
ボール(インスタンス名:ball)と、ブロック群(インスタンス名:blocksPanel)を作って
そのムービークリップ2つに新しくコードを追加しました。
以下ソース。(スペースが全角になってるので、
もしコピペする場合はスペースを半角に直さないとエラーが出ます。)
【インスタンス名:blocksPanel】onClipEvent (load) {
//ブロックを置くパス
var blockPass = "this";
//マスクするインスタンス名
var maskLayerPass = "_parent.imgAboveLayer";
//ブロックのサイズを決めます。
var blockWidth = 20; //ブロック横幅
var blockHeight = 20; //ブロック縦幅
//ブロックの数を、行列で定めます。(決め打ちでもOK)
//横に置くブロックの数
var blockNumMaxX = Stage.width / blockWidth;
//縦に置くブロックの数
var blockNumMaxY = (Stage.height - 60) / blockHeight;
//--その他初期値
var blockInstance = "block";
var arrBlockFlg = new Array(); //当たり判定フラグ。0のとき未/1のとき済(不可視)
var drawX = 0;
var drawY = 0;
//--ブロックを配置します。
for(i = 0; i < blockNumMaxX * blockNumMaxY; i++){
blockInstance = blockPass + ".block"+i;
//座標取得
drawX = blockWidth * (i % blockNumMaxX);
drawY = blockHeight * Math.floor( i / (Stage.width / blockHeight));
arrBlockFlg[i] = 0;
//ブロック描画
eval(blockPass).createEmptyMovieClip("block"+i, i);
eval(blockInstance).lineStyle(1, 0xff0000);
eval(blockInstance).beginFill(0xffff00, 100);
eval(blockInstance).moveTo(drawX, drawY);
eval(blockInstance).lineTo(drawX + blockWidth, drawY);
eval(blockInstance).lineTo(drawX + blockWidth, drawY + blockHeight);
eval(blockInstance).lineTo(drawX, drawY + blockHeight);
eval(blockInstance).lineTo(drawX ,drawY);
eval(blockInstance).endFill();
}
}【インスタンス名:ball】onClipEvent (load) {
//初期位置(x,y)
_x = Stage.width / 2;
_y = Stage.height - 60;
//初速度(x,y)
speedx = 5;
speedy = -10;
}
//ボールが動き出します。
onClipEvent (enterFrame) {
this._x += speedx;
this._y += speedy;
//ボールが壁にあたったら跳ね返ります。
if (this._x < this._width / 2) { //左に当たったとき
this._x = this._width / 2; //強制位置補正
speedx = -speedx; //x座標の移動方向反転
}
else if(this._x > Stage.width - (this._width / 2)){
//右に当たったとき強制位置補正
this._x = Stage.width - (this._width / 2);
speedx = -speedx; //x座標の移動方向反転
}
if (this._y < this._height / 2) {
//上に当たったとき強制位置補正・跳ね返り //上に当たったとき
this._y = this._height / 2; //強制位置補正
speedy = -speedy; //y座標の移動方向反転
}
else if(this._y > Stage.height - (this._height / 2)){
//下に当たったとき強制位置補正・跳ね返り
this._y = Stage.height - (this._height / 2); //強制位置補正
speedy = -speedy; //y座標の移動方向反転
}
//バーに当たったときの処理
if (_parent.ball.hitTest(_parent.bar)) {
_parent.ball._y = _parent.bar._y - 10;
speedy = -speedy; //y座標の移動方向反転
}
//***************************************ブロックに関する処理--!ここから
// ボールとブロックが当たったとき
for(i = 0; i < _parent.blocksPanel.blockNumMaxX * _parent.blocksPanel.blockNumMaxY; i++){
if (this.hitTest(eval("_parent.blocksPanel.block" + i))) {
// ブロックを非表示に
eval("_parent.blocksPanel.block" + i)._visible = false;
_parent.blocksPanel.arrBlockFlg[i] = 1;
}
}
}ブロックを非表示にする部分はfor文でテキトーに制御してしまっているので
ものすごく重いんじゃないかな。
全体的に出来上がったら直そうと思ってます。
あ、そういえばバーもちょっとコード加えて
バーが画面からはみ出ないようにちょこっと改良しました。
【インスタンス名:bar】//バーの動きのみ設定しています。
onClipEvent (load) {
//初期位置(x,y)
_x = Stage.width / 2;
_y = Stage.height - 40;
}
//マウスカーソルに沿ってバーを動かします。
onClipEvent (enterFrame) {
if(_root._xmouse < this._width / 2) {
//左端からはみ出そうなとき
this._x = this._width / 2;
}
else if(_root._xmouse > Stage.width - this._width / 2) {
//右端からはみ出そうなとき
this._x = Stage.width - this._width / 2;
}
else{
//通常の動き
this._x = _root._xmouse;
}
} PR