VisualBasic 2015 入門
27.突破2 Timer とマウスカーソル座標
今回は [ 突破ゲームを作ろう ] の続きです。
前回、絵を用意しました。
絵というよりはバーツですね。
これらを使って遊びを作っていきます。
Timer コンポーネントを使おう
シューティングやアクション、その他のジャンルでもゲームならば必要になってくるのが一定の間隔で処理する技術です。
今まで作ってきたもののように、ユーザーがボタンを押したら計算する、
または、結果を出力するタイプなら必要ありません。
一定の間隔で動かす方法はいくつかあるのですが、
簡単にあつかえる Timer を使ってみましょう。
コンポーネントの中にあるのでダブルクリックして組み込みます。
ボタンなどはコントロールというのに対し、Timer はコンポーネントです。
といっても、ざっくり言えばどちらも部品なんですけどね。
違いを簡単に言うと、ユーザーインターフェースを持ったコンポーネントがコントロールと
呼ばれてたりします。
それでは Timer の Tick イベントを用意します。
Timer1 を選択した状態で、プロパティからイベントの画面で Tick をダブルクリックします。
これで Timer1_Tick が作成されます。
ここでテストしてみます。
Timer1_Tick の中に Console.WriteLine ( Date.Now ) を追加します。
これは出力ウィンドウに日時を表示する命令です。
しかし、これだけで Timer1 は動いてくれません。
Enabled プロパティを True にする必要があります。
ついでに Interval プロパティを 1000 に変更しましょう。
実行すると出力ウィンドウに、1秒間隔で日時が表示されます。
Interval プロパティは Timer1_Tick を呼び出す間隔を設定しています。
単位はミリ秒(1000ミリ秒=1秒)です。
Interval プロパティについて注意があります。
単位はミリ秒なのですが、最小設定値は 15 ミリ秒ぐらいです。
それから精度が少し低いようです。
20 ミリ秒に設定すれば、必ず 20 ミリ秒ごとに動く、
という訳ではないようです。
この設定は目標値という感じで、設定された間隔で動くように努力するレベルなので、状況によっては設定値をオーバーしてしまうようです。
時間を計るような精確さが必要なときは、何か対策を考えましょう。
マウスのカーソル座標を取得してみよう
プレイヤーが操作する四角をマウスを使って動かすには、マウスのカーソル座標を取得する必要があります。
まずは座標を取得する方法を学んでいきましょう。
プログラムを次のように変更してください。
座標を格納するために Point 構造体の Cpos を用意しました。
ここに 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 (四角の幅)を引いた座標で
比較しています。