Visual Basic 2019 入門
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 を用意しました。(2行目)
ここに PointToClient ( Cursor.Position ) を使ってマウスカーソル座標を取得しています。
Cursor.Position でカーソルの画面座標を取得して
PointToClient を使ってクライアント座標(Form1の座標)に変換しています。
ちょっと何を言っているのか分からなくなってきたので実行して
カーソルをゆっくりと動かしてみてください。
出力ウィンドウに表示される座標と、カーソルの位置を見比べてみましょう。
それとなく座標の関係が感じ取れると思います。
画面座標とクライアント座標については、下図のようになっています。
画面座標は、画面の左上を基点とした座標のことです。
クライアント座標は、この場合 Form1 の左上を基点とした座標となります。
ゲームなどでマウスカーソルの座標を使いたいときには、
クライアント座標を使うことになります。
それから構造体についてですが、くわしい話はここではしません。
変数の親分みたいなもので、複数の変数をまとめたものと思ってください。
今回使用した Point 構造体は、座標XとYをまとめて管理できるように用意されたものです。
四角をマウスで動かしてみよう
みどり色の四角 Player をマウスで操作してみましょう。
とても簡単にできます。
Player.Location にマウスの座標を代入するだけです。
それから Timer1 の Interval プロパティを 33 に変更してください。
これで1秒間におおよそ 30 回くらい Timer1_Tick が呼ばれることになります。
(環境によってもっと少なくなります)
実行してみましょう。
マウスカーソルを動かすと、四角も一緒に付いてきます。
このゲームで四角を操作するとき、動きを左右に限定します。
つまりx座標のみ操作するということです。
プログラムを変更しましょう。
x座標のみ設定したい場合には Left プロパティを使います。
また、Cpos.X で x 座標のみ取得します。
実行してマウスを左右に動かし、一緒に動くことを確認しましょう。
四角をフォーム内にずっと表示しよう
四角をマウスで操作できるようになりましたが、問題があります。
カーソルをフォーム外へ移動すると、四角も移動して消えてしまいます。
プレイヤーが操作する自機(四角)が見えなくなることは、ゲームではやられたときぐらいです。
カーソルをフォーム外へ移動しても、四角はフォーム内にとどまるように変更します。
変更したら、実行して四角がとどまることを確認しましょう。
x 座標について
フォームの左端は 0 、右端は ClientSize.Width です。
この値は Form1 の幅とは異なります。
表示できる範囲(ClientSize.Width)は少し狭くなります。
四角が見えるようにするためには、この範囲内に収める必要があります。
ただし、四角にも幅があることを忘れてはいけません。
Player.width (四角の幅)を引いた座標で比較します。(9行目)