ここでご紹介するのは、別記事に書いた自作パワポゲームの一部です。ゲーム全体について知りたい方は、以下の記事をお読みください。
このゲームは、「食べ物を選んでクリックすると、あみだくじ状のルートを降りていくので、食べ物の行き着く先を予想して正しいお皿をクリックする」というものです。正しいお皿をクリックすると、食べ物はお皿に乗って食卓に運ばれますが、間違ったお皿をクリックしてしまうと、食べ物が落ちてクマのボビー君が泣きます。まずは実際の動きをご覧ください。
ゲームを作った経緯や、「ボビーって誰??」という点に関しては、上記の関連記事に書いてありますので、ここではパワーポイントのスライド構成やアニメーション設定、マクロの記述について詳しくご紹介します。
スライド構成:OnSlideShowPageChangeを使わずに初期化をおこなう方法
このゲームは、6枚のスライドから成り立っています。ほとんどアニメーションが設定されていない「扉」となるスライドが1枚、それぞれの食べ物が移動するアニメーションつきのスライドが計4枚、そして失敗した時にボビーが泣いているスライドが1枚、という構成です。

オブジェクトの配置がほぼ同じなのにスライドを分けているのは、ひとつのスライドですべてのアニメーションを設定すると、重なり合って編集しにくいというのももちろんありますが、この一連のゲームをおこなう際に必ず「扉スライド」を通るようにしておくことで、初期化を確実におこなえるメリットがあるためです。
このゲームの中では、プレイヤーがお皿をクリックすると、半透明だったお皿に白く色がつきます。これはお皿をクリックした時に呼び出すマクロの中でおこなうわけですが、もう一度プレイする時、つまり別のスライドに行って戻ってきた時には、すべてのお皿が半透明に戻っていてくれないと困ります。つまり初期化です。通常、あるスライドが表示された時に必ず何かの操作がおこなわれるようにするためには、VBA内にあらかじめ用意されている、
OnSlideShowPageChange
という関数を使う必要があります。ただしこの関数、調べた限りでは挙動が安定しません。ppsm形式のファイルでは実行されないとか、Active-X コントロールなるものを最初のスライドに配置する必要があるとかで、ここに書いておけば絶対大丈夫というものではなさそうです。そこで、既存の(よくわからない)関数を使わずに初期化をおこなう方法として、「扉スライド」が有効です。
上記の6枚のスライドのうち、最初のスライドでクリックできるのは、食べ物だけです。お皿には「オブジェクトの動作設定」をしていないので、クリックしても何も起こりません。4種類の食べ物のどれかを選んでクリックすると、スライド②〜⑤のいずれかへジャンプし、そこではじめてお皿クリックによる色変えが起きます。つまり初期化しなければならないのは、スライド②〜⑤のお皿だけです。スライド②〜⑤に行くためには、必ずスライド①で食べ物がクリックされる必要があるので、食べ物クリックで呼び出されるマクロの中でお皿の色の初期化をおこなえば確実ということになります(前提として、クリックによる画面切り替えはオフにしておくものとします)。
このように、初期化が必要なスライドの手前に扉スライドをおいて、初期化なしでは中に入れないようにする構造を、私は個人的に「引き出し構造」と呼んでいます。ゲーム作成に限らず、インタラクティブなスライド作成で初期化にお困りの方には、有用な手段かと思います。
アニメーションの設定
次に、各スライドで設定しているアニメーションを見ていきます。このアニメーションによって食べ物やお皿の動きが実現しているわけですが、実は私のつくったスライドでは、すべての動きは直列状態です。たとえばスライド①では、クリックした食べ物があみだくじを降りていく前に点滅するのですが、実際のアニメーションは以下のように設定されています。4種類の食べ物を、左からA, B, C, Dとすると、
- step 1食べ物Aの強調効果(パルス)
⇒ハンバーグが点滅する
- step 2食べ物Bの強調効果(パルス)
⇒りんごとバナナが点滅する
- step 3食べ物Cの強調効果(パルス)
⇒ハンバーガーが点滅する
- step 4食べ物Dの強調効果(パルス)
⇒目玉焼きが点滅する
これは、私の使用しているOfficeのバージョンが古くて、すべての動きをVBAで言うMain Sequenceに記述するしかなかったためです。このままでは当然、クリックした食べ物が点滅するのではなく、AからDまで順番に点滅することになります。そのため次章でお見せするマクロ内で、クリックした図形の名前によって処理を場合分けし、上記タイムラインの特定のタイミングまでジャンプすることで、「クリックした図形によって異なるアニメーションを再生する」というインタラクティブな挙動を擬似的に再現しています。
次にスライド②〜⑤のアニメーション設定を見ていきます。文字列やフォークスプーン等の動きまで入れると煩雑なので、食べ物の動きのみを示すと以下のようになります。
- step 1食べ物の直線軌跡
⇒食べ物があみだくじを降り始める
- step 2~8:
- step 9食べ物の直線軌跡
⇒食べ物があみだくじを降り終える
- step 10食べ物の終了効果(シンク)
⇒食べ物がスライド下方向に落ちていき、ボビーが焦って汗をかく。
- step 11食べ物の開始効果(アピール)
食べ物とお皿の曲線軌跡⇒食べ物が落ちる前の位置に戻ってきて、お皿といっしょに食卓に運ばれ、ボビーが「いただきまーす」と言って喜ぶ。もう一度ゲームを繰り返す「おかわり」ボタンが現れる。
step1からstep9までは、あみだくじ上の動きです。あみだくじのルートを縦横9本(スライド④⑤では7本)の直線軌跡に分けて少しずつ動かしています。実はアニメーションの軌跡はフリーフォームに対応しているので、あみだくじの上から下までジグザグの軌跡1本で降りていくこともできるのですが、食べ物が移動している間にお皿クリックによる処理を割り込ませなければならず、これがどうしてもうまくいかなかったので、苦肉の策であみだくじルートを分割して、間に処理を入れられるようにしました。
降りていった後のアニメーションは、またしても直列状態になっています。まずフードキャッチ「失敗」時のアニメーション(食べ物が落ちる)が行なわれ、次のクリックで元の位置に戻ってきて「成功」時の一連のアニメーションが行なわれます。これを、マクロで成功時と失敗時に分けて再生させます。
マクロの記述
このゲームを作成する上で、VBAのエディタに書き込んだ関数は、以下の3つです。
| 関数名 | 実装するオブジェクト |
|---|---|
| Clean_Plate | – |
| Click_Plate | スライド②〜⑤のお皿 |
| Select_Food | スライド①の食べ物 |
これらをエディタに書き込んでコンパイルした後、スライド編集画面で該当オブジェクトを右クリックして、「オブジェクトの動作設定」→「マクロの実行」から実装します。
お皿の色を初期化する関数
まずお皿の色を初期化する関数Clean_Plateは、以下のようなものです。これはスライド内の特定のオブジェクトに実装するわけではなく、後述のClick_PlateやSelect_Foodの中で使います。
Dim plate(4) As String
Sub Clean_Plate()
''''''''''''''''''''''''''''''''''''''''''
plate(1) = "Oval 34"
plate(2) = "Oval 38"
plate(3) = "Oval 39"
plate(4) = "Oval 41"
''''''''''''''''''''''''''''''''''''''''''
With SlideShowWindows(1).View
Dim i As Integer
For i = 1 To 4
.Slide.Shapes(plate(i)).Fill.Transparency = 0.5
Next i
End With
End Subplate(4)という変数だけ、他の関数の中でも使うので、関数の外で定義しています。これは、お皿としてスライドに配置する4つの図形の名前(パワポが自動的に割り振るもの)を入れる文字列配列で、この名前は事前に把握しておく必要があります。スライドの編集画面では各図形の名前がダイレクトに出てきませんが、「アニメーションウィンドウ」を表示させると、アニメーションを設定した図形の名前が日本語で表示されますので、日本語と英語の対応が分かっていれば、そこから知ることができます。「円/楕円」であれば「Oval」、「図」であれば「Picture」といった具合です。分からない場合は、後述の関数Click_Plateの最初の一行をコメントアウトすれば、クリックした図形の名前がメッセージボックスで表示されます。
お皿クリック時に呼び出す関数
クリックしたお皿が白く塗りつぶされるようにするには、以下の関数を使います。
Sub Click_Plate(shp As Shape)
'MsgBox shp.name
Clean_Plate
shp.Fill.Transparency = 0
End Subプレイヤーはあるお皿をクリックしてから、気が変わって別のお皿をクリックするかもしれませんので、クリックされるたびに先ほど定義した関数Clean_Plateを使って、すべてのお皿の色を初期化しておきます。Fill.Transparencyというのは塗りつぶしの透明度で、1だと完全に透明、0は完全に不透明です。
食べ物クリック時に呼び出す関数
最後に、食べ物がクリックされた時に呼び出す関数です。
Sub Select_Food(shp As Shape)
'MsgBox shp.name
''''''''''''''''''''''''''''''''''''''''''
Dim iSlideMeal As Long
iSlideMeal = 4
Dim f(4) As String
f(1) = "Picture 10"
f(2) = "Picture 12"
f(3) = "Picture 9"
f(4) = "Picture 4"
''''''''''''''''''''''''''''''''''''''''''
With SlideShowWindows(1).View
Dim iFood As Long
iFood = 0
Dim i As Integer
For i = 1 To 4
If shp.name = f(i) Then
iFood = i
Exit For
End If
Next i
If iFood = 0 Then
.GotoSlide iSlideMeal
.GotoClick 0
Exit Sub
End If
'jump to the slide
.GotoClick iFood - 1
.Next
.GotoSlide (iSlideMeal + iFood)
Clean_Plate
'transport the food
Dim n As Integer
n = 0
Dim Nclick(4) As Integer
Nclick(1) = 9
Nclick(2) = 9
Nclick(3) = 7
Nclick(4) = 7
Do While n < Nclick(iFood)
.Next
DoEvents
n = n + 1
Loop
'judge correct or not
Dim correctPlate(4) As String
correctPlate(1) = plate(3)
correctPlate(2) = plate(4)
correctPlate(3) = plate(2)
correctPlate(4) = plate(1)
If .Slide.Shapes(correctPlate(iFood)).Fill.Transparency = 0 Then
.GotoClick .GetClickIndex + 1
.Next
Exit Sub
Else
.Next
.GotoSlide (iSlideMeal + 5)
End If
End With
End Sub最初に定義しているiSlideMealというのは、このフードキャッチャーゲームにおけるスライド①が、パワーポイント全体の中で何枚目のスライドに当たるかを入れる変数です。私の場合は、もともとクマのボビーの一日を追ったゲームの一部として作ったので、この値が4となっています。
次のf(4)という文字列配列には、食べ物としてスライドに配置する図形の名前を入れます。この名前の把握の仕方は、お皿の場合と同じです。
さて、その下から本題に入ります。まずクリックした図形の名前が、f(1)〜f(4)のいずれかと一致するかどうかを、For文を回してチェックします(プログラム行番号:17〜25)。もしどれとも一致しなかった場合は、スライド①に戻ってアニメーションを初期化した上でマクロを終了するようにします(行番号:26〜30)。これは名前の入力ミスなどによるエラーを回避するためでもありますが、こうしておくとこの関数を「もどる」「もういちど」などの任意の操作ボタンに実装して、スライド①に戻るハイパーリンク代わりに使うことができます。
さて、クリックした図形が4種の食べ物のいずれかであった場合は、スライド①で直列状に設定したアニメーションのうち該当するものだけを再生して、スライド②〜⑤のいずれかにとび、お皿の色の初期化をおこないます(行番号:32〜36)。そして7〜9本の直線軌跡に分割されたあみだくじルートを降りていきます(行番号:38〜50)。行番号48の「DoEvents」で、クリックによるお皿の色変えを割り込ませているのですが、実はこの部分結局うまくいっていません。クリック操作が入ると、再生途中のアニメーションが中断されて、次のアニメーションに飛んでしまいます。これがどうしても解決しなかったので、せめて目立たないようにアニメーションを細かく分割しました。もっとスマートに記述できる方は、そうしてください。
降りきったところで「正しいお皿がクリックされたかどうか」、すなわち「食べ物の真下にあるお皿が白くなっているかどうか」を判定します(行番号:52〜65)。もし判定結果がYesの場合は、スライド②〜⑤において「失敗のアニメーション」をワンステップとばして、残りのアニメーションを再生します。判定結果がNoの場合は、スライド②〜⑤において「失敗のアニメーション」だけ再生し、スライド⑥にとびます。
これで、すべてのスライドとアニメーションが場合分けされてつながり、あみだくじフードキャッチャーゲームが完成します。興味がわいた方は、よければ上のマクロをコピーして使ってください。各人が書き直す必要があるのは、以下の値のみです。
| iSlideMeal | 最初のスライド番号 |
| plate(1)~(4) | お皿の図形名 |
| f(1)~(4) | 食べ物の図形名 |
| Nclick(1)~(4) | あみだくじの線の数 |
お気に入りのぬいぐるみやキャラクターを食卓に配せば、子どもが喜ぶこと間違いなしのゲームです。高学年のお子さんなら、プログラミングのよい練習にもなると思います。
