手順 4: ゲームを再開するメソッドの追加
これまで説明してきたように、イベント ハンドラー メソッドは IDE で自動的にプログラムに追加することができますが、メソッドを独自に記述してコードに追加することもできます。プログラマの多くは、独自のメソッドを追加することに多くの時間を割いています。
[!メモ]
異なる場所で何度も実行する必要がある一連のステートメントがある場合は、独自のメソッドを記述すると便利です。プログラムを記述するときは、そのようなケースがよくあります。
たとえば、この迷路プログラムの作成では、プログラムの開始時に、マウス ポインターを自動的にパネルの左上隅に移動します。また、ユーザーがポインターを動かして壁に触れたときに、ポインターをスタート地点に移動する必要があります。ユーザーがポインターを迷路の外に動かしてもう一度戻したときも、ポインターをスタート地点に移動する必要があります。
ポインターをスタート地点に移動するには、3 行のコードを使用します。しかし、プログラム内の複数の異なる場所でそれらの同じ 3 行のコードを記述しなくて済めば、時間の節約になります。それらの 3 行のコードを、たとえば MoveToStart() という 1 つのメソッドに配置すると、コードの記述が 1 回で済みます。以降は、MoveToStart() メソッドを呼び出すだけで、いつでもポインターをパネルの左上隅に移動することができます。
このトピックのビデオ版については " " を参照してください。
ゲームを再開するメソッドを追加するには
ソリューション エクスプローラーで Form1.cs を右クリックし、メニューの [コードの表示] をクリックしてフォームのコードに移動します。
追加した finishLabel_MouseEnter() コントロールが表示されます。そのメソッドのすぐ下に、新しい MoveToStart() メソッドを追加します。
Private Sub MoveToStart() Dim startingPoint = Panel1.Location startingPoint.Offset(10, 10) Cursor.Position = PointToScreen(startingPoint) End Sub
private void MoveToStart() { Point startingPoint = panel1.Location; startingPoint.Offset(10, 10); Cursor.Position = PointToScreen(startingPoint); }
どのメソッドの上にも特殊な種類のコメントを追加できます。追加するときは、IDE を使用すると便利です。新しいメソッドの上の行にカーソルを置きます。Visual C# の場合は、スラッシュ記号を 3 つ (///) 追加します。Visual Basic の場合は、単一引用符を 3 つ (''') 追加します。IDE で自動的に次のテキストが入力されます。
''' <summary> ''' ''' </summary> ''' <remarks></remarks> Private Sub MoveToStart() Dim startingPoint = Panel1.Location startingPoint.Offset(10, 10) Cursor.Position = PointToScreen(startingPoint) End Sub
/// <summary> /// /// </summary> private void MoveToStart() { Point startingPoint = panel1.Location; startingPoint.Offset(10, 10); Cursor.Position = PointToScreen(startingPoint); }
2 つの summary タグの間の行に、次のコメントを入力します (Enter キーを押すと、プログラミング言語に応じて、3 つのスラッシュ記号 (///) または 3 つの単一引用符 (''') のどちらかが付いた新しい行が自動的に追加されるため、コメントを続けて入力することができます)。
''' <summary> ''' Move the pointer to a point 10 pixels down and to the right ''' of the starting point in the upper-left corner of the maze. ''' </summary>
/// <summary> /// Move the pointer to a point 10 pixels down and to the right /// of the starting point in the upper-left corner of the maze. /// </summary>
[!メモ]
ここでは、XML コメントを追加しました。前の手順で MessageBox という単語をポイントしたときにツールヒントに情報が表示されたのを思い出してください。IDE では、メソッドのツールヒントが自動的に表示されます。XML コメントに入力した内容は、IDE のツールヒントに加え、IntelliSense ウィンドウにも表示されます。メソッドが多いプログラムでは、これが役立つ場合があります。また、パネルの左上隅から下に 10 ピクセル、右に 10 ピクセルの位置に壁を配置する場合は、コードの (10, 10) の部分を変更できます。迷路に適したポインターのスタート地点が見つかるまで、数値を変更して試します。
メソッドを追加したら、そのメソッドを呼び出す必要があります。プログラムの開始と同時にポインターをスタート地点に移動するため、フォームを開始した直後にメソッドを呼び出す必要があります。Visual C# の場合は、フォームのコードで次のメソッドを探します。
public Form1() { InitializeComponent(); }
Visual Basic の場合は、フォームのコードにこのメソッドを追加します。finishLabel_MouseEnter メソッドの前の位置で、次のコードの入力を開始します。
Public Sub New()
Enter キーを押して次の行に移動すると、IntelliSense により、次のコードが表示され、メソッドが完成します。
Public Sub New() ' This call is required by Windows Forms Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. End Sub
これは、コンストラクターと呼ばれる特殊なメソッドです。フォームの作成時に 1 回実行されます。この時点では、InitializeComponent() というメソッドの呼び出しだけが行われます。このコンストラクターに、記述した新しい MoveToStart() メソッドを呼び出す行を追加します。その作業に進む前に、InitializeComponent() メソッドを呼び出した直後に MoveToStart() メソッドを呼び出すためにプログラムに何を追加する必要があるかを考えてみます。
[!メモ]
フォームのコンストラクターの InitializeComponent() メソッドは、IDE によって記述されたメソッドです。このメソッドによって、フォームにすべてのコントロールとコンポーネントが追加され、それらのプロパティが設定されます。フォームまたはそのコントロールのプロパティを変更するたびに、IDE でそのメソッドが変更されます。このメソッドを確認するには、ソリューション エクスプローラーから Form1.Designer.cs ファイルを開きます。InitializeComponent() メソッドの内容を編集する必要はありません。編集は、デザイン ビューで作成したフォームに基づいて IDE によって行われます。
InitializeComponent() メソッドの呼び出しのすぐ後に、MoveToStart() メソッドの呼び出しを追加します。フォーム コードは次のようになります。
Public Class Form1 Public Sub New() ' This call is required by Windows Forms Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. MoveToStart() End Sub Private Sub finishLabel_MouseEnter() Handles finishLabel.MouseEnter ' Show a congratulatory MessageBox, then close the form. MessageBox.Show("Congratulations!") Close() End Sub ''' <summary> ''' Move the mouse pointer to a point 10 pixels down and to the right ''' of the starting point in the upper-left corner of the maze. ''' </summary> ''' <remarks></remarks> Private Sub MoveToStart() Dim startingPoint = Panel1.Location startingPoint.Offset(10, 10) Cursor.Position = PointToScreen(startingPoint) End Sub End Class
namespace Maze { public partial class Form1 : Form { public Form1() { InitializeComponent(); MoveToStart(); } private void finishLabel_MouseEnter(object sender, EventArgs e) { // Show a congratulatory MessageBox, then close the form. MessageBox.Show("Congratulations!"); Close(); } /// <summary> /// Move the pointer to a point 10 pixels down and to the right /// of the starting point in the upper-left corner of the maze. /// </summary> private void MoveToStart() { Point startingPoint = panel1.Location; startingPoint.Offset(10, 10); Cursor.Position = PointToScreen(startingPoint); } } }
InitializeComponent() メソッドの下の MoveToStart() メソッドに注目してください。Visual C# でプログラミングを行っている場合は、その行の最後にセミコロン (;) を付けないと、プログラムがビルドされないことに注意してください。
プログラムを保存し、実行します。プログラムの開始と同時に、パネルの左上隅から少し右下の位置にポインターが自動的に移動します。
続行または確認するには
チュートリアルの次の手順に進むには、「手順 5: 各壁の MouseEnter イベント ハンドラーの追加」を参照してください。
チュートリアルの前の手順に戻るには、「手順 3: ゲームの終了」を参照してください。