C# Windows Formsで接触判定を作る|BoundsとIntersectsWithをやさしく解説

広告

この題材では、コントロールの位置とサイズを表すBoundsプロパティ、矩形同士の重なりを調べるIntersectsWithメソッドをまとめて学べます。ここで学ぶ考え方は、Timerで動くオブジェクト同士の当たり判定にもそのまま応用できます。

1. Boundsでコントロールの位置とサイズを取得する

WinFormsのコントロール(Button、PictureBox など)は、それぞれBoundsというプロパティを持っています。Boundsは、そのコントロールの位置(X, Y)とサイズ(Width, Height)をまとめて表すRectangle(矩形)です。

Rectangle rect = pictureBox1.Bounds;

コントロールを動かすたびにBoundsの値も自動的に更新されるため、「今どこにあるか」を自分で計算し直す必要がありません。

2. IntersectsWithで重なりを調べる

2つの矩形が重なっているかどうかは、Rectangle.IntersectsWithメソッドで調べられます。

if (button1.Bounds.IntersectsWith(pictureBox1.Bounds))
{
    // 接触したときの処理
}

button1.BoundspictureBox1.Boundsという2つの矩形を比較し、少しでも重なっていればtrue、まったく重なっていなければfalseを返します。座標の大小関係を自分で計算する必要がなく、1行で判定できるのが利点です。

3. サンプル:2つのPictureBoxが重なったか判定する

ボタンをクリックするたびに一方のPictureBoxを動かし、もう一方と重なったらラベルに表示する、最小構成のサンプルです。

private void buttonMove_Click(object sender, EventArgs e)
{
    // pictureBox1 を少し右に動かす
    pictureBox1.Left += 20;

    // pictureBox2 と重なっているか判定
    if (pictureBox1.Bounds.IntersectsWith(pictureBox2.Bounds))
    {
        labelResult.Text = "接触しました!";
    }
    else
    {
        labelResult.Text = "まだ離れています";
    }
}

ボタンを押すたびにpictureBox1が右へ移動し、pictureBox2に重なった時点で判定がtrueに切り替わります。動きの仕組みそのものは単純ですが、これが接触判定の基本形です。

4. まとめ

今回は、WinFormsで接触判定を行う基本の仕組みを学びました。

  • コントロールの位置とサイズはBoundsプロパティ(Rectangle)で取得できる
  • 2つのBoundsが重なっているかはIntersectsWithメソッドで判定できる
  • 座標を自分で計算しなくても、1行で「重なっているか」がわかる

このBoundsIntersectsWithの組み合わせは、ボタンのような静止したコントロール同士だけでなく、Timerで動き続けるコントロール同士の判定にもそのまま使えます。次のステップとして、実際に動くオブジェクト同士の接触判定を体験してみたい人は、落ち物キャッチゲームの記事もあわせて読んでみてください。

訪問数 5 回, 今日の訪問数 6回

広告

C#

Posted by hidepon