忍者ブログ
ぼやき用のブログ。主にソフトウェアの使い方覚書など。ときどき絵や音楽を置いたり。
プロフィール
HN:
おねむ
HP:
性別:
非公開
自己紹介:
絵や漫画描いたり作曲したりポリゴンや動画作ったりプログラム組んだりしてる多趣味な管理人です。
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
最新コメント
[11/17 NONAME]
[11/14 灯火]
[10/07 羽琉猫]
18
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



物理計算は全くやってないがなんとなくそれっぽくなってきた気がする。

ブロック画像いちいち敷き詰めるのがメンド臭いので
スクリプトでテキトーに描画してみた。

一応バーと同じムービークリップ内に
ボール(インスタンス名: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
お名前
タイトル
文字色
URL
コメント
パスワード
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Trackback URL
Copyright c おねむのこっそり日記 All Rights Reserved
Powered by ニンジャブログ  Designed by ピンキー・ローン・ピッグ
忍者ブログ / [PR]