ページ 11

早急に返信お願いします!!

Posted: 2013年2月01日(金) 03:31
by kazi
先ほど質問したのですが、コードを囲ってなかったので・・・・・・

javascriptなんですがブロック崩しを作ろうと思っています。
ブロックを壊したらそのブロックがボールになり他のブロックを壊す
というゲームを作ろうと思っています。
ここまでは出来たのですが、どーしてもボールを増やすことができません。
助けてください(_ _)

コード:

<html>
<div id = ball> </div>
<div id = racket> </div>

<body>
<script language="JavaScript">

var x = new Array(); //  ボールのX座標
var y = new Array(); //  ボールのY座標

var vx = new Array(); // ボールの速度(X方向)
var vy = new Array(); // ボールの速度(Y方向)

var xMax; // ボールが動きうる最大のX座標(右方向)
var yMax; // ボールが動きうる最大のY座標(下方向)
var rxMax; // ラケットが動きうる最大のX座標(右方向)

var k = 0; // キーコードを格納する連絡用の変数

var bkl = 100;  //  一番左のブロックのX座標
var bkt = 50;   // 一番上のブロックのY座標

var nx = 10; // ブロックの横方向の数
var ny = 3; //  ブロックの縦方向の数

var dx = 30; // ブロックの横方向の間隔(隙間の長さではなく、二つのブロック間の差分)
var dy = 30; // ブロックの縦方向の間隔(隙間の長さではなく、二つのブロック間の差分)

var i; //  for文による繰り返し処理のために利用する変数  
var j; //  for文による繰り返し処理のために利用する変数  
var h;

var basx = 20; //  ボールの大きさ(横)
var basy = 20; //  ボールの大きさ(縦)

var bksx = 20; //  ブロックの大きさ(横)
var bksy = 20; //  ブロックの大きさ(縦)

var rsx = 68; //  ラケットの大きさ(横)
var rsy = 20; //  ラケットの大きさ(縦)

var rx = 200; // ラケットのX座標を意味する変数
var ry = 400; // ラケットのY座標を意味する変数

var rspeed = 5; // ラケットが動く時の速度

var a = new Array( );  // ブロックを作るための配列「a」を定義する
var b = new Array( );

for(h = 0; h < 31; h++){

 x[h] = Math.random() * 100;
 y[h] = Math.random() * 100;
 vx[h] = Math.random() * 8 + 3;
 vy[h] = Math.random() * 8 + 3;

}

resizeTo(550,650); // 最初にウィンドウを開く場合のウィンドウのサイズ指定

for(h = 0 ; h < 31; h++){
  b[h] = "ball" + h;
  document.write( "<div id=" + b[h] + "> </div>" );

document.getElementById(b[h]).style.position = "absolute";
document.getElementById(b[h]).style.visibility = "visible";
document.getElementById(b[h]).style.fontSize = "24";
document.getElementById(b[h]).style.color = "#FF00FF";
document.getElementById(b[h]).innerHTML = "●";

}

document.getElementById("racket").style.position = "absolute";
document.getElementById("racket").style.visibility = "visible";
document.getElementById("racket").style.fontSize = "24";
document.getElementById("racket").style.color = "#ff0000";
document.getElementById("racket").innerHTML = "■■■";
document.getElementById("racket").style.left = rx;
document.getElementById("racket").style.top = ry;

for(j = 0; j < ny; j++){
  for(i = 0; i < nx; i++){
    a[j * nx + i] = "block" + j + i;
    document.write( "<div id=" + a[j * nx + i] + "> </div>" );
 
    document.getElementById(a[j * nx + i]).style.position = "absolute";
    document.getElementById(a[j * nx + i]).style.visibility = "visible";
    document.getElementById(a[j * nx + i]).style.fontSize = "24";
    document.getElementById(a[j * nx + i]).style.color = "#1E90FF";
    document.getElementById(a[j * nx + i]).innerHTML = "■";
    document.getElementById(a[j * nx + i]).style.left = bkl + i * dx;
    document.getElementById(a[j * nx + i]).style.top = bkt + j * dy;
  } 
}


//  キーボード押下時の処理
document.onkeydown = rmove;

function rmove(){
 
    k = event.keyCode;

}

//  キーボードを離した時の処理
document.onkeyup = rstop;

function rstop(){
 
    k = 0;

}

setInterval("move_ball( )",16);




function move_ball() {

    rxMax = document.body.clientWidth - rsx - 24;

//  ラケットの移動処理

    if (k == 39){
        rx = rx + rspeed;
        if (rx > rxMax){
           rx = rxMax;
        }
    }
    if (k == 37){
       rx = rx - rspeed;
       if (rx < 0){
          rx = 0;
       }
    }


    document.getElementById("racket").style.left = rx; 

//  ボールの位置の更新処理

    x[h] = x[h] + vx[h];
    y[h] = y[h] + vy[h];

  xMax = document.body.clientWidth - basx - 5;
  yMax = document.body.clientHeight - basy - 7;


//  ゲーム終了の処理
  if ( y[h] >= yMax){           
       document.getElementById(b[h]).style.visibility = "hidden";
       return(0);
  }

//  ボールが壁に跳ね返る処理

  if (x[h] < 0) {
     x[h] = 0;
     vx[h] = -vxv;
  } 
  if (x[h] > xMax) {
     x[h] = xMax;
     vx[h] = -vx[h];
  }
  if (y[h] < 0) {
     y[h] = 0;
     vy[h] = -vy[h];
  } 
  if (y[h] > yMax) {
     y[h] = yMax;
     vy[h] = -vy[h];
  }

//  ボールとラケットの接触の処理

  if ( x[h] > rx - basx && x < rx + rsx && y[h] > ry - basy && y[h] < ry + rsy){
     y[h] = ry - basy;
     vy[h] = - vy[h];
  }


//  ボールと各ブロックの接触の処理

  for(j = 0; j < ny; j++){
    for(i = 0; i < nx; i++){
      if ( x[h] > bkl - basx + i * dx && x < bkl + bksx + i * dx && y[h] > bkt - basx + j * dy && y[h] < bkt + bksy + j * dy){
        if ( document.getElementById(a[j * nx + i]).style.visibility != "hidden"){
           document.getElementById(a[j * nx + i]).style.visibility = "hidden";
           if ( y[h] - vy[h] <= bkt - basy + j * dy || y[h] - vy[h] >= bkt + bksy + j * dy){
              vy[h] = - vy[h];
           }
           else{
              vx[h] = - vx[h];
           }
         }
       }
    }
  }

//  位置が更新されたボールの表示処理

  document.getElementById(b[h]).style.left = x[h];
  document.getElementById(b[h]).style.top = y[h];

}

</script>
</body>
</html>

Re: 早急に返信お願いします!!

Posted: 2013年2月01日(金) 08:54
by h2so5
function move_ball() の中に多数登場する変数 h にはどんな値が入っていると考えていますか?
少なくともfunction move_ball() の中では変数 h に対する代入が無いのですが。

Re: 早急に返信お願いします!!

Posted: 2013年2月01日(金) 13:25
by kaji
繰り返し処理の為にiとjと違う変数をいれなくちゃいけないと思ってhを入れました。
必要なかったのでしょうかね?

Re: 早急に返信お願いします!!

Posted: 2013年2月01日(金) 13:53
by h2so5
kaji さんが書きました:繰り返し処理の為にiとjと違う変数をいれなくちゃいけないと思ってhを入れました。
必要なかったのでしょうかね?
そもそもmove_ball()の中に繰り返し処理は見当たりませんが?

Re: 早急に返信お願いします!!

Posted: 2013年2月01日(金) 21:40
by kazi
確かに・・・・
取り敢えずボールを31個にしようとしているんですが
配列をどう使ったら良いか分からなくて