- ベストアンサー
スクロール画面
下記内容を参考にまずサンプルを作っています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=974758 使用versionはMXのバージョン6です。 作成し、パブリッシュすると、スクロールバーは表示でき、クリックするとスクロールバーやスライダは動いたものの、画像(上記参考ページでのムービークリップ「sheet」)が動きません。 手順としては個々のムービークリップを「ムービークリップsheet」に配置し、シーン1で「sheet」を配置しその上にマスクレイヤー、その上にスクリプトレイヤー、一番下にはスクロールバーのレイヤーを配置し、スクロールバーには「sc_bar」のインスタンス名をつけています。配置はX座標0にしていますがマスクの矩形のみ、X座標を0にするとマスク矩形の中心が用紙の左端に来てしまいます。これが何か関係あるのでしょうか。スクロールバーや、ムービークリップ「sheet」はx0地点の用紙の左端に揃っています。ムービークリップが動かない原因として何が考えられるでしょうか?わかる方、すみません、。教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
その質問に回答した者です。 スクリプトはどこに書いていますでしょうか? ご紹介したスクリプトは階層の指定が相対パスになっていますので、スクリプトを書く階層も重要です。 タイムライン ┗(マスク) ┗ sheet ┃ ┗画像 ┗スクロールバー( sc_bar ) このような階層構造にして、スクリプトは全て、一番上の階層のタイムラインに設定する設計になっています。 なお、階層構造とはレイヤーの重なり順ではなく、ムービークリップがどのタイムラインに配置されているか、です。 この図では、同じ字下げ幅( sheet とスクロールバーなど)のものは、同じタイムライン上にあるという意味です。 No.974758 でご紹介したサンプルですと、スクリプトも含めて、1つのムービークリップシンボル” ScrollPane もどき”として作っています。 ScrollPane もどき ┗(マスク) ┗ sheet ┃ ┗画像 ┗スクロールバー( sc_bar ) スクリプトは、” ScrollPane もどき”シンボルのタイムラインで実行するものとして組んでいます。 ご質問文の例ですと、sheet や ScrollBar コンポーネントをステージに直接置いているとのことですので、 _root ┗(マスク) ┗ sheet ┃ ┗ムービークリップ ┗スクロールバー( sc_bar ) おそらく、このような構造になっていると思います。 スクロールバーを制御するスクリプトは _root、つまりメインのタイムラインに、フレームアクションとして設定してください。 実は、No.974758 の質問には続きがあります。 同じく sheet が動かないという質問ですが、sheet にスクリプトを書いている点と、関数を定義するタイミングと登録するタイミングが合わないことで失敗しているようです。 ・ルートとムービークリップの関係について http://okweb.jp/kotaeru.php3?q=989128 ---------------------------------------------- ScrollBar コンポーネントはトラックとスライダ・上下移動用のボタンからできており、スライダをドラッグするとトラック内を移動する機能は、基本的な動作として最初から提供されています。 従って、スクリプトを書かなかったりスクリプトが間違っていたとしても、スクロールバーは表示されますし、スライダを動かすことはできます。 しかし、これではスクロールバーがただ空回りしているだけです。 スクロールバーとムービークリップが連動しない原因でよくあるのは、 ・スクロールさせるムービークリップのターゲットパスや、インスタンス名が間違っている ・ setChangeHandler で登録する関数が、正しく登録されていない といったものです。 いずれも、ターゲットパス(階層の指定)やインスタンス名・関数名などが原因です。 複数のムービークリップが関係するので、階層やターゲットの指定は大切です。ターゲットパスやインスタンス名に誤りがないか、確認してみてください。 setChangeHandler で登録した関数が呼び出されているかどうかは、trace アクションを利用して確認できます。 Sheet_Scrolling 関数のどこかに trace( "call" ); というアクションを入れてみてください。 正常に呼び出されていれば、スライダを動かす度に「出力」パネルに” call ”と表示されます。 何も反応がないようなら、sheet を移動させる関数自体が、そもそも呼び出されていません。 この場合は、関数を定義した階層や、setChangeHandler に渡す関数名(第1引数)および関数のある階層の指定(第2引数)あたりに問題がありそうです。 sheet が動くには動くけれど、位置がズレる・動き方がおかしい場合は、スライダの位置情報から sheet の位置を決める処理に問題があります。 横スクロールの場合ですと、X = 0 の位置に配置すると、スライダの位置と sheet の位置を直接対応させることができるので、スクロールバーの原理を考えやすくなります。 ただ、ステージに sheet やスクロールバーを直に置くと、X = 0 (ステージでは画面の左端)以外の場所に置きたい時には、sheet を動かす時にもともとのX座標がズレている分だけ補正の値を加えなければならず、融通が利かないスクリプトになってしまいます。 (ちなみに、 No.974758 の#3の回答が、これと似た話題になっています) スクロールバーや sheet とスクリプトを1つのムービークリップの中にまとめると、スクリプト上は X = 0 を基点にした処理になっていても、ステージにはどこにでも配置できます。 ---------------------------------------------- ところで、マスクの件ですが。 「プロパティ」パネルで表示される座標は、オブジェクトの左上か中央のどちらかです。 どちらを表示するかは、「情報」パネルで変更できます。 表示される座標のことや変更の方法は、以前他の質問でご紹介しましたので、よろしければご参照ください。 ・物体の座標 http://okweb.jp/kotaeru.php3?q=1285895 マスク画像のX座標を0にすると中央が左端に来るとなると、「プロパティ」パネルにはオブジェクトの中央の座標が表示されていると思われます。 マスク画像の幅の半分の値を指定するか、「情報」パネルで左上の座標を表示するように変更してから 0 を入力してみてください。 マスクの配置がズレていると、sheet が正しく動いても表示される範囲がズレるだけで、sheet が全く動かないこととは関係ありません。
お礼
DPEさん、回答ありがとうございます。前回のNo.974758 と同じく詳しい解説、解かりやすいです。座標の位置は教えていただいた方法で解決し、関数の呼び出しはtrace関数で試したところ、プレビュー時しか「call」は表示されず、スライダクリック時にはなにも変わりませんでした。 それとご指摘いただいた階層もその通りでした。「もどき」はすべてムービークリップ上に作るのですね。 今回頂いたアドバイス、urlを参考にもう一度やり直してみます。私にはもう少し時間がかかりそうなのでいったん締め切らせていただきます。もしかしたらまた質問させていただくかもしれません。その際はよろしくお願いいたします。ありがとうございました。