スポンサーリンク

【JavaScript 初学者向け】矩形と当たり判定【一行づつ解説】

javascript
「javaScriptでゲーム作りたいけど矩形っていうのがよく分からない!

という方向けの解説となります。

ゲームの当たり判定を考える際、矩形への理解があると作成が楽になります。
javaScriptの矩形・当たり判定の理解の助けになれば幸いです。

gddfgf筆者
・独学でゲームを作っている男
・javascriptが大好きな男

矩形 とは

矩形とは、すべての角が直角になっている図形のこと
⇩の四辺形・長方形などがそれにあたります。

そして「矩形の大きさ=当たり判定の大きさ」と言い換えることができます。

『このキャラの矩形(当たり判定)に攻撃が当たったらダメージを与えよう』

という考え方をするわけですね。
接触しているか、これは座標を使いますので、参考画像と一緒にみていきましょう。

    矩形×点 の当たり判定

    プレイヤーを緑の点、当たる範囲を青色の四角(幅:40/高さ:30)とした場合、このように表すことができます。

    • if(player.x >= 20 && player.x <= 60){ //x 20以上、60以下
    •   if(player.y >= 20 && player.y <= 50){ //y 20以上、50以下 
    •     //当たった時の処理
    •   }
    • }

     

    今回、プレイヤーである緑の点のx座標は20より小さいことが分かります。
    よって「当たってない」判定となります。

    if文を全て満たした時だけ「当たった時の処理」が始まるわけですね。
    「当たり判定をしたいものの座標×矩形の座標」を比較することで当たり判定をしていることになります。

    ここまで理解できれば大丈夫です。
    次で最後になります。

    矩形×矩形 の当たり判定

    プレイヤーを緑の四角(幅:30/高さ:20)当たる範囲を青色の四角(幅:40/高さ:30)とします。

    画像の通り、重なっていないので「当たってない判定」となります。
    では、「当たった判定」となる場合を考えてみましょう。大きく4パターンです。

    4つの頂点のうち、1つでも別の矩形の中に入る」なら当たっていると言えます。
    これをコードにした場合、少し複雑になるので順に解説します。

    矩形の頂点を座標に置き換えよう!

    繰り返しとなりますが4つの頂点のうち、1つでも別の矩形の中に入っていれば」当たった判定となります。

    つまり、それぞれの頂点を座標にすれば視覚的に理解しやすくなります。
    javascriptの場合、左上が支点になりますので以下のようになります。

    【横方向】
    player.x    = プレイヤーの左端
    player.x + 30 = プレイヤーの右端
    enemy.x     = 当たる範囲の左端
    enemy.x + 40  = 当たる範囲の右端
    ↑は横方向だけですが座標に置き換えることに成功しました!
    次は具体的な条件を考えてみましょう。

    座標がどのように重なるか考えよう!

    横方向から考えましょう。
    当たっていない場合をコードにするとこうなります。

    //当たってない場合//
    //プレイヤーの右端 < 当たる範囲の左端
    if(player.x + 30 < enemy.x){}

    これを反対にすれば「当たっている」と言えますのでこのようになります。

    //当たっている?場合//
    //プレイヤーの右端 > 当たる範囲の左端
    if(player.x + 30 > enemy.x){}

    しかし、これだけだと「当たる範囲の右端 < プレイヤーの左端」場合は満たしません。画像にするとこんな場合⇩

    プレイヤーの右端 > 当たる範囲の左端」が1つ目の条件とすれば
    当たる範囲の右端 > プレイヤーの左端」が2つ目の条件です。
    この2つを満たせばよいのでこうなります。

    //当たっている!場合//
    //プレイヤーの右端 > 当たる範囲の左端 かつ 当たる範囲の右端 > プレイヤーの左端
    if(player.x + 30 > enemy.x && enemy.x + 40 > player.x ){}

    ここまで横方向で、縦方向の座標一覧はこちらです。

    【縦方向】
    player.y    = プレイヤーの左端
    player.y + 20 = プレイヤーの左下の端
    enemy.y     = 当たる範囲の左端
    enemy.y + 30  = 当たる範囲の左下の端
    これを参考にすれば、このようなコードになります。
    //当たっている場合//
    //プレイヤーの右端 > 当たる範囲の左端 かつ 当たる範囲の右端 > プレイヤーの左端
    if(player.x + 30 > enemy.x && enemy.x + 40 > player.x){
     //プレイヤーの左端 < 当たる範囲の左下の端 かつ 当たる範囲の左端 < プレイヤーの左下の端
      if(player.y < enemy.y + 30 && enemy.y < player.y + 20){
       //当たった時の処理
     }
    }

    これで矩形と矩形が接触しているか、当たっているかの判定が可能です。

    矩形と当たり判定 のまとめ

    最後にポイントをおさらいしましょう。

    ①矩形とは単純に長方形or正方形
    ②矩形の頂点を座標におきかえる
    ③どのような場合に座標が重なるか考える

    ①の知識を元に②③を意識することで、当たり判定の考え方が明確になります。
    当記事がjavascriptでゲームを作ったりする時の理解の助けになれば幸いです。

    また、初学者向けのゲームの作り方と一行づつのコード解説をしております。
    【JavaScript】 15パズルの作り方を初学者向けに1行づつ解説![前編]【ゲーム】

    ゲームを作るのはとても勉強になりますし、モチベーション維持にもつながります。
    興味があればご活用ください。

    javascript
    スポンサーリンク
    笑いを愛する