WinFormsアプリで学ぶオブジェクト指向アプリの作り方(コンパクト版)
この資料では、新しくアプリケーションを作成する手順と、オブジェクト指向の考え方を用いてプログラムを組み立てる方法について解説します。従来の教科書では、C#の文法やクラスの作り方、犬や車といったオブジェクトの例が紹介されることが多いですが、実際に自分が作りたいものをゼロから組み立てる方法や考え方はあまり説明されていません。ここでは、その手順やコツを分かりやすく紹介します。
1. おさらい:手続型とオブジェクト指向
手続型の場合
手続型では、コードは上から順に実行されるように記述します。たとえば、次のようなコードでは、単に変数を宣言して処理を行います。
int player1Hp = 10;
int player2Hp = 20;
player1Hp--;
Console.WriteLine(player1Hp); // 出力: 9
オブジェクト指向の場合
オブジェクト指向では、実際に扱う「モノ(オブジェクト)」に注目します。以下は、プレイヤークラスを用いた例です。
Player player1 = new Player();
player1.Hp = 10;
Player player2 = new Player();
player1.Hp--;
Console.WriteLine(player1.Hp); // 出力: 9
class Player
{
public int Hp { get; set; }
}
オブジェクト指向では、各クラスはその役割に沿った処理だけを持つように設計し、全体の動きを整理しやすくなります。
2. オブジェクト指向のアプローチ
取り組み方
- 知識の暗記ではなく、実践的な作業を重ねる
C#の文法を覚えるだけではなく、実際に作りたいものに合わせてどのようにコードを組み立てるかが大切です。 - 作りたいものをまず決める
大手開発会社が手がけるような大規模なものではなく、シンプルな機能から始め、徐々に拡張していくのがポイントです。
3. 具体例:AppleCatchForm の作成
ゲームの概要
- ゲーム名: アップルキャッチ
- ゲーム内容:
落ちてくるリンゴをバスケットで受け止め、受け止めたリンゴの数が多いほど高得点に。
ただし、爆弾リンゴを受け取ると得点が減少します。 - 操作方法:
左右の矢印キーでバスケットを操作し、制限時間内にできるだけ多くリンゴを受け止めます。ウィンドウを閉じるとゲーム終了。
ゲーム開発のための基本要素
- 名詞抽出
ゲームに必要な要素をリストアップします。
例:赤いリンゴ、爆弾リンゴ、バスケット、背景、得点、残り時間など - 動詞句の抽出
名詞がどう動作するかを考え、処理(メソッド)を定義します。
例:落ちる、横に動く、得点を更新する、時間を減らす、ゲームオーバー判定 - 変数とメソッドの定義
必要なクラスや変数、そしてメソッドを順次作成していきます。
4. コード作成の流れとポイント
初期段階
まずは、必要なオブジェクトや変数を宣言します。
// 変数の宣言
Apple apple = new Apple();
PoisonApple poisonApple = new PoisonApple();
Basket basket = new Basket();
BackGround backGround = new BackGround();
int score;
int remainTime;
また、各処理の概要をコメントとしてまとめます。
// 概要のコメント
// 落ちてくる → Drop()
// 横に動く → Move()
// 得点が増減する → UpdateScore()
// 時間が減る → DecreaseTime()
// ゲームオーバー判定 → bool GameOver()
実際のコード作成例
りんごが落ちてくる処理を例に、Appleクラスを作成します。
// Appleクラス
internal class Apple : PictureBox
{
// コンストラクタで初期設定(例:背景色や画像の設定)
public Apple()
{
// ここで画像やその他の初期設定を行います
BackColor = System.Drawing.Color.Red;
}
// 落ちる処理
public void Drop()
{
// PictureBoxのY座標(Topプロパティ)を更新
Top += 10;
}
// イベントハンドラとして使用するためのラッパーメソッド
internal void DropEvent(object sender, EventArgs e)
{
Drop();
}
}
フォーム側のコード例
public Form1()
{
InitializeComponent();
// Appleインスタンスの生成
Apple apple = new Apple();
// Appleの親コンテナはフォームに設定
apple.Parent = this;
// タイマーの設定
Timer timer = new Timer();
timer.Interval = 1000;
timer.Tick += apple.DropEvent;
timer.Start();
}
apple.Parent = this;
の記述は、内部的には this.Controls.Add(apple);
と同等の動作をします。
つまり、Parent
プロパティに親コントロール(この場合はフォーム)を設定することで、そのコントロールが自動的に親コントロールの Controls
コレクションに追加され、フォーム上に表示されるようになります。
この仕組みにより、どちらの方法でも同じ結果が得られ、Apple コントロールはフォームの子コントロールとして扱われることになります。
実行すると、タイマーのTickイベントごとにりんごが下方向へ移動します。
5. おまけ:画像リソースの利用方法
実際のアプリケーションでは、PictureBoxに画像を設定することが一般的です。以下は、画像リソースの追加と設定方法の一例です。
- 画像の登録・設定
- ソリューションエクスプローラーから Resources.resx をダブルクリックし、リソースの追加メニューから画像ファイルを選択します。
- リソースから画像を取得する
apple.Image = Properties.Resources.fruit_apple;
より詳しい方法については、以下のリンクも参考にしてください。
6. リファクタリングのヒント
現時点では、りんごが落ちるタイミングをフォーム側で管理していますが、りんご自身に処理を持たせることも可能です。たとえば、Appleクラス内にタイマーを組み込み、自己管理させる設計も検討しましょう。こうすることで、各クラスが自らの役割に専念でき、後々の拡張や保守が容易になります。
7. 参考資料
- Winフォームアプリで、カウンター表示付きボタンコントロールの自作
詳細はこちら - Winフォームアプリで実行中にコントロールを移動させる
詳細はこちら - WinフォームアプリでPictureBoxの上にPictureBoxを重ねて背景を透過させる方法
詳細はこちら - Winフォームアプリのコントロールクラス(Control)
詳細はこちら
まとめ
今回の解説では、手続型プログラミングとの違いを踏まえながら、オブジェクト指向でアプリケーションを作成するための考え方と手順について説明しました。
- 作りたいものを明確にする
- 必要な名詞や動詞(オブジェクトや処理)を抽出する
- 実際に動作するコードを少しずつ組み上げる
初めから完璧を目指すのではなく、足りない要素に気づいたら再設計・追加するというプロセスを繰り返すことで、効率的に開発スキルが向上します。これを実践して、より拡張性の高い、保守しやすいアプリケーション作りにチャレンジしてください。
ディスカッション
コメント一覧
まだ、コメントがありません