- ベストアンサー
FLASH5でテキストのスクロール
FLASH5を使ってホームページを作っているのですが、テキストファイルをテキストエリアに読み込んだ時(エリアに入りきらないこと前提)にボタンを「押しつづけている間スクロールし続ける」ようなものを作りたいのですが、どのようなアクションスクリプトを書けばよいのでしょうか?ボタンを押した時、離した時に指定行スクロールさせることは出来たのですが。。。。 アドバイスお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このように考えてはいかがでしょう。 ボタンが押された時に、ボタンが押されたという情報を変数(このような使い方をする変数は、フラグとも呼ばれます)に記録しておき、ボタンが離された時にはその情報をクリアします。 このフラグの値を常時監視して、ボタンが押されている時だけスクロールを実行するようにします。 ボタンが押された時に発生する press イベントは、押されたその時、1回しか発生しません。従って、ボタンに設定したアクションが実行されるのも、その時1回きりです。 一方ムービークリップイベントの enterFrame イベントは、ムービークリップがステージにある間、常に発生しています。フラグの値を監視して、特定の値になった時だけ実行するような処理は、このイベントを利用して作ります。 なお、enterFrame イベントはフレームレート分の1秒ごとに発生し、スクリプトもそのタイミングで実行されます。 特に大きなフレームレートのムービーの場合、enterFrame イベントが発生する度にスクロールさせてしまうと、スクロールが速すぎて使いにくくなることがあります。 もう1つ変数を用意し、enterFrame イベントが発生するごとにカウントを取ります。このカウントが一定の値になった時にだけスクロールする、というように考えると、スクロールの速さを調整することができます。 Flash 5 のムービークリップでは、press や release イベントが検出できません。 しかし、enterFrame イベントはムービークリップでしか使えません。ムービークリップでも press や release イベントを検出できるようにするには、透明なボタンを重ねたムービークリップを用意します。 ムービークリップを1つ、新規に作ります。絵を描いたら、これをとりあえずボタンシンボルに変換します。 レイヤーを分け、このシンボルを「同じ位置にペースト」を利用して、同じ位置にコピーして重ね合わせます。「情報パネル」で数値を入力して合わせてもいいでしょう。 上になっているボタンは、「効果」パネルのリストで「アルファ」を選び、0%にして透明にします。 下の方になっているボタンは単なる絵として使いますから、「修正」→「分解」で、普通の描画オブジェクトにしておきます。 スクロールボタンが押されているかどうかの状態をフラグに保存するスクリプトを、透明なボタンに設定します。 フラグとして使う変数を、仮に press_flg という名前にしますと、 (↓以下のスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) on(press) { //押されたという情報を記録 press_flg = true; } on(release) { //フラグをクリア press_flg = false; //スクロールウェイトをリセット scroll_wait = 0; } scroll_wait という変数は、スクロールの速さを調整するための待ち時間の計測(ウェイト)に使います。ボタンが離された時は、このウェイトも0にリセットします。 これで、スクロールボタンのシンボルは完成です。 ステージにスクロールボタンとテキストエリアを配置します。 Flash 5 では、テキストエリアのスクロールを制御するには、テキストエリアで表示する変数名.scroll といった表記をします。 テキストエリアで表示する変数を、仮に message という名前だとし、メインのタイムラインにあるものとしますと、ステージにあるスクロールボタン(のムービークリップ)からこの変数を見ると、テキストエリアの行数を制御するには _root.message.scroll あるいは _parent.message.scroll となります。 この値を、スクロールボタンで発生する enterFrame イベントを利用して操作します。 上方にスクロールさせるボタンに up 、下方にスクロールさせるボタンに down というインスタンス名を付けるとすると、それぞれに設定するスクリプトは、大体、次のようになります。 ・ up / down の両方に共通するスクリプト onClipEvent(load) { //フラグの初期化 press_flg = false; //スクロールウェイトの初期化 scroll_wait = 0; } ・ up にだけ設定するスクリプト onClipEvent(enterFrame) { //ボタンが押されている場合 if( press_flg ) { //3フレームに1度、スクロールさせる scroll_wait++; if( scroll_wait >= 3 ) { //上にスクロール _root.message.scroll--; //最上行の場合はスクロールを止める if( _root.message.scroll <= 0 ) { _root.message.scroll = 1; } //ウェイトのクリア scroll_wait = 0; } } } ・ down にだけ設定するスクリプト onClipEvent(enterFrame) { //ボタンが押されている場合 if( press_flg ) { //3フレームに1度、スクロールさせる scroll_wait++; if( scroll_wait >= 3 ) { //下にスクロール _root.message.scroll++; //最下行の場合はスクロールを止める if( _root.message.scroll > _root.message.maxscroll ) { _root.message.scroll = _root.message.maxscroll; } //ウェイトのクリア scroll_wait = 0; } } } load イベントは、ムービークリップがステージに登場した、その時1回だけ発生するイベントです。この特徴を利用して、ボタンが押されたかどうかのフラグとスクロールの速さを制御するカウンタを初期化します。 スクロールの速さを変えたいときは、 if( scroll_wait >= 3 ) の3の部分を変更してください。数字が大きいほど遅くなります。 テキストエリアやスクロールボタンが何かのムービークリップの中にあるなど、階層の構造に違いがある場合は、ターゲットパスにご注意ください。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
お礼
詳しい説明ありがとうございました。 無事思ったとおりのスクロールボタンが完成しました。 ほんとに感謝してます!! ありがとうございました。