■■ b2エディタ イベント記述ガイド
本リファレンスが想定しているバージョンは
b2edit.exe | version 1.1d |
b2.swf | version 1.04 |
です。
■はじめに。
イベントツールって?
B2エディタではイベントツールを使ってより細かい設定をすることができます。
イベントツールを使わないとゲームを作れない?
イベントツールへの記述は必須項目ではありません。イベントツールは空っぽの
ままでも普通にブロック崩しが出来上がります。
標準で用意されているプロパティタブの数値を調節するだけでも十分な選択項目
を持っています。
イベントツールを使うと何ができるの?
普通のブロック崩しはパドルでボールを跳ね返してブロックを全て消したら
ゲームクリアというルールですが、これにいろんな要素を付加できます。例えば…
・全ブロック90%消した時点でゲームクリアにしたり、
・現在のブロックを消したあとで続けて次のレベルに進行したり、
・クリア後におまけページにジャンプしたり、
・特定のブロックにぶつかったときにアニメーションさせたり、
・最後の1機になったらメッセージを表示させたり、
・画面の上端でボールが跳ね返ったときに貫通弾にさせたり、
・制限時間内にクリアできなければ強制的にゲームオーバーにさせたり、
・ボールロスト時やサーブ時に任意の音を鳴らしたり、
・ブロックを破壊すると一定の確率でアイテムを落としたり、
・ある程度のブロックを破壊することで、それまで破壊不能だったり非衝突だった
ブロックを破壊可能にしたり、
…と、あとは組み合わせたり工夫次第で独自性をアピールできます。
#ただし、イベントツールの項目はゲーム中常に監視されていて、条件文が増えると
#ゲームの動作が重くなることがありますのでご留意ください。
構文のリファレンスはこちらにありますが、いきなり読んでもピンと来ないかと思います。
ここでは今挙げたような項目のサンプル構文を例示しますので、そのまま組み込んで
使用したり、記述の際の参考にしたりしてください。
■全ブロックの90%でクリアにする
OnAmount p90
gameClear
説明
以上の2行をイベントツールに記述することで、全ブロックの90%を破壊した時点で
ゲームクリアになります。
OnAmount p90
p90というのが90%を表し、「ブロックを90%破壊した時点で」という条件を示します。
p100とすれば「100%」、p65なら「65%」、pを取って90とすると「90個」という個数
を表します。
■次のレベルへ進行する
OnAmount p100
nextLevel nextConfig.txt|1
説明
最初の1行は前項のとおり、「ブロックを100%破壊した時点で」という条件になります。
そのときに、
nextLevel nextConfig.txt|1
を実行します。"nextConfig.txt"というのは次のレベルで用いる設定ファイル名です。
ここに次のレベル用に作った設定ファイルのファイル名を入力してください。
ブロック配置などが一新されるのですから、現在の設定ファイルとは別に設定ファイルを
作っておいて、それを読み込んであげないといけません。
その後ろについている"1"は、現在の背景画像を前面にした状態で次レベルを読み込む
というオプションです。ブロックを壊して背景が見えている現在の画面が次の前景に
なるという通常の場合はこれを選択します。
これを"0"にすると一旦NOWLOADINGの画面に戻って次のレベルを読み込みます。
#"nextConfig.txt"と"1"の間にある"|"(縦棒)はパラメータの区切りを示し、
#実際の記述にも入力します。キーボードでは右上の¥記号のキーを[Shift]
#キーと一緒に押すことで入力できます。
■クリア後のおまけページを表示する
OnAmount p100
jumpURL clear.html
説明
1行目の説明は同じなので省略して、2行目がページジャンプのコマンドです。
jumpURL clear.html
"clear.html"がおまけページのURLです。"http://〜"みたいな絶対パスで指定
してあげても構いません。
ちなみに行頭にスペースを入れているのはインデント(字下げ)をして見やすく
しているためで、無くても構いません。逆にもっとスペースを入れてもOKです。
但し、On〜やAnd〜で始まる条件文については必ず文頭から入力してください。
■天井にボールが当たったら貫通弾にする
OnUpside
ballBe 2
説明
アニメーションは少々厄介なのでこちらから紹介します。
OnUpside
で「ボールが画面上端に当たったら」という条件を表して、
ballBe 2
で「貫通弾にする」という実行文を表します。
ちなみに貫通弾はパドルに当たると通常弾に戻ります。
■コマアニメーション
さて、アニメーションの説明です。
アニメーションの準備としてアニメする部分の画像をJPEGで用意して下さい。
それぞれ違う絵の場合はその分の枚数が必要です。これは前景・背景の画像と
同じ大きさは必要ありません。動く部分だけを上に重ねてアニメにします。
まずアニメーションを行う際の概枠を示します。
OnPreGame
//使用する画像を準備する
OnTimer
//最初のコマを表示
OnTimer
//最初のコマを消去
//次のコマを表示
OnTimer
:
OnTimer
//最後から2番目のコマを消去
//最後のコマを表示
OnTimer
//最後のコマを消去
…という手順になります。OnPreGameで準備をして、コマ数の分だけ
OnTimerで絵を順じ切り替えていきます。方法としては単純です。
ここでは簡単に、目パチ(開いてる目が閉じて開く)を行うために、
hannme.jpg
tojime.jpg
の2枚を、背景の開いている目の上にアニメーションさせることします。
まずは準備部の記述はこうなります。
OnPreGame
picNumber 2
preLoad hannme.jpg|1
preLoad tojime.jpe|2
OnPreGameはGameの始まる前、つまりNOWLOADING中に実行するコマンドを
表します。まず、picNumber 2によって2枚分の画像スペースを確保して、
その1番目にhannme.jpgを、2番目にtojime.jpgを読み込みます。
#OnPreGame内でpreLoadされたファイルはNOWLOADING中の画面にpreload…
#と3段目のゲージに表され、読み込みが完了するまでゲームは開始しません。
次にここで準備した画像をOnTimerで表示していきます。
OnTimer 0|5000
loadPic 1|120|75
OnTimer 100|5000
removePic 1
loadPic 2|120|75
OnTimer 200|5000
removePic 2
loadPic 1|120|75
OnTimer 300|5000
removePic 1
数字が沢並んで何が何やらという感じですが、順をおって説明しましょう。
OnTimer 0|5000というのは、ゲーム開始0秒後に実行、以降5秒毎に実行
という意味です。5000が5秒を表すのは単位がミリ秒(1000分の1秒)だからです。
したがってそれぞれのOnTimerは0.1秒から5秒おき、0.2秒から5秒おき、
0.3秒から5秒おき…つまり、まず最初に0.1秒間隔でそれぞれが実行され、
その一巡を5秒ごとに繰り返す(つまり5秒ごとにまばたきする)ということです。
あとは、実行される内容です。
loadPic 1|120|75というのは準備した1番目の画像(hannme.jpgでした)を
画面の(120,75)という位置に表示させるという意味です。
そしてremovePic 1は表示した1番目の画像を消去、そして次のloadPicで
先ほどと同じ位置に今度は2番目の画像(tojime.jpg)を表示します。
そして2番目も消して、再び1番目のhannme.jpgを表示させて、最後に
それを消してあげると背景の開いた絵に戻ります。
こうして0.1秒間隔で半目→閉じ目→半目→と切り替えることができました。
実際には最初のOnTimerを0秒から開始すると、半目状態でゲームが始まりますので、
それぞれの開始値を100、200、300、400とズラしてあげるとよいでしょう。
#loadPicで直接ファイル名を指定せずに準備段階として、1段踏まえるのは
#多少ややこしい感がありますが、NOWLOADING中に画像を読んでおくことで
#その後ファイル(およびインターネット)にアクセスしないで表示を切り替える
#ことができます。また、ゲーム中にpreLoadすることも可能で、ゲーム前の
#待ち時間を減らすという利点がありますが、ゲームをしている間にデータ送受信を
#行うと動作がカクカクと不安定になることがありますので注意してください。
■特定のブロックにぶつかったらアニメーション
特定のブロックにぶつかったことはOnHitで調べることができます。
ここで左から10番目上から8番目のブロックを対象にすると、
OnHit 9|7|1
setFlag 1|1
という形で記述できます。ブロック位置の指定は、左上のブロックを(0,0)として
数えるので、(9,7)が左から10番目、上から8番目になります。そのあとの"1"は、
ブロック破壊でなく衝突時(破壊時も含む)であることを示します。
指定のブロックにぶつかったときにsetFlag 1|1、1番目のフラグを立てます。
あとはこのフラグを条件に加えてアニメーションの実行部を書き換えます。
OnTimer 0|400
AndFlag 1|1
loadPic 1|120|75
OnTimer 100|400
AndFlag 1|1
removePic 1
loadPic 2|120|75
OnTimer 200|400
AndFlag 1|1
removePic 2
loadPic 1|120|75
OnTimer 300|400
AndFlag 1|1
removePic 1
setFlag 1|0
On〜条件と併記してAnd〜条件を記述することで、それらが同時に成り立つときに
限って実行することを表します。この例では1回の衝突に対しフラグを立てて、
1回のアニメーションを行って最後にフラグを下げています。ここで、
OnFlag 1|1
AndTimer 0|400
の順序ではフラグが立つまではTimerが評価されずフラグが立った瞬間に全ての
Timerが実行されるために、正常にアニメーションしないので注意してください。
▽この項目は応用技なので以下もう少し詳しく説明します。
上のサンプルまででほぼ実現しているので難解な場合は、読み飛ばして
他の項目をご覧頂いてもから読んで頂くのが良いかもしれません。
「ほぼ」実現というのが引っかかりますね。というのは、上のサンプルだと
ブロックが衝突してフラグが立ったとき、Timer値がどんな値かわかりません。
ゆえに、例えばTimer値が400ミリ秒で割ったときに200ミリ秒の余りがあるという
状態ということもあります。そうするとOnTimerは上から順番にではなく、途中の
OnTimer 200|400から実行されてしまうということになります。ですので
実は上のサンプルは爪一歩甘く、次のようにするのが正解です。
OnTimer 0|400
AndFlag 1|1
loadPic 1|120|75
setFlag 1|2←変更
OnTimer 100|400
AndFlag 1|2←
removePic 1
loadPic 2|120|75
OnTimer 200|400
AndFlag 1|2←
removePic 2
loadPic 1|120|75
OnTimer 300|400
AndFlag 1|2←
removePic 1
setFlag 1|0
どのようになるかは各自のご理解にお任せします。
▽タイマを強制的にリセットする方法の方が実は簡単です。
この方法ではフラグは用いません。準備部と衝突判定部も含めてサンプルは
以下のようになります。
OnPreGame
picNumber 2
preLoad hannme.jpg|1
preLoad tojime.jpe|2
OnHit 9|7|1
resetTimer 6000000
OnTimer 6000000|400
loadPic 1|120|75
OnTimer 6000100|400
removePic 1
loadPic 2|120|75
OnTimer 6000200|400
removePic 2
loadPic 1|120|75
OnTimer 6000300|400
removePic 1
resetTimer 0
6000000ミリ秒は100分のことです。フラグを立てる代わりに時計を100分後
という使いそうもない時間にあわせて、その時間にあわせてアニメーションを
用意しておくというやや強引な手法です。アニメーションが終わったら時計を
0ミリ秒に戻しています。実は先述の方法だと衝突からアニメーションまでに
最大400ミリ秒のタイムラグが発生する場合があるのですが、こちらを使うと
その心配もありません。さて、いくら使いそうもないと言っても、仮に100分間
ゲームが続いてしまったら意図せずアニメーションしてしまうのはちょっと…
という心配は以下の記述を付け加えることで解決します。
OnTimer 60000|1
resetTimer 0
1分ごとに時計を0秒に戻してしまおうというわけです。しかし、この2行を
追加するにはブロックに衝突をして100分後に時計を進めたときには無効にして
おかないといけません。手法としては衝突時にフラグを立てて、無効化する
ことができます。
いずれにしてもタイマーを操作するという一連の手法は、時計をアニメーション用に
占有してしまうというデメリットを持つということになります。
■最後の1機になったらメッセージを表示
OnLifeRest 1
drawRect 120|75|300|40|1|2000
text LAST 1 BALL!!|120|75|300|40|2000
説明
OnLifeRest 1
は、残機が1になったときに実行されることを表します。
この実行のタイミングは前の機がアウトになって、いよいよ残り1機という段階
です。続く実行文の2行は描画コマンドです。
drawRect 120|75|300|40|1|2000
画面に枠のある四角を表示します。(120,75)を左上頂点として、幅300高さ40で、
枠の形が1(完全な長方形)という四角です。最後の2000は2秒後に自動消去される
ことを表します。
text LAST 1 BALL!!|120|75|300|40|2000
文字を表示します。同様に、(120,75)を左上頂点として、幅300高さ40で2秒後に
自動的に消える文字ということを表しています。
表示される文は"LAST 1 BALL!!"です。
日本語を表示したいとき、
text 最後の1個のボールですよ!|120|75|300|40|2000
と記述することはできません。このままデータに記述するとゲームに渡されたときに
文字がバケてしまいきちんと表示できなくなってしまいます。
日本語等を表示したいときは、URLエンコードした表記を行う必要があります。
"最後の1個のボールですよ!"をURLエンコードするとどんな文字列になるのかは、
圧縮ファイルに同梱されているescapeCode.swf或いはその実行形式版escapeCode.exe
を使用します。同ツールを起動して(swf版ならブラウザに表示させて)、入力欄に
"最後の1個のボールですよ!"と入力して矢印ボタンを押すと出力欄にURLエンコード
の結果が表示されます。それをイベントツール内にコピー(ctrl+C)&ペースト(ctrl+V)
します。結果として、
text %E6%9C%80%E5%BE%8C%E3%81%AE%EF%BC%91%E5%80%8B%E3%81%AE%E3%83%9C%E3
%83%BC%E3%83%AB%E3%81%A7%E3%81%99%E3%82%88%EF%BC%81|120|75|300|40|2000
なんていう長い記述になります。
■制限時間内にクリアできなければ強制的にゲームオーバー
OnTimer 600000
gameOver
説明
1行目のOnTimerはアニメーションのところで何度も登場しているとおり、ゲーム開始
からの時間を調べて、指定時間経過したら、という意味です。ここで2番目の
パラメータが省略されているのは"0"を指定したのと同じ意味で、周期0は周期性の
無いこと、つまり1度きりの条件であることを表します。
600000ミリ秒後ということですので、600秒つまり10分経ってクリアできてないようなら
強制的にゲームオーバー、ということです。
#イベント記述によってクリアやゲームオーバーを設ける場合、特にこの手の条件を
#課す場合は、プレイヤーにはっきりとその条件を知らせておきましょう。
#最も簡単で良い方法の1つはhtmlファイルに書いておくことです。