【発展・希望者向け】物理演算の基礎を学ぶ

広告

この記事は 授業の範囲外 です。興味のある人・余力のある人が読む発展用の内容です。 無理に読む必要はありません。


前提


物理演算とは

ゲームやアプリで「自然な動き」を再現するために、速度 と 加速度 を計算で扱うことです。

  • 位置(x, y):今どこにいるか
  • 速度(velocity):1回の更新でどれだけ動くか
  • 加速度(gravity など):速度がどれだけ変わるか

重力の考え方

ボールを落とすと、だんだん速く 落ちていきます。

  • 最初:速度 0
  • 1秒後:少し速い
  • 2秒後:もっと速い

これをプログラムで表すと:

毎回の更新で:
  velocity += gravity   (速度が増える = 加速)
  y += velocity         (位置が変わる)

gravity は「1回の更新で速度がどれだけ増えるか」を表す数値です。


跳ね返りの考え方

床に当たったら、速度の向きを反転 させます。

velocity = -velocity

さらに、現実では跳ね返るたびに少し遅くなるので、減衰 を入れます。

velocity = -velocity * 0.8

0.8 を掛けることで、跳ね返り後に少し遅くなります。


今日作るもの

ボールが 重力で落下 し、床に当たると 跳ね返る プログラムです。

┌─────────────────┐
│                 │
│       ●         │  ← 落ちてくる
│                 │
├─────────────────┤  ← 床に当たると跳ね返る
│                 │
└─────────────────┘

ソリューションとプロジェクトを作る

  • テンプレート: Windows Forms アプリ (.NET Framework)
  • プロジェクト名: PhysicsBall

01 の斜め移動と同じ要領で、Timer と Form の Paint を用意します。


フォームに配置するコントロール

コントロール名前
Timertimer1

Interval = 30


完成コード

using System;
using System.Drawing;
using System.Windows.Forms;

namespace PhysicsBall
{
    public partial class Form1 : Form
    {
        float x = 100;
        float y = 50;
        float velocityY = 0;   // 縦方向の速度(下が正)
        float gravity = 0.5f;  // 1回の更新で速度が増える量

        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // 重力:速度が増える
            velocityY += gravity;

            // 位置を更新
            y += velocityY;

            // 床に当たったら跳ね返る(減衰あり)
            float floorY = this.ClientSize.Height - 30;
            if (y + 20 > floorY)
            {
                y = floorY - 20;
                velocityY = -velocityY * 0.8f;  // 反転して少し遅く
            }

            this.Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // 床を描く
            float floorY = this.ClientSize.Height - 30;
            g.DrawLine(Pens.Gray, 0, floorY, this.ClientSize.Width, floorY);

            // ボールを描く
            g.FillEllipse(Brushes.Red, x, y, 20, 20);
        }
    }
}

プログラムの流れ

タイマー開始
    ↓
velocityY += gravity(重力で加速)
    ↓
y += velocityY(落下)
    ↓
床に当たった? → y を補正、velocityY を反転×0.8
    ↓
Invalidate() で再描画

重要ポイント

物理演算の基本は「速度を更新してから、位置を更新する」 です。

  • velocity += gravity … 加速度で速度が変わる
  • y += velocity … 速度で位置が変わる
  • 跳ね返りは velocity = -velocity * 0.8 で減衰させる

発展アイデア

  • 横方向の速度(velocityX)を足して、斜めに投げたボールにする
  • 床の高さを変えて、複数の段を作る
  • キー入力で上向きの初速度を与えて、ジャンプさせる
訪問数 3 回, 今日の訪問数 3回

広告

C#

Posted by hidepon