Japanease only.

5.ラケットによるボールの打ち返し判定 


ボールがラケットに当たっている?

 まず、ボールがラケットで打つべき場所まで来ているかどうかの判定が必要になります。ボールの直径が20ですので右側のx座標値はpx+20。このpx+20がラケットの移動するラインx=380以上である時、打ち返しの判定を行います。x=380に達していなければ、打ち返し判定を行う必要はありません。これは、if文を使って次のように表します。
 if (px+20>=380) { 打ち返し判定 }

 次に打ち返しの判定ですが、下図のようなケースが考えれます。ア)はボールを正確にとらえている場合。イとウはギリギリ打ち返した場合。エは外した場合です。ボールの中心のy座標値がpy+10であるとすると、イ)ではpy+10がラケットの上部ry値に等しい状態です。また、ウ)では、py+10がラケットの下部ry+50に等しいということになります。したがって、ボールがラケットに接している状態では、py+10の値がryからry+50の範囲内にあり、ifの条件式としては以下のような記述になります。
 if (py+10>ry && py+10<=ry+50) { ボールとラケットが接している場合の処理 }

 

 一方、ボールがラケットに接していない(外れた)場合の処理も必要です。そこで、if文では、()内の条件が成立していない場合に実行する内容をelseの後に続けて記述します。

if文で条件が成立しない(偽)場合に実行する内容を記述する方法
記述 if (条件式) {条件が成立した場合に実効する文や命令}
else {条件が成立しない場合に実効する文や命令}
内容 条件式が成立しない場合には、else以降の文や命令が実行される
if (k>=0) { g=1; }
else {g=0; }
kが0以上でg=1となり、kが0未満で、g=0となる。

 今回は、まずボールがラケットで打つべき場所まで来ているかどうかの判定を行い、次に打ち返しの判定を行っていますので、if文が重複した形になります。実際の記述は下図のようなイメージになります。最初のif文は、次のif文(elseなども含め)を{ }で囲みます。すると、条件式1が成立しない場合には、内側のif文が実行されません。

 以下の例は、打ち返しの判定及びスコア計算を行う例になります。

例9)
<script language="JavaScript"><!--

function idou(){
 py=py+sy;
 px=px+sx;
 document.ball.style.top = py;
 document.ball.style.left = px;

 if (px<=10) sx=10;
 if (py<=50) sy=10;
 if (py+20>=350) sy=-10;
 if (px+20>=380){
  
if (py+10>=ry && py+10<=ry+50) {score=score+10;
                     document.myform.tensu.value=score;}
  else {miss=miss+1;
  document.myform.misu.value=miss;}

  sx=-10;
 }

 if (miss<4) {setTimeout("idou()",200);}
 else {document.myform.misu.value="GameOver";}



}

function kaishi(){
 py=70;
 px=30;
 sy=10;
 sx=-10;
 ry=100;
 score=0;
 miss=0;
 document.ball.style.top = py;
 document.ball.style.left = px;

 setTimeout("idou()",1000);

}

function bar_move()
{
 k=event.keyCode;

 if (k==74 && ry>50) ry=ry-10;
 if (k==78 && ry+50<350) ry=ry+10;
 document.racket.style.top = ry;

}

window.document.onkeydown=bar_move;

// --></script>

<補足>


 

Last up date:2006/12/25