垂直スクロールゲーム Turtle Dodger の解説を続けます。
キー入力イベントハンドラ
カメの動きは矢印キーを使うことにしました。マウス操作はちょっとやりずらいと考えました。イベントハンドラの中ではフラグを立てて入力されたキーを記憶するだけにしました。その後の処理は Game() のループの中で行います。また、フラグ moving が “True” の間(カメの移動が終わるまで)は次のキー入力を受け付けないようにしています。
Sub OnKeyDown
If Not[moving] Then
moving = “True”
key = GraphicsWindow.LastKey
EndIf
EndSub
タイマーイベントハンドラ
障害物が落ちてくる処理はタイマーを使いました。1秒間に24回(41ms毎に)スクロールするようにしています。また 500ms 毎に新しい障害物を発生させています。
Sub OnTick
If Not[scrolling] Then
scrolling = “True”
ems = Clock.ElapsedMilliseconds
If ems – lastems > 500 Then
AddObject()
lastems = ems
EndIf
ScrollObject()
scrolling = “False”
EndIf
If debug Then
x = Math.Floor(Turtle.X)
y = Math.Floor(Turtle.Y)
Shapes.SetText(pos, “(” + x + “,” + y + “)”)
Shapes.Move(cross1, x, y)
Shapes.Move(cross2, x, y)
EndIf
EndSub
オープニング
ゲームとは直接関係ないのですが、オープニング画面があったほうがゲームらしいので、タイトルとカメのイメージを表示させています。イメージファイルをインターネット上のどこかに置かないとブラウザ上 (smallbasic.com) での実行ができません。私のこれまでのゲームでは個人のサーバー上にイメージを置いていました。これだと、このサーバーが利用できなくなった時に、ゲームのイメージもアクセスできなくなってしまいます。個人のサーバーより長く利用できることを期待して TechNet Gallery にイメージを置いてみました。
このオープニングではカメを動かしていないので、GraphicsWindow.DrawImage() を使ったほうがよりシンプルだったかもしれません。
Sub Opening
url = “http://gallery.technet.microsoft.com/Turtle-PNG-Bitmap-for-582b449c/file/116666/1/Turtle.png”
bigTurtle = Shapes.AddImage(url)
Shapes.Move(bigTurtle, 180, 140)
GraphicsWindow.BrushColor = “White”
GraphicsWindow.FontName = “Trebuchet MS”
GraphicsWindow.FontSize = 50
x = (gw – 443) / 2
y = 40
GraphicsWindow.DrawText(x, y, title)
Program.Delay(3000)
GraphicsWindow.Clear()
EndSub
ゲーム開始直前の処理
オープニングのあと急にゲームが始まると慌ててしまうので、2秒ほど “Ready?” と表示するようにしました。
Sub Ready
GraphicsWindow.FontSize = 40
rdy = Shapes.AddText(“Ready?”)
x = (gw – 130) / 2
y = 100
Shapes.Move(rdy, x, y)
For opacity = 100 To 0 Step -10
Shapes.SetOpacity(rdy, opacity)
Program.Delay(200)
EndFor
Shapes.Remove(rdy)
EndSub
障害物のスクロール
すべての障害物を下に 5 ピクセル(ドット)だけ移動(スクロール)します。タイマーイベントハンドラの処理の中で呼び出していますが、Shapes に関する処理はイベント中でも問題なく動作します。
ウィンドウより下に移動した障害物はここで削除しています。削除しないとウィンドウの下に入って見えなくなった障害物の処理も継続し、処理がどんどん重くなってしまいます。
また、この処理の中でカメと障害物の衝突検出を行っています。お互いの中心間の距離で衝突を判定しています。
Sub ScrollObject
iMin = obj[“iMin”]
iMax = obj[“iMax”]
For i = iMin To iMax
x = obj[i][“x”]
y = obj[i][“y”] + 5
tx = Math.Floor(Turtle.X)
ty = Math.Floor(Turtle.Y)
d = Math.SquareRoot(Math.Power(tx – x, 2) + Math.Power(ty – y, 2))
If d gh Then
passed = passed + 1
Shapes.SetText(score, passed)
Shapes.Remove(obj[i][“obj”])
obj[i] = “”
obj[“iMin”] = i + 1
Else
Shapes.Move(obj[i][“obj”], x, y)
obj[i][“x”] = x
obj[i][“y”] = y
EndIf
EndFor
break:
EndSub
オープニング画面なども付けたので全体で 200 行弱の大きさになっていますが、最初に挑戦するグラフィカルなゲームとしては垂直スクロールゲームはお勧めです。