初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Visual Basic 2019 入門

27.突破2 Timer とマウスカーソル座標

 

今回は [ 突破ゲームを作ろう ] の続きです。

前回、絵を用意しました。
絵というよりはバーツですね。
これらを使って遊びを作っていきます。

 

 

Timer コンポーネントを使おう

シューティングやアクション、その他のジャンルでもゲームならば必要になってくるのが、一定の間隔で処理する技術です。

これまで作ってきたもののように、ユーザーがボタンを押したら計算する、または、結果を出力するタイプなら必要ありません。

 

一定の間隔で動かす方法はいくつかあるのですが、
簡単にあつかえる Timer を使ってみましょう。
コンポーネントの中にあるのでダブルクリックして組み込みます。

 

Timerコンポーネントを使う

 

ボタンなどはコントロールというのに対し、Timer はコンポーネントです。
といっても、ざっくり言えばどちらも部品なんですけどね。
違いを簡単に言うと、ユーザーインターフェースを持ったコンポーネントがコントロールと呼ばれてたりします。

 

 

それでは Timer の Tick イベントを用意します。
Timer1 を選択した状態で、プロパティからイベントの画面で Tick をダブルクリックします。
これで Timer1_Tick が作成されます。

timerのTickイベント

 

 

ここでテストしてみます。
Timer1_Tick の中に Console.WriteLine ( Date.Now ) を追加します。
これは出力ウィンドウに日時を表示する命令です。

しかし、これだけで Timer1 は動いてくれません。
Enabled プロパティを True にする必要があります。
ついでに Interval プロパティを 1000 に変更しましょう。

Tickイベントを動かすための設定

 

 

実行すると出力ウィンドウに、1秒間隔で日時が表示されます。
Interval プロパティは Timer1_Tick を呼び出す間隔を設定しています
単位はミリ秒(1000ミリ秒=1秒)です。

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座標のみ操作する

 

 

四角をフォーム内にずっと表示しよう

四角をマウスで操作できるようになりましたが、問題があります。
カーソルをフォーム外へ移動すると、四角も移動して消えてしまいます。

 

四角が画面外へ出てしまう

 

 

プレイヤーが操作する自機(四角)が見えなくなることは、ゲームではやられたときぐらいです。

カーソルをフォーム外へ移動しても、四角はフォーム内にとどまるように変更します。
変更したら、実行して四角がとどまることを確認しましょう。

自機が画面内にとどまるように変更する

 

 

x 座標について
フォームの左端は 0 、右端は ClientSize.Width です。
この値は Form1 のとは異なります。
表示できる範囲(ClientSize.Width)は少し狭くなります。

四角が見えるようにするためには、この範囲内に収める必要があります。
ただし、四角にも幅があることを忘れてはいけません。
Player.width (四角の幅)を引いた座標で比較します。(9行目)

 

自機の幅も考慮する