ボタンを作る
さてさてここまでFoooの多様な機能を紹介してきたが
ここまで読んだ方々は皆、薄々…疑問に…思っているのではないかと思う。
「いったいどこがアドベンチャーゲーム用の
ゲームエンジンなんだ!」
と。
どんな演出でも実現できるようにと、自由度を追求し続けた結果がコレである。
もはやアドベンチャーゲーム用のエンジンというよりは
より汎用的なマルチメディアエンジンのようなかんじである。
しかしどんなに複雑なことができるとは言っても
Foooはあくまで『動く漫画』を実現するために開発されたゲームエンジンだ。
けれどもゲームを構成する要素は『動く漫画』だけではない。
ゲームがゲームである以上、ユーザーが操作できる部分…
ユーザーインターフェース(UI)がある。
開発が進むにつれ、このUI部分についても『動く漫画』部分と同様に
高度な演出を行いたいという要望が出始めた。
高い汎用性を持ち始めたFooo…
高度な演出が必要なUI…
………………
「UIもFoooスクリプトで作っちゃえばよくね?」
となるのは必然的な流れだった。
ボタンデーカー
そんなこんなでFoooにはUIを実現するデーカーがいろいろあるが、
そのもっとも代表的なものが『ボタンデーカー』だ。
ボタンデーカーは名前の通り、ボタン機能を実現するデーカーである。
ボタンデーカーを作るにはCreateButton命令を使用する。
CreateButton(name="ボタン", class=@ボタンクラス());
一見するとCreateObject命令となんら違いがない。
ボタンデーカーはオブジェクトデーカーのようにクラスを指定して使う。
ボタンデーカーがオブジェクトデーカーと異なるのは、
ユーザーの操作に応じて予め決められたメソッドを自動的に呼び出す点だ。
次のようなメソッドが呼び出される。
OnButton_Focus | ボタンがフォーカスされた時 |
OnButton_UnFocus | ボタンからフォーカスがはずれた時 |
OnButton_Down | ボタンが押し下げられた時 |
OnButton_Up | ボタンが押し上げられた時 |
OnButton_Enable | ボタンが有効になった時 |
OnButton_Disable | ボタンが無効になった時 |
このような特定のタイミングで自動的に呼び出されるメソッドのことを『イベントハンドラ』と呼ぶ。
ボタンデーカーがやってくれることはこのイベントハンドラの呼び出しだけである。
ボタンに必要な画像の作成や、ボタンの画像の制御などは
コンストラクタやイベントハンドラに動作を書き込むことで実現する。
これは実際の使い方を見たほうがわかりやすいだろう。
ボタン_通常.png | ボタン_フォーカス.png | ボタン_ダウン.png |
style ボタン書式
{
face="MS ゴシック", size=40, color=white, interval=0
}
class ボタンクラス
{
method ボタンクラス(string $text)
{
CreateImage(name="通常"
, ox="Center", oy="Middle"
, image="ボタン_通常.png", sampling="BieLinear");
CreateImage(name="フォーカス"
, ox="Center", oy="Middle"
, image="ボタン_フォーカス.png", sampling="BieLinear"
, alpha=0%);
CreateImage(name="ダウン"
, ox="Center", oy="Middle"
, image="ボタン_ダウン.png", sampling="BieLinear"
, alpha=0%);
CreateText(name="テキスト"
, ox="Center", oy="Middle"
, style="ボタン書式", text=$text, sampling="BieLinear");
}
method OnEnter()
{
Enter(to="*");
}
method OnButton_Focus()
{
Opaque(to="フォーカス", alpha=100%, time=200);
}
method OnButton_UnFocus()
{
Opaque(to="フォーカス", alpha=0%, time=200);
}
method OnButton_Down()
{
Opaque(to="ダウン", alpha=100%, time=0);
Zoom(to=".", sx=90%, sy=90%, time=50);
}
method OnButton_Up()
{
Opaque(to="ダウン", alpha=0%, time=200);
Zoom(to=".", sx=100%, sy=100%, time=200);
}
}
method Main()
{
CreateButton(name="ボタン1"
, x=320, y="Middle"
, class=@ボタンクラス(text="ボタン1"));
CreateButton(name="ボタン2"
, x=640, y="Middle"
, class=@ボタンクラス(text="ボタン2"));
CreateButton(name="ボタン3"
, x=960, y="Middle"
, class=@ボタンクラス(text="ボタン3"));
Enter(to="*");
}
OnButton~メソッドが自動的に呼び出されている様子がわかるだろう。
ボタンデーカーの実装はちょっと手間だが、その分ボタンの動作を細かくカスタマイズできる。