3_ball / Step 8 / Code

2025.12.08 / バグがありました。バグと対策の解説はクリックしてください。

/*==========================================
  ボールを動かす
===========================================*/

// ボールの数を定義
const ballCount = 10;
const ballSpeed = 5; //  ★★★

// 変数宣言
const balls = [];

// 画面切替用
const playScreen = document.querySelector("#play");

// ボールとマリモ配置用
const ballDiv = document.querySelector("#ball");

// 画面サイズの取得
const maxX = playScreen.clientWidth;
const maxY = playScreen.clientHeight;
console.log(maxX, maxY);


// ボールを作成する関数
function makeBalls() {

  // ボールをfor文で生成
  for(let i = 0; i < ballCount; i++) {
    // ボール[i]を生成
    balls[i] = document.createElement("img");
    balls[i].src = "img/ball.png";
    balls[i].style.position = "absolute";
    balls[i].style.transform = "translate(-50%,-50%)";
    balls[i].style.width = "40px";
    balls[i].style.height = "40px";

    //ボール[i]を画面に追加
    ballDiv.appendChild(balls[i]);

    // ボール[i]の速度をランダムに設定(-5 〜 +5)  ★★★
    let s = ballSpeed; // 最大速度
    balls[i].vX = Math.random() * s * 2 - s;
    balls[i].vY = Math.random() * s * 2 - s;

    // ボール[i]の座標をランダムに設定  ★★★
    let r = balls[i].offsetWidth / 2; // 半径
    balls[i].posX = Math.random() * (maxX - r * 2 - s * 2) + r + s;
    balls[i].posY = Math.random() * (maxY - r * 2 - s * 2) + r + s;

  }

}

// ボールを動かす関数
function moveBalls() {
  // ボールをfor文で移動
  for(let i = 0; i < ballCount; i++) {
    // x座標を vX 増やす
    balls[i].posX = balls[i].posX + balls[i].vX;
    balls[i].posY = balls[i].posY + balls[i].vY;

    // 画面の左右の端で跳ね返る
    if (balls[i].posX > maxX - balls[i].offsetWidth / 2) {
      balls[i].posX = maxX - balls[i].offsetWidth / 2; //  ★★
      balls[i].vX = -balls[i].vX;
    }
    if (balls[i].posX < balls[i].offsetWidth / 2) {
      balls[i].posX = balls[i].offsetWidth / 2; //  ★★
      balls[i].vX = -balls[i].vX;
    }

    // 画面の上下の端で跳ね返る
    if (balls[i].posY > maxY - balls[i].offsetHeight / 2) {
      balls[i].posY = maxY - balls[i].offsetHeight / 2; //  ★★
      balls[i].vY = -balls[i].vY;
    }
    if (balls[i].posY < balls[i].offsetHeight / 2) {
      balls[i].posY = balls[i].offsetHeight / 2; //  ★★
      balls[i].vY = -balls[i].vY;
    }

    // 画面に反映
    balls[i].style.left = balls[i].posX + "px";
    balls[i].style.top = balls[i].posY + "px";
  }
}


function loop() {
  moveBalls();
}

// ボールを生成
makeBalls();

// ゲームループ開始
setInterval(loop, 20);

修正点

解説は、次回の講義に行います。
・ボールの初期位置が画面外に出るバグの修正: //★★★
・ボールが跳ね返った後に画面外に出るバグ: //★★