【発展・希望者向け】物理演算の基礎を学ぶ
この記事は 授業の範囲外 です。興味のある人・余力のある人が読む発展用の内容です。 無理に読む必要はありません。
目次
前提
- 01_座標の斜め移動 を読んでいること
- Timer と Paint で図形を動かす方法が分かること
物理演算とは
ゲームやアプリで「自然な動き」を再現するために、速度 と 加速度 を計算で扱うことです。
- 位置(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 を用意します。
フォームに配置するコントロール
| コントロール | 名前 |
|---|---|
| Timer | timer1 |
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回



ディスカッション
コメント一覧
まだ、コメントがありません