« エアコン復活! | Home | まったく動かない(汗 »

Nov 222008

progression検証 #20 HistoryManagerの拡張

今回は正確に言うと検証ではなく、改造です・・・。
今後のバージョンアップ等を考えると同期が取れなくなるのでお勧めしません。実装される方は一応自己責任でお願いします。

ドキュメントには掲載されていないのですが、
jp.progression.core.managers.HistoryManager
という履歴を管理するクラスがあります。基本的にはブラウザの「戻る」「進む」ボタンに対応してシーンを遷移させる働きをしています。これを使用しているクラスとしては
jp.progression.core.managers.KeyboardManager
jp.progression.core.managers.SceneManager
jp.progression.core.ui.CastObjectContextMenu

の3つがあります。コンテキストとかは標準的に表に出てくるので使っている人も多いと思います。

で、これと同じ働きをする「back」「next」ボタンをFlash内で実装する場合

HistoryManager.back();//戻る
HistoryManager.forward();//進む
という感じになります。

ただ履歴とその中における現在の位置の関係が分からないため、これ以上戻れない、進めない状態になったときにボタンを殺したりすることができません。(その口を見つけられていないだけかもしれないけど)

つまりHistoryManager._positionとHistoryManager._histories.lengthの関係をチェックして、フロントのボタンの制御を行える口を用意したいなと・・。
ただposition、histories共にprivate static属性のためextendsもできず・・・ということでHistoryManagerに2つメソッドを追加してしまいました。

こんな感じ。

/*======================================================================*//**
 * 

forwoard / back の有効性を取得します。

*

*/ public static function get canForward():Boolean{return _position < _histories.length-1;} public static function get canBack():Boolean{return _position > 0;}
Progression.processStartイベントとかで呼び出して、ボタンのフェイスの制御をすることができるようになります。こんな感じ。
_btn_back.enabled = HistoryManager.canBack;
_btn_next.enabled = HistoryManager.canForward;
これは単純にボタンのenabledを制御しているだけです。実際にはfaceのコントロールとenabledを制御するメソッドを叩く感じで使うことになります。

キチンとそういう制御をする口が元々用意されていると思うのですが、見つけられなかったのでとりあえず書いてみる。というかそもそもprivate staticに設定してある時点で参照することで何かしらの問題があるのかもしれない・・・汗

重ねて書いておくとProgressionをバージョンアップすると動かなくなる可能性がある+何か気づかないバグが発生する可能性があるので、自己責任でお願いします。
というかやらないでくださいw

ADD 2008/11/24 2:40
コメントにtaka:niumさんが書かれている通り、ブラウザでの動作においてはHistoryManager._position と HistoryManager._histories.lengthは使用されていないため使用できません。つまりブラウザの履歴の方に処理を委ねている。(まだキチンと解析していませんが、swfAddressの方でURLが変更になったことをFlashに通知して、Flashがそれに追従している)、これはブラウザボタンの操作とFlash内の操作を区分して管理する、最初にFlashが起動したときのhistory.lengthを取得して基点にするとかで対応できそうな気もしますが、突き詰めていくとFlashコンテンツの履歴も含めてforwardで戻ってきた際とか色々辻褄合わない部分が出てきますね。本当はJSの方でhistory.positionに相当する変数が存在すれば解決できるのですが・・・・。

めっさ強制的にやるのであればflashコンテンツに入った際にhistory.clearでそこから初期化してしまう・・・とか?(いや分からんけど・・)

ま、ちょっと今時間が無いのでその辺また暇ができたら試してみたいと思うデス。

3 Comments

いつもありがとうございます!

前後の履歴がない際の disable 化ですが、やりたいとは思っているのですが技術的に無理なんじゃ疑惑があって放置しています。

まず、HistoryManager._position と HistoryManager._histories.length については、Flash IDE プレビューとプロジェクターのための機能なのでブラウザ実行時には使用していません。
ブラウザ使用時にはブラウザ側の履歴機能を使うことになるのですが、この現在位置と履歴データが取得できないので無理かなと・・・。
もし何か糸口がありましたら、対応してしまうので教えていただければ!

な・・なるほど!
そんな理由があったのですね・・。しかしブラウザの履歴をFlash中から使うってのは色々大変そうですね・・。(Flashに入る前のページを除外したり・・・ってしなくていいのか?)
ま、なんかちょっと調べてみます。良い解決策があったらひっそり連絡しまっす!

んーswfAddressからきちんと理解しないと分からない・・汗
早くも挫折のヨカン・・・涙

Leave a comment

Search and Archives