(C)WorldWideSoftware

<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>弾の軌跡2</title>
 </head>
 <body>
  <a href="http://www.wwsft.com">(C)WorldWideSoftware</a><br>
  <canvas id="bg" width="640" height="640"></canvas><br>
画面クリック(タップ)した位置からレーザー発射<br>
スペースキーでも発射できます<br>
レーザーは一定時間で消失します<br>
  <a href="laser01src.html">ソースコードの確認</a>

  <script>
  //描画面(キャンバス)の準備
  var cvs = document.getElementById("bg");
  var ctx = cvs.getContext("2d");

  //キー入力
  var key = 0;
  window.onkeydown = function(ev) { key = ev.keyCode; }
  window.onkeyup = function(ev) { key = 0; }

  //マウスとタップの判定
  var tapX = 320, tapY = 320, tapC = 0;
  cvs.addEventListener("touchstart", touchStart);
  cvs.addEventListener("touchmove", touchMove);
  cvs.addEventListener("touchend", touchEnd);
  function touchStart(ev) {
   ev.preventDefault();
   var rect = ev.target.getBoundingClientRect();
   tapX = ev.touches[0].clientX-rect.left;
   tapY = ev.touches[0].clientY-rect.top;
   tapC = 1;
  }
  function touchMove(ev) {
   ev.preventDefault();
   var rect = ev.target.getBoundingClientRect();
   tapX = ev.touches[0].clientX-rect.left;
   tapY = ev.touches[0].clientY-rect.top;
  }
  function touchEnd(ev) { tapC = 0; }

  cvs.addEventListener("mousedown", mouseDown);
  cvs.addEventListener("mousemove", mouseMove);
  cvs.addEventListener("mouseup", mouseUp);
  function mouseDown(ev) {
   var rect = ev.target.getBoundingClientRect();
   tapX = ev.clientX-rect.left;
   tapY = ev.clientY-rect.top;
   tapC = 1;
  }
  function mouseMove(ev) {
   var rect = ev.target.getBoundingClientRect();
   tapX = ev.clientX-rect.left;
   tapY = ev.clientY-rect.top;
  }
  function mouseUp(ev) { tapC = 0; }

  //移動量
  var XP = [-16,  16, 16, -16];
  var YP = [-16, -16, 16,  16];
  var dir = 0;

  //レーザー用の変数
  var LASER_MAX = 50;
  var laX = [], laY = [];//座標
  var laXP = [], laYP = [];//方向(移動量)
  var laP = [];//発射後のカウント
  var lasNo = 0;
  var laserX, laserY;//発射する座標
  var laserP = 0;//発射用のフラグ

  //レーザーをクリア
  function clrLaser(n) {
   laXP[n] = 0;
   laYP[n] = 0;
  }

  //レーザーをセット(自機から撃ち出す弾をセットする処理)
  function setLaser() {
   laX[lasNo] = laserX;
   laY[lasNo] = laserY;
   laXP[lasNo] = XP[dir];
   laYP[lasNo] = YP[dir];
   laP[lasNo] = 0;
   lasNo ++; if(lasNo == LASER_MAX) lasNo = 0;
  }

  for(var i = 0; i < LASER_MAX; i++) clrLaser(i);

  //線を描く関数
  function line(x1, y1, x2, y2, col) {
   ctx.strokeStyle = col;
   ctx.beginPath();
   ctx.moveTo(x1, y1);
   ctx.lineTo(x2, y2);
   ctx.stroke();
  }

  //メイン処理
  var tmr = 0;
  function mainProc() {
   tmr ++;
   ctx.fillStyle = "black";
   ctx.fillRect(0, 0, 640, 640);

   //レーザー発射
   if(laserP == 0) {
    if(key == 32 || tapC > 0) {
     dir = (dir+1)%4;//レーザーの向き
     laserX = 16*parseInt(tapX/16);
     laserY = 16*parseInt(tapY/16);
     laserP = LASER_MAX;
    }
   }
   else {
    setLaser();
    laserP --;
   }

   //レーザーの描画と移動
   for(var i = 0; i < LASER_MAX; i++) {
    if(laXP[i] == 0 && laYP[i] == 0) continue;//発射されていない状態
    line(laX[i], laY[i], laX[i]+laXP[i], laY[i]+laYP[i], "cyan");//レーザーの線を描く
    laX[i] += laXP[i];//座標の計算
    laY[i] += laYP[i]
    if(laX[i] <= 0 || 640 <= laX[i]) laXP[i] = -laXP[i];//反射
    if(laY[i] <= 0 || 640 <= laY[i]) laYP[i] = -laYP[i];
    laP[i] ++;//発射後のカウント
    if(laP[i] > 100) clrLaser(i);
   }

   //タップ位置の表示
   ctx.fillStyle = "white";
   ctx.fillText(tmr+":"+tapC, tapX, tapY);
   setTimeout( mainProc, 1000/60 );//リアルタイム処理
  }

  mainProc();//処理スタート
  </script>
 </body>
</html>

←動作確認に戻る