一定期間更新がないため広告を表示しています
環境設定を組んでます。環境設定なんかのメニューは右クリックで呼びだす感じで考えているわけですが、スタイルもコンテキストメニュー的にして、つまりマウスカーソルの近くに表示されるようにしてます。で、そこから「環境設定」とか「スキップ」とかを選びます。
メニューバーを追放したいので、もしかすると終了とかリセットとかもここに入るかもしれません。
今日は環境設定の、BGMとSEの音量調節を作りました。ツマミをスライドさせて調節する、フェーダー形式です。割と使いやすく仕上がったんじゃないかと思いますが、これ、ほづみさんはやたらと驚いてましたけど、そんなに難しいものではないです。ちょっとでもプログラミングの経験がある人ならすぐ解決出来るでしょう。
吉里吉里のLayerクラスにはFlashのActionScriptのようなonMouseDragイベントが用意されていないので、ドラッグ操作の判定を自前でやらなきゃいけません。強いていえばこれを実装できるかどうかがポイントかと。あとは適当に座標を得てhogehogeしてBGMオブジェクトとかSEオブジェクトのfadeメソッドを叩くだけだし。
明日以降に続く……かも。
いろいろありまして、ダンジョンの大部分と戦闘の小部分を作り直すことになりました。まあ作り直すのはいいんですけど、問題は「どう作り直すか」なんですよね。作り直すというか、改善を目指すわけなんですが、慎重にやらないと、かえって、というか余計にプレイしづらくなるわけで。なかなか時間がかかりそうです。
そこでその辺はとりあえず置いといて(議論はしますよ。製作をとりあえず置いとくってことです)、別のところを作ってます。セーブとかロードとか、環境設定とか。システム周りです。ところで、KAG Systemを使っていてずっと気になってたもののひとつに、Yes/Noダイアログがあります。普通、この手のダイアログには「はい」か「いいえ」のどっちかにあらかじめフォーカスがついているものですが、W.Dee氏に何か考えがあるのでしょう、KAG Systemのものはそうなっていません。
幸い、KAG Systemのソースは適当にハックしても文句を言われないので、テキト−にいじることにしました。終了確認など、主に取り返しのつかない場面で使うことが多いので、「いいえ」にフォーカスすることにします。
でもまあ、例によって難しいことは何もしてないです。今回のハック対象は、system配下のYesNoDialog.tjs。このファイルの一番下に、askYesNo()という関数があります。これはYes/Noダイアログを呼び出す関数ですね。これをハックします。関数ブロックの二行目にwin.showModal();というのがありますが、これの前の行に次のような句を書きます。
win.noButton.focus();
まず、winというのは、Yes/Noダイアログのオブジェクトです。この中にはyesButtonとnoButtonという二つのButtonLayerオブジェクトがあって、これはLayerのサブクラスなので、Layerクラスのメソッドを継承しています(オブジェクト指向については適当にググってください)。
そこで、レイヤにフォーカスを与えるLayerクラスのメソッド、focus()を呼ぶことで、フォーカスがつくわけです。単純なことですが、こういう設計思想には正直頭が下がります。W.Deeさん、ありがたう。
蛇足ながら。「はい」の方にフォーカスをつけたいときは、yesButtonに対してfocus()を呼べばOKです。
最近忙しくてちっとも制作にかかれなかったのですが、仕事の合間を見付けて、今日はちょっとだけ作業してます。ということで、以前からの宣言通り「初回起動時はフルスクリーンにするかどうかを尋ねて云々」ということについて、書きたいと思います。
といっても、別に難しいことではないです。KAGにはもともと「はい・いいえ」を尋ねるダイアログを出すメソッドが実装されているので(といっても、KAGから呼べるかどうかは謎。私はTJSから呼んでますが……)、これを使い、ものの数十秒で実装が完了します。
一応考え方だけ。この「はい・いいえ」ダイアログはaskYesNo()というメソッドで呼びます。引数に表示したいメッセージをとり、ユーザーがどちらのボタンを選ぶかによって、trueかfalseのbool値を返します。要するにaskYesNo("なんとか")
と記述すると、「なんとか」というメッセージの入ったダイアログが表示され、その問いかけに対してユーザーが「はい」を押したのか「いいえ」を押したのか、その結果を返してくれるわけです。
以上から、何かの判断をユーザーに任せて「はい」の場合だけアクションを起こしたい場合は、
if (askYesNo("やんのか?")) {という感じのスクリプトになります。別に難しくもなんともないですね。ちなみに、KAG Systemの終了時の「終了しますか?」というダイアログも、同じ原理で作られています。どういう処理をしているのかはいちいち書きませんけど。
myAction();
}
質問方法がわかったら、あとはフルスクリーンにするのと、初回起動時にのみ尋ねるというのを実装するだけです。ここは前回と変わりません。
if (sf.not_firstplay != true) {あ、そういえばアレですね、kag.onFulllScreenMenuItemClick()の引数にkagオブジェクトを渡す必要はないみたいですね。考えてみれば当然なんですけどねー(^^;;;
sf.not_firstplay = true;
if (askYesNo("フルスクリーンでプレイしますか?")) {
kag.onFullScreenMenuItemClick();
}
}
ひとつだけ注意しないといけないのは、初回起動でないことを示す変数(この場合はsf.not_firstplay)にtrueを代入するのは、ダイアログに対する返答とは関係ないように記述すること。そうしないと「はい」を選ぶまで、起動するたびにダイアログが出てきて鬱陶しい思いをしてしまいます。まあ毎回出してもいいんですけどね。
毎回出す場合は、KAG Systemの終了メソッドにフルスクリーンを解除する記述を追加するhackが必要になります。それも面倒な話なので、私は初回だけにすることにしました。