<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > だるまさんがころんだ
  



だるまさんがころんだ 後半戦

では、続きです。

こんなふうに、ちょっとビジュアル方面を工夫してみようと思います。
え?なんかダサい?当たり前です。ゲーム作るためのソフトじゃないんだから。
あくまでも、VBAのコード書く練習ですよ。トレーニング。

「人の形」の画像と、だるまっぽい画像を用意します。
画像の形式はなんでもいいんですけど・・・PNGとか、GIFとか、JPEGとか。GIFを扱うためにはPhotoEditorかなにかインストールされてる必要があるんですけど、MS-Officeをワンセットインストールしてらっしゃれば、GIFも扱えると思います(MS-WordをインストールすればGIFも扱えるようになったと思うので)。

だるまは、ちょっと工夫しようと思ってるんで、2種類用意しました。

    

こんな感じです。↑使いたければ使ってください。あるいは、もっとカッコイイのを用意してください。
イメージとしてフォームに貼り付けると、「透過」ということができないと思うんで、あらかじめ、フォームの色と同じような色の背景色にしておくといいでしょう。あるいは、背景の色とかあんまり気にしないことです。練習なんだし。



フォームのデザインビューで、ツールボックスから「イメージ」のボタンをクリックして、フォーム内のどこかをクリックします。

すると、多分、フォーム内に置きたい画像のファイル名を指定するダイアログボックスが出てくると思うんで、ファイルを指定します。
とりあえず、3つとも適当に配置して、↓大きさとかを整えます。

イメージのコントロールにもそれぞれ名前がついてるはずですので、プロパティを見て名前を確認しておきましょう。
わたしのは、「イメージ9」が人の形の図、「イメージ10」が右向きのだるま、「イメージ12」が左向きのだるまです。
「イメージ12」は、普段は不可視状態で、生き残りがいたときだけ表示させるようにします。

ここがちょっとしたミソなんですけども・・・。
だるまの絵、2つをぴったり重ね合わせます↓

重ねといて、片方を可視、片方を不可視にしとけば、ちょっとした「アニメーション」みたいな動作を作ることもできなくはないんですよ。
といっても、ゲームを作るソフトじゃないので、そんなにカッコイイのは作れないですけどね。
そこんとこは割り切ってください。

で、だいたい、ですけれども、人とだるまの間は、10cmほど開けました。

だいたい、1cmを2メートルとみなしています。
っていうか適当だけど。
でも、人の絵が少しずつ移動していく関係上、これらの「比率」は把握しておかないといけないですよね。



人とだるまの下に引いてる直線は、文字通り「直線」です。ツールボックスに「直線」というボタンがあるので、これクリックして、フォーム内に線を引いてみてください。

あとは、「人」の画像を、少しずつ右に動かすようにしてやろうと思うわけです。
イメージのプロパティに、「左位置」っていうのがあって、ここに何かしら値を代入してやれば、イメージの位置が少しずつずれて、人が移動しているみたいに見える(そんなたいそうには見えませんけども)

ところがです。
これ、プロパティ内では cm で書かれてますけど、どうも、コードで代入する際って、cm じゃないみたいなんですよね。
単位はなんだろう。。。。とにかく、「左端から1cm」あけたければ 560 を代入することでなんとかなりそうです。
「左端から0.5cm」くらいの位置にイメージを配置したい場合は、 280 くらいを代入しとくといいみたいです。
けっこう微調整が難しいです・・・。
今、どれくらいの距離が残されているのか、という値を利用して、イメージの左位置を少しずつずらすような処理を書き加えてみました。


Option Compare Database  '---各プロシージャで共通して使う変数を宣言
Dim Sanka As Long '-----参加人数
Dim Nokori As Long '-----今残ってる人の人数
Dim Datsuraku As Long '-----今回動いちゃった人
Dim Kyori As Integer '-----鬼との距離
Dim Idou As Integer '-----今回移動できた距離
Dim kyori2 As Variant '-----距離をメートル表示したいかも

Private Sub Form_Load()
Sanka = 100000000  '---今回参加する人数。1億人。
Nokori = Sanka  '---最初は、まだ誰も脱落してないので参加者全員が残っている。
Kyori = 2000  '---単位はcm。20メートルってところで。
'-----初期値をテキストボックスへ
Me!テキスト1 = Nokori & "人の人が参加します。"
Me!テキスト3 = "鬼までの距離" & Int(Kyori / 100) & "メートル"
Me!テキスト5 = ""
Me!テキスト6 = ""
Me!イメージ9.Left = 280 '---280くらいにしとくと、0.5cmくらいになるみたい
'----だるまの絵、右向いてるやつを可視、左向いてるやつは不可視。
Me!イメージ10.Visible = True
Me!イメージ12.Visible = False

'----コマンドボタンを使えるようにしたりしなかったり
Me!コマンド0.Enabled = True
Me!コマンド4.Enabled = False
End Sub

Private Sub コマンド0_Click()
'-----動いちゃったりして鬼に見つかっちゃった人の数を毎回はじき出す
Datsuraku = Int((Nokori * Rnd) + 1)
'-----「だるまさんがころんだ」の間に走れる距離といったらだいたい2メートルちょっとが限界かな
Idou = Int((210 * Rnd) + 1)
'-----残りの人数と、残りの距離を計算
Nokori = Nokori - Datsuraku
Kyori = Kyori - Idou
kyori2 = Kyori / 100
If Nokori <= 0 And Kyori > 0 Then '----残り人数が0人になった場合で、まだ距離がある場合
  Me!テキスト1 = "残念!全員捕まってしまいました。"
  Me!テキスト3 = "惜しい!あと" & kyori2 & "メートルだったのに!"
  Me!テキスト5 = ""
  Me!テキスト6 = ""
  Me!コマンド4.Enabled = True
  DoCmd.GoToControl "コマンド4"
  Me!コマンド0.Enabled = False
ElseIf Nokori > 0 And Kyori > 0 Then '----まだ残ってる人がいて、距離もある場合
  Me!テキスト1 = "残りあと " & Nokori & "人"
  Me!テキスト3 = "鬼までの距離 あと" & kyori2 & "メートル!"
   Select Case Kyori
     Case 50 To 100
       Me!テキスト6 = "残り1メートルをきった!落ち着いて!"
     Case 1 To 49
       Me!テキスト6 = "あともうちょっと!がんばれ!"
   End Select
   Select Case Nokori
     Case 20 To 50
       Me!テキスト5 = "残り人数少なくなってきたぞ!がんばれ!"
     Case 5 To 19
       Me!テキスト5 = "慎重に!落ち着いて!"
     End Select
'------↓人の形の絵を、少しずつ右に移動させる↓これが非常に難しい!!
  Me!イメージ9.Left = 280 + (((2000 - Kyori) / 200) * 560)
ElseIf Nokori > 0 And Kyori <= 0 Then '----まだ残っている人がいて、距離が0になった場合
  Me!テキスト3 = "勝利!!全員解放!!!"
  Me!テキスト1 = "生き残った人 " & Nokori & "人"
  Me!テキスト5 = ""
  Me!テキスト6 = ""
  Me!イメージ9.Left = 6000
'----だるまの絵、右向いてるやつを不可視、左向いてるやつを可視。
  Me!イメージ10.Visible = False
  Me!イメージ12.Visible = True

  Me!コマンド4.Enabled = True
  DoCmd.GoToControl "コマンド4"
  Me!コマンド0.Enabled = False
Else '------それ以外・・・タイミング悪く、残りの人数も距離も同時に0になってしまった場合など
  Me!テキスト1 = "残念!全員捕まってしまいました。"
  Me!テキスト3 = "惜しい!もうちょっとだったのに!"
  Me!テキスト5 = ""
  Me!テキスト6 = ""
  Me!コマンド4.Enabled = True
  DoCmd.GoToControl "コマンド4"
  Me!コマンド0.Enabled = False
End If
End Sub

Private Sub コマンド4_Click() '----もう一回最初からやるときのボタン
Nokori = Sanka '---最初は、まだ誰も脱落してないので参加者全員が残っている。
Kyori = 2000 '---単位はcm
'-----初期値をテキストボックスへ
Me!テキスト1 = Nokori & "人の人が参加します。"
Me!テキスト3 = "鬼までの距離" & Int(Kyori / 100) & "メートル"
Me!テキスト5 = ""
Me!テキスト6 = ""
Me!イメージ9.Left = 280 '---280くらいにしとくと、0.5cmくらいになるみたい
'----だるまの絵、右向いてるやつを可視、左向いてるやつは不可視。
Me!イメージ10.Visible = True
Me!イメージ12.Visible = False

'----コマンドボタンを使えるようにしたりしなかったり
Me!コマンド0.Enabled = True
DoCmd.GoToControl "コマンド0"
Me!コマンド4.Enabled = False
End Sub



完成品はこんな感じになります。
距離や人数の表示は前のと同じですが、だるまと人の絵が表示されるようになります。

だるまさんがころんだボタンをクリックするたびに、人が少しずつ動きます。
でも、何人かは見つかってしまい、捕虜になってしまいます。
人数が減ってる様子も、ビジュアルで示せれば面白いんですけどね・・・。人の画像を何種類か重ねておいて、Nokoriの値によってどの画像を可視するか、Select Case文で入れ替えしてやるって手があります。難しくはありません。やることが増えるだけ、ですね。
何かやろうと思うたびに、少しずつ処理を加えていけば、もっと面白くできそうです。
でも今日はやらないです。ホホホ。

生き残った人がいる場合は、こんな感じ。↓

全員捕まっちゃった場合は、こんな感じ。↓

だるまの絵をもう1種類増やして、変化をつけるのもいいかなぁって思います。

「データベースを操作する」コードではないけれど、こういうのちょっと書いたりすると、コードを書く練習にはなると思いますよ。
見てすぐ結果が確認できる動作は、練習のしがいもありますもんね。

ここで作ったもんと同じDBをご用意しました>コチラ
もし、どうしても同じようにできない、という場合は、どうぞ参考になさってください。
こんなdb参考にしたってどうしようもないと思うけどさ。