前回は、Small Basic を使って簡単なアニメーションを実現する方法を紹介しました。 今回はそれに追加するような形で、キーボードのカーソルキーなどを使ってキャラクタを動かす処理を作ってみたいと思います。 前回のテクニックと今回のものを活用していただければ、とりあえず自作ゲームを作ることができるようになると思います。 それを実現するにはまず、「現在キーボードのどのキーが押されているのか」を知る必要があります。 これを実現するには、KeyDownイベントというイベントを使います。 イベントとは、プログラムを実行している最中に何か特別なこと、たとえば「マウスの左ボタンがクリックされた」とか「あらかじめセットしてあったタイマーが設定時間になった」などのことが発生したときに、発生するものです。 イベントが発生すると、それまで淡々と実行されていたプログラムが途中であっても一旦中断し、別の処理(サブルーチン)に移行します。その別の処理が終わるとまた、先ほど中断したところから復帰します。 例えば、キーボードの右カーソルキーを押したら自分のキャラクタが右へ移動する、という処理を行いたいとします。 この場合、プログラムは2つのルーチン(※ルーチン=部分)に分かれます。 一つはメインルーチンと呼ばれる部分で、通常の処理はすべてここに書きます。 もう一つ、キーが何か押されたときに実行する別処理、サブルーチンが必要です。このサブルーチンの中で、「押されたキーが何なのか判定し、もしも右カーソルキーだったならば自分のキャラクタを右へ移動する」という処理を行うことになります。ここでは便宜上、このサブルーチンの名前を MyKeyDown という名前にしましょう。 そして、メインルーチンの一番先頭部分に、「もしも何かキーが押されたならば、 一時的にMyKeyDownに飛びなさい」というような宣言をする必要があります。
それでは早速、段階を踏んで作成してみましょう。 最初のプログラムは、「現在押されているキーが何なのか、画面左上に表示する」というも��です。 このプログラムを通して、イベントとサブルーチンの扱い方を習得していただければと思います。 今回は、メインルーチンは一行だけです。 GraphicsWindowクラスの中のKeyDownイベントハンドラに対して、自分で作ったサブルーチンである MyKeyDown を設定しています。 これにより、「もしも途中で何かキーが押されたら、MyKeyDownへ一時的にジャンプする」ということを宣言することができます。 そしてサブルーチンである MyKeyDown の方ですが、最初に画面をクリアにし( GraphicsWindow.Clear )、次の行で現在押されているキーの文字( GraphicsWindow.LastKey )を変数aに入れて、最後にそれを表示しています。( GraphicsWindow.DrawText ) なお、サブルーチンの処理が終了すると、呼び出し元に返ります。 ここではメインルーチンに戻ることになります。
次は、左右カーソルキーを使ってキャラクタを動かす処理をしてみましょう。 プログラムは以下のようになります。
自分のキャラクタとして横幅80×縦幅30の四角形を、オブジェクトjibunに設定し( jibun = Shapes.AddRectangle(80,30) )、自分の座標を示す変数として jibun_x と jibun_y を用意します。 自分のY座標は、画面の一番下にするために、画面の縦幅から自分のキャラクタの縦幅を引いた値を設定しています。( jibun_y = GraphicsWindow.Height - 30 ) サブルーチンの方ですが、右カーソルキーが押されると、GraphicsWindow.LastKey の値が "Right" になり、左カーソルキーが押されると "Left" になりますので、それらのキーが押された場合には jibun_x の値を増減するようにしています。なお、1ピクセルずつ増減させてももちろんいいのですが、遅すぎるのでここでは5ピクセルにしました。 最後に自分のキャラクタを表示させるために Shapes.Move() を使用しています。 それでは今度は、前回作成したボールのアニメーションのプログラムと、今作成した自分キャラクタを表示するプログラムを合成してみましょう。 太字になっている部分が、前回作成した部分です。 ' 変数・オブジェクトの準備x=0y=0migihashi = GraphicsWindow.Widthball = Shapes.AddEllipse(30,30)GraphicsWindow.KeyDown = MyKeyDown
' 自分の準備jibun = Shapes.AddRectangle(80,30)jibun_x = 0jibun_y = GraphicsWindow.Height - 30Shapes.Move(jibun,jibun_x,jibun_y)
' 実際のアニメーションFor x=0 To migihashi Shapes.Move(ball, x, y ) y=y+1 Program.Delay(10)EndFor'---------------- メインルーチンはここまで ----------------------------------------
' キー判定と自分の描写Sub MyKeyDown a = GraphicsWindow.LastKey If(a = "Right") Then jibun_x = jibun_x + 5 EndIf If(a = "Left") Then jibun_x = jibun_x - 5 EndIf Shapes.Move(jibun, jibun_x, jibun_y)EndSub
単純に合成しただけですが、それなりにゲームらしくなってきたと思います。
せっかくですから、当たり判定をつけて、一応ゲームとして形にしましょう。 基本的には先のプログラムのメインルーチンの最後の部分に、自分がボールをキャッチできたかどうかを判定する処理を加えるだけです。 ボールがキャッチできているかどうかを判定するには、アニメーションの終了後に、ボールのX座標が、自分のキャラクタの左端のX座標よりも大きく、右端のX座標よりも小さければOK、というように判定しましょう。 自分の左端のX座標 < ボールの中央のX座標 < 自分の右端のX座標 そして、自分の左端のX座標は jibun_x、 ボールの中央のX座標はボールの横幅が30ですから X+15、 自分の右端のX座標は自分の横幅が80ですから jibun_x+80 です。 この中に入っていたら GraphicsWindow.ShowMessage() を使って当たりのメッセージを表示し、入っていなければはずれのメッセージを出します。
' キャッチできたか判定If(jibun_x<x+15 and x+15<jibun_x+80)Then GraphicsWindow.ShowMessage("キャッチ成功!", "End")Else GraphicsWindow.ShowMessage("残念。。", "End")Endif
また、実際のアニメーションの部分ですが、今のままですとForループを使ってボールのX座標が画面の右端に来るまで繰り返すようにしています。つまり、ボールが画面の一番下まで来ても終了せず、X座標の方が端に車で続いてしまいます。そこで、Y座標が画面の下端まで来たらこのForループを脱出するように、以下の太字のような変更を加えます。 Goto文を使用すると、プログラム中の任意の場所へ強制的に移動することができます。
'実際のアニメーションFor x=0 To migihashi Shapes.Move(ball, x, y ) y=y+1 If(y > GraphicsWindow.Height -30) Then Goto Hantei EndIf Program.Delay(10)EndFor
Hantei:
今回の最後のプログラムは、以下の場所に発行しました。http://smallbasic.com/program/?DTR162
こちらのプログラムに含まれている方法を活用すれば、様々なプログラムが作れると思います。ぜひご活用ください。 次回の Small Basic の記事ではまた違った観点から Small Basic のプログラミングを紹介したいと思います。 よろしくお願いします。