YesNo(Image)Dialog概要 YesNo(Image)Dialog は、半透明を含む不定形ダイアログを表示する。 KAG標準の YesNoDialog.tjs はそのようなダイアログを表示することが できないので作った。 KAG標準のYesNoDialog.tjs を置き換えて使うのが吉。 びっくりするくらい頭が悪い仕組みなのはヒミツ中のヒミツ。 使い方: KAG標準の終了ダイアログや確認ダイアログを変更したい場合は、以下の手順で 使用する。 1. YesNoDialog.tjs で、system/ フォルダの同名ファイルを上書きする 2. 以下のファイルをKAGが検索可能などこか(image/フォルダなど)に 作成する YesNoImageDialog_YesNoDialog.png ........ Yes/Noダイアログ画像 YesNoImageDialog_OKDialog.png ........... OKダイアログ画像 YesNoImageDialog_YesButton.png .......... Yesボタン画像 YesNoImageDialog_NoButton.png .......... Noボタン画像 YesNoImageDialog_OKButton.png ........... OKボタン画像 3. 追加でdispOK() を使いたければ、first.ksの頭で以下のように 読み込みしておく必要あり。 [eval exp="KAGLoadScript('YesNoDialog.tjs')"] これだけで、例えば「ゲームを終了する時のダイアログ」を好き勝手に 変更できる。 ***************************************************************************** TJSスクリプトからの使い方: クラス: ImageDialogWindow 説明: 半透明を含む不定形ダイアログを実現するクラス コンストラクタ: ImageDialogWindow(image, elm = %[]) 引数: image ダイアログ画像ファイル名 elm ダイアログのオプション。後述のsetOptions()参照 関数: ImageDialogWindow.setOptions(elm) 機能: ダイアログにオプションを指定する 引数: elm ダイアログオプションの辞書配列。現在は以下が指定可能。指定 しなかった場合はデフォルトが使用される elm.image ダイアログ画像ファイル名 elm.font.face フォント名 elm.font.height フォントサイズ(def=18) elm.font.color フォント色(def=clBtnText) elm.font.bold 太字にするかどうか(def=false) elm.shadow.level 文字影の不透明度(def=0:影なし) elm.shadow.color 影の色(def=0:黒) elm.shadow.width 影の幅(0:シャープ) elm.shadow.offsetx 影の位置X座標(def=0:真下) elm.shadow.offsety 影の位置Y座標(def=0:真下) elm.message.alignx ダイアログ中のメッセージ揃え横位置 c=center(def), l=left, r=right elm.message.aligny ダイアログ中のメッセージ揃え縦位置 c=center(def), t=top, b=bottom elm.message.left メッセージ領域のダイアログ左端からの位置 (def=20) elm.message.top メッセージ領域のダイアログ上端からの位置 (def=20) elm.message.width メッセージ領域の横幅(def=dialog幅-left*2) elm.message.height メッセージ領域の縦幅(def=dialog幅-top*2) elm.message.vertical メッセージを縦書きにするかどうか(def=false) elm.copybg 全力で背景をコピーするか(def=false) このパラメータの意味については後述 関数: ImageDialogWindow.dispMessage(message) 機能: 指定したメッセージをダイアログのメッセージ領域に表示する 引数: message 表示する文字列。メッセージ領域にあわせて、自動的に改行される。 関数: askYesNo(message, caption = "確認") 機能: Yes/Noダイアログを表示する。KAGのMainWindow.tjsから呼ばれたりする。 内部的には、ImageDialogWindowを作成し、showModal()でダイアログが クリックされるまで待つ。 ボタン位置などはハードコードしてしまったので、YesNoDialogWindow クラス 先頭あたりを変更するよろし。 返値: Yes が押されたら true を、No が押されたら false を返す 引数: message 表示するメッセージ文字列。 caption ウィンドウキャプションなのだが、ImageDialogWindowでは キャプションを表示しないので意味が無い。互換性のために 残してあるだけ。 関数: dispOK(message, caption = "確認") 機能: OKダイアログを表示する。KAGのMainWindow.tjsから呼ばれたりする。 内部的には、ImageDialogWindowを作成し、showModal()でダイアログが クリックされるまで待つ。 ボタン位置などはハードコードしてしまったので、OKDialogWindow クラス 先頭あたりを変更するよろし。 返値: なし 引数: message 表示するメッセージ文字列。 caption ウィンドウキャプションなのだが、ImageDialogWindowでは キャプションを表示しないので意味が無い。互換性のために 残してあるだけ。 パラメータ copybg について 吉里吉里・KAGでは半透明を含む不定形ダイアログは実現できない。 それはもうどうやっても実現できない。それをムリヤリ実現するために、 このスクリプトでは以下のようなアホ丸出しの方法を採用した。 1. 枠なしのダイアログを作成し、 2. そのダイアログにkag.fore.back背景をコピーして、 3. 更にその上に半透明画像を含むレイヤを配置する これにより、一応それっぽいことが実現できるのだが、問題は残る。それは、 ダイアログに貼り付けた背景が動的なもの(アニメーションしているとか [move] タグなどで動作しているとか)の場合だ。このとき、ダイアログ背景を 一度だけ静的にコピーすると、せっかくの半透明なのに、ユーザに偽方法で 半透明化していることがバレてしまう。 これを防ぐには、「モノスゴいイキオイで背景をダイアログ上にコピー しまくる」ようにすればよい。ダイアログを表示するとCPU使用率が 100%にハネあがるが、とりあえず後ろがアニメーションしていても 半透明ぽい前面は破綻しなくなる。この「全力コピー」をするかどうかを 決めるのが copybg パラメータ(def=false)。trueにするとCPU使用率が スゴいことになるので確認して頂きたい。それでもtrueにしたい人だけ どうぞ。変更には、YesNoDialog.tjs ファイル末尾のコメントを外す。 正直、これ以外の汎用的な方法を思いつかなかった。Layerでダイアログ を実現することも考えたのだが、KAGでは「〜まで待つ」のとかがとても 難しいので諦めたのだった。もっといいアイディアがあればご教示 ください是非。 krkr.exeの起動オプションについて 全画面表示にしたり、画面全体を拡大・縮小していると、ダイアログ表示開始 から表示完了まで一秒くらいかかることがある。これは、吉里吉里が内部的に 拡大縮小時の補間方法をベンチマークして決定しているから。そんな遅延は 気にしないぜ!というおおらかな人は放置すればいいのだが、どうしても 気になる!という人は、krkr.exeの起動時オプションに "-dbstyle=ddraw"などを 付加するとよい。これでベンチマークせずにDirectDrawを使うようになり、 遅延は解消される。詳細は以下のURLの-dbstyle項を参照のこと。 http://devdoc.kikyou.info/tvp/docs/kr2doc/contents/CommandLine.html ちなみに、座標周りの指定はかなりイイカゲンなので、よーく見ると 微妙にダイアログ背景が実際のものとズレてたりするのが判ったりする。 仕様だ!バグじゃないんだ! 現在、ためしにsetArguments("-dbstyle", "ddraw") を随所にテンポラリで 入れている。これで改善することもあるし、改善しないこともあるみたい。 四方山: 吉里吉里/KAGのYes/NoダイアログはWindowsの標準ウインドウをそのまま使った もので味も素っ気もないので、ゲームにマッチしたのを作りたいなぁ、と いう稀有なる望みを持つ人のために作った。 『不定形な確認ダイアログボックスに変更するには』 http://homepage1.nifty.com/gutchie/kirikiri_kag2/faq_tjs010.html …というのがあるのだが、これでは半透明が実現できなかったので、 できるようにしてみたワケで。 その結果がこのモノスゴ頭が悪い実現方法か、と言われるとグウの根も 出ない。ああそうさ!どうせ我輩のアレはそんなもんさ!キィッ!