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

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

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

Visual C# 2017 入門

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

 

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

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

 

 

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

シューティングやアクション、その他のジャンルでもゲームならば必要になってくるのが
一定の間隔で処理する技術です。
今まで作ってきたもののように、ユーザーがボタンを押したら計算する、
または、結果を出力するタイプなら必要ありません。

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

 

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

 

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

 

 

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

 

timer Tick イベント

 

 

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

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


timer を有効にする

 

 

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

 

timer 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行目)

 

フォームの幅を使って範囲を限定するために