« プログラミング講座(157) 垂直スクロールゲーム(解説その1) | トップページ | プログラミング講座(159) 射撃ゲーム »

2014/07/31

プログラミング講座(158) 垂直スクロールゲーム(解説その2)

垂直スクロールゲーム 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 < (size[obj[i]["type"]] + 16) / 2 Then
   cd = "True"   ' collision detected
   Goto break
  EndIf
  If y > 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 行弱の大きさになっていますが、最初に挑戦するグラフィカルなゲームとしては垂直スクロールゲームはお勧めです。

|

« プログラミング講座(157) 垂直スクロールゲーム(解説その1) | トップページ | プログラミング講座(159) 射撃ゲーム »

Small Basic」カテゴリの記事

ゲームプログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: プログラミング講座(158) 垂直スクロールゲーム(解説その2):

« プログラミング講座(157) 垂直スクロールゲーム(解説その1) | トップページ | プログラミング講座(159) 射撃ゲーム »