Visual C# 2017 入門
27.突破2 Timer とマウスカーソル座標
今回は [ 突破ゲームを作ろう ] の続きです。
前回、絵を用意しました。
絵というよりはバーツですね。
これらを使って遊びを作っていきます。
Timer コンポーネントを使おう
シューティングやアクション、その他のジャンルでもゲームならば必要になってくるのが、一定の間隔で処理する技術です。
今まで作ってきたもののように、ユーザーがボタンを押したら計算する、
または、結果を出力するタイプなら必要ありません。
一定の間隔で動かす方法はいくつかあるのですが、
簡単にあつかえる Timer を使ってみましょう。
コンポーネントの中にあるのでダブルクリックして組み込みます。
ボタンなどはコントロールというのに対し、Timer はコンポーネントです。
といっても、ざっくり言えばどちらも部品なんですけどね。
違いを簡単に言うと、ユーザーインターフェースを持ったコンポーネントが
コントロールと呼ばれてたりします。
それでは Timer の Tick イベントを用意します。
timer1 を選択した状態で、プロパティからイベントの画面で Tick をダブルクリックします。
これで timer1_Tick が作成されます。
ここでテストしてみます。
timer1_Tick の中に Console.WriteLine ( DateTime.Now ) を追加します。
これは出力ウィンドウに日時を表示する命令です。
しかし、これだけで timer1 は動いてくれません。
Enabled プロパティを True にする必要があります。
ついでに Interval プロパティを 1000 に変更しましょう。
実行すると出力ウィンドウに、1秒間隔で日時が表示されます。
Interval プロパティは timer1_Tick を呼び出す間隔を設定しています。
単位はミリ秒(1000ミリ秒=1秒)です。
Interval プロパティについて注意があります。
単位はミリ秒なのですが、最小設定値は 15 ミリ秒ぐらいです。
それから精度が少し低いようです。
20 ミリ秒に設定すれば、必ず 20 ミリ秒ごとに動く、
という訳ではないようです。
この設定は目標値という感じで、設定された間隔で動くように努力するレベルなので、状況によっては設定値をオーバーしてしまうようです。
時間を計るような精確さが必要なときは、別の対策を考えましょう。
マウスのカーソル座標を取得してみよう
プレイヤーが操作する四角をマウスを使って動かすには、マウスのカーソル座標を取得する必要があります。
まずは座標を取得する方法を学んでいきましょう。
プログラムを次のように変更してください。
座標を格納するために Point 構造体の Cpos を用意しました。(15行目)
ここに PointToClient ( Cursor.Position ) を使ってマウスカーソル座標を
取得しています。
Cursor.Position でカーソルの画面座標を取得して
PointToClient を使って画面座標をクライアント座標(Form1の座標)に変換しています。
ちょっと何を言っているのか分からなくなってきたので実行して
カーソルをゆっくりと動かしてみてください。
出力ウィンドウに表示される座標と、カーソルの位置を見比べてみましょう。
それとなく座標の関係が感じ取れると思います。
画面座標とクライアント座標については、次のようになっています。
画面座標は、画面の左上を基点とした座標のことです。
クライアント座標は、この場合 Form1 の左上を基点とした座標となります。
ゲームなどでマウスカーソルの座標を使いたいときには、
クライアント座標を使うことになります。
それから構造体についてですが、くわしい話はここではしません。
変数の親分みたいなもので、複数の変数をまとめたものと思ってください。
今回使用した Point 構造体は、座標XとYをまとめて管理できるように
用意されたものです。
四角をマウスで動かしてみよう
みどり色の四角 Player をマウスで操作してみましょう。
とても簡単にできます。
Player.Location にマウスの座標を代入するだけです。
それから timer1 の Interval プロパティを 33 に変更してください。
これで1秒間におおよそ 30 回くらい timer1_Tick が呼ばれることになります。
(環境によってもっと少なくなります)
実行してみましょう。
マウスカーソルを動かすと、四角も一緒に付いてきます。
このゲームで四角を操作するとき、動きを左右に限定します。
つまりx座標のみ操作するということです。
プログラムを変更しましょう。
x座標のみ設定したい場合には Left プロパティを使います。
実行してマウスを左右に動かし、一緒に動くことを確認しましょう。
四角をフォーム内にずっと表示しよう
四角をマウスで操作できるようになりました。しかし、問題があります。
カーソルをフォーム外へ移動すると、四角も移動して消えてしまうのです。
プレイヤーが操作する自機(四角)が見えなくなることは、ゲームでは
やられたときぐらいです。
カーソルをフォーム外へ移動しても、四角はフォーム内にとどまるように変更します。
変更したら、実行して四角がとどまることを確認しましょう。
フォームの左端は座標0、右端は Width です。
ここでの Width とは Form1 の幅となります。
四角が見えるようにするためには、この範囲内に収める必要があります。
ただし、四角にも幅があることを忘れてはいけません。
Player.width (四角の幅)を引いた座標で比較します。(29行目)