ムービークリップの初期座標に関する問題

このQ&Aのポイント
  • メインステージに配置したムービークリップの座標が整数値ではなく小数値で動いてしまう問題が発生しています。
  • プロパティではムービークリップの座標は整数値になっているのに、スクリプトで移動させると小数値で動いてしまいます。
  • 現在は条件分岐で整数値と小数値の両方を判断させていますが、なぜこの現象が起きるのか教えていただきたいです。
回答を見る
  • ベストアンサー

ムービークリップの初期座標

こんにちわ 今回はちょっと技術的な問題というより 気付いた所を質問させてください。 メインステージに配置したムービークリップが あるのですが、プロパティでは整数値になっています。 スプリクトにてそのムービークリップを移動させ IF文なんかで制御しようとしたらなかなか思ったように動きません。 (正確にいうと、あるルーチンを処理したら動いた) あれ?何故だろと思い試行錯誤した結果、 トレース機能で見てみれば最初の移動している ムービークリップが小数点を含んで動いていました。 なーんだ、じゃどこかのフレームで初期設定してやればいいのかと思い (プロパティでは整数なのにブツブツ・・・) 初期設定で整数値に座標をセットして動かすと またもやトレース内には少数値が・・・・ 今は仕方なく、判断させるIF文にOR判断させ 整数と少数の二本立てで判断させ上手く動いていますが これってどーゆー現象なのでしょうか。 お暇な時で結構なので教えてくださいませ。

  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

おそらく、「プロパティ」「情報」パネルで座標を計測する点とインスタンスの中心点の位置が違っているために、座標が微妙に狂っている(ように見える)のだと思います。 「プロパティ」と「情報」パネルで表示される座標は、オブジェクトの左上または中央の座標です。 どちらを表示するかは「情報」パネルで変更できます。 「情報」パネルに、小さい四角が並んだ図形があるかと思います。 この図形は左上と中央だけが■または□になっていて、クリックした方が黒い四角に変わります。 黒い四角が、現在座標を表示している部分を表しています。 例えば左上が■になっている状態では、オブジェクトの左上の座標が表示されています。 なお、円などの四角形以外のオブジェクトの場合は、オブジェクトに外接する四角形の左上と中央の座標になります。 ActionScript での _x と _y プロパティには、インスタンスの中心点の座標が入っています。 インスタンスの中心点とは、ステージに配置した時にインスタンスに表示されている+印(○と重なっている場合もあります)のことです。元になっているシンボルと必ず同じ位置に設定され、インスタンスごとに好きな位置に変更することはできません。 シンボルの編集画面を開いてみてください。 絵を描くスペースに、+印が表示されているかと思います。 この位置がシンボルの中心点になります。+印は移動できないので、絵の方を移動して中心点を決めます。 例えば、新しくシンボルを作り、シンボルの編集画面の+印を中心に円を1つ描いたとしましょう。 このシンボルから作られたインスタンスは全て、中心点が中央にあるインスタンスになり、_x と _y プロパティにも中央の座標が格納されます。 ちなみに、_xscale や _yscale で変形したり _rotation で回転させる時も、インスタンスの中心点が基準になります。 シンボルの中心点は左上または中央に限らず、都合のいい場所に決めることができます。 しかし、「プロパティ」「情報」パネルに表示できる座標は左上か中央のどちらかだけです。 中心点が左上または中央以外にあるインスタンスですと、「プロパティ」「情報」パネルに表示される座標と ActionScript の _x ・ _y プロパティの値は、どうやっても一致しません。 例えば中心点が中央にあるインスタンスを動かす際に、オブジェクトの左上の座標を表示している状態の「プロパティ」パネルで表示された座標値を信じてスクリプトを組んだのでは、座標をとる位置が違っているのですから、当然、誤差が生じます。 シンボルの編集画面を開き、+印の位置を確認してみてください。 左上または中央にある場合は、「情報」パネルで左上か中央の座標を表示するように設定すれば、「プロパティ」「情報」パネルに表示される座標と ActionScript の _x ・ _y プロパティの値が一致するようになります。 左上か中央以外にある、もしくは微妙にズレているようなら、分かりやすい位置に+印が来るように絵を移動して調整するか、「プロパティ」「情報」パネルに表示される座標との誤差を考慮してスクリプトを組む必要があります。 もっとも、編集中に表示される座標は小数点第1位まで(第2位以下を入力すると四捨五入される)ですが、ActionScript では第2位まで有効で、ほんのわずかながら誤差はあるようです。

irukacyan
質問者

お礼

なるほど、そういう意味だったのですか。 ご丁寧に指導頂きありがとうございました。 この文章をコピーして自分用のヘルプファイルに 保存し今後の役に立てたいと思います。 ありがとうございました。

関連するQ&A

  • ムービークリップ内のボタン

    MacOS10.2、FlashMXを使っています。 4つのムービークリップ(m_1、m_2、m_3、m_4)が下記スクリプトでコントロールされるように設定しました。 やりたいことは、ひとつひとつのムービークリップ内にボタンを設定し、クリックすると外部swfをstageに読み込むようにしたいのです。ムービークリップ内にボタンを設置しても動かないし、メインフレーム内に透明アイコンで on (release) { loadMovie ("●●.swf", "stage"); } を設定すると、4つのムービークリップが表示されたまま、●●.swfが表示されてしまいます。(stageムービークリップはフレームの一番上に設置しています) ●●.swfが読み込まれた時、4つのムービークリップが表示されないようにするにはどうすればよいでしょうか? よろしくお願いいたします。 メインフレーム内のスクリプト gdepth = 4; m_1.depth = 4; m_2.depth = 3; m_3.depth = 2; m_4.depth = 1; theArray = [m_1, m_2, m_3, m_4]; function turn() { theArray.sort(ncheck); function ncheck(a, b) { num1 = a.depth; num2 = b.depth; if (num1<num2) { return 1; } else if (num1>num2) { return -1; } else { return 0; } } trace(theArray) } function construction() { theArray[0].ta = 90; theArray[0].ts = 100; theArray[0].tr = 0; theArray[0].swapDepths(4); theArray[1].ta = 60; theArray[1].ts = 80; theArray[1].tr = 15; theArray[1].swapDepths(3); theArray[2].ta = 40; theArray[2].ts = 75; theArray[2].tr = 30; theArray[2].swapDepths(2); theArray[3].ta = 20; theArray[3].ts = 60; theArray[3].tr = 45; theArray[3].swapDepths(1); }

    • ベストアンサー
    • Flash
  • ActonScriptでムービークリップの移動

    お世話になります。ActonScriptでムービークリップの移動を考えているのですが記述が悪いためかうまくいきません。 ムービークリップのx座標が300を超えたら this._x -=10 ムービークリップのx座標が0未満になったら this._x +=10 という処理をしたいと思い onClipEvent (enterFrame) { if (_x>300){ var a = 1; } else if (_x<0){ var a = 2; } if (a=1){ this._x -=10; } else if(a=2){ this._x +=10; } } のように記述したのですが、this._x -=10しか認識してくれなくて、一方向にしか進みません。 どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ムービークリップの制御

    ムービークリップの制御に関してですが・・ 組み込んだムービークリップを、メインフレームから制御したいと思っています。 任意の位置で停止させたいのですが、gotoandstopでは、そのフレームまでジャンプしてしまいます。 「任意のフレームまで再生する」、といった制御はできないでしょうか? mc内に、if文にてstopを組み込む方法では、一回目の再生で停止せず、二回目の再生で止まる・・といった現象に悩んでいる為、メインフレームから停止フレームが指定できるような制御があればいいのですが・・ お手数ですが、良い方法をご存知の方がおられましたらお願いいたします。

  • AS3:ルートの変数とムービークリップ内の変数について

    AS3:ルートの変数とムービークリップ内の変数について ルートのタイムラインで設定した変数var RootVarがあるとして、これをあるムービークリップMCからMovieClip(root).RootVarで読み取って、MC内で何か処理をしたときMovieClip(root).RootVar++;とやってもルートのRootVarの値は変わりません。 例えば、 ■ルートのタイムライン1フレームに記述 var RootVar:uint; if(RootVar>=3){ trace("できた!!"); } ■ステージにあるムービークリップMCのタイムライン1フレームに記述 MovieClip(root).RootVar=0; var AddTimer:Timer = new Timer(1000,3); AddTimer.addEventListener(TimerEvent.TIMER,AddNum); AddTimer.start(); function AddNum(eventObject:TimerEvent):void { MovieClip(root).RootVar++; } ルートからムービークリップ、ムービークリップからルートへ変数に値を渡したり受け取ったりはできなのでしょうか? 変数の扱い方が問題なのでしょうか?よろしくお願いします。 環境:AS3、Flash CS4

    • ベストアンサー
    • Flash
  • ムービークリップ再生後次のフレームへ移動しません

    アクションスクリプトを使って、テキストが下から上へ流れるようにムービークリップを再生し、テキストが流れ終わったところで次のフレームへ移動させたいのですが、フレームが移動せず困っています。 スクリプトは色々なところで調べて、やっとの事で下記のように書きました。 使用しているのはFlash MX 2004 です。 |○  □|○|  ←1.スクリプトレイヤー |●    □|  ←2.ムービークリップレイヤー |○|●→|●|  ←3.ムービークリップ後に再生したいレイヤー 1.のスクリプト(2つのキーフレームいずれとも) stop(); 2.のムービークリップのスクリプト onClipEvent (load) { spd =5; onClipEvent (enterFrame) { this._y = this._y-spd; if (this._y<=-10) { spd = 0; gotoAndPlay(2); } } 知り合いにお見舞いのメッセージをと思って作ったのですが、送ることが出来なくてとてもあせっています。 どうぞよろしくお願いします。

    • ベストアンサー
    • Flash
  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • AS3リンケージ設定したムービークリップの中で、フレーム移動がしたいです。

    初心者です。 AS3で、 リンケージ設定したムービークリップを addChildで呼び出し、 呼び出したムービークリップの中の、 指定したフレームに移動するにはどうしたら宜しいでしょうか。 ステージに配置した場合、インスタンス名を付けて インスタンス名.gotoAndPlay("フレームラベル"); で移動しますが、 リンケージ設定したムービークリップの場合はインスタンス名の代わりに リンケージ名で呼び出せないのですか。

    • ベストアンサー
    • Flash
  • ムービークリップがマウスカーソルを追いかけ、マウスカーソルと同じ位置に来たときにムービークリップを変えたい

    以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム2に移動しません。 ドラゴンクエストVIIIのトップページのFlashのような 表現をしたいのですがうまくいきません。 http://www.square-enix.co.jp/dragonquest/eight/ _mc.onEnterFrame = function() { this._x += ( _root._xmouse - this._x ) / 5; if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); else this._mc.gotoAndStop(1); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

    • ベストアンサー
    • Flash
  • テキスト入力と同じ名前のムービークリップを配置したい

    FLASH8を使っています。 動物のムービークリップがいくつかあり、シンボルプロパティで名前と識別子を同じものに設定しました。例えば「うま」というようにひらがなで同じ名前が入力されています。 リンケージの「ActionScriptに書き出し」と「最初のフレームに書き出し」にはチェックが入っています。 ステージ上のテキストフィールドに「うま」と入力し、ボタンをクリックすると同じ名前のムービークリップシンボルがステージ上に配置されるようにしたいのですが、どのように書けばいいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • (AS3)ムービークリップからメインタイムラインにある関数を呼び出したい

    質問はタイトルの通りです。 実は以前同じ質問(http://oshiete1.goo.ne.jp/qa3811855.html)をしましたところ、次のような回答をいただきました。 「 [メインタイムライン] function aaa(){ trace("ok") } [testMC] this.addEventListener(MouseEvent.CLICK , onClick) var rootObj:MovieClip = this.root as MovieClip; function onClic(event:MouseEvent):void{ rootObj.aaa(); } 」 たしかに、この方法はムービークリップ(testMC)をステージに手動で配置したときには有効でしたが、stage.addChild()を使って配置したときには関数を呼び出すことができませんでした。 ちなみに、呼び出そうとすると次のようなエラーがでます。 「 ReferenceError: Error #1069: flash.display.Stage にプロパティ aaa が見つからず、デフォルト値もありません。 」 stage.addChild()で配置したムービークリップから、メインタイムラインの関数を呼び出すにはどうすればよいのでしょうか? 困っています。どうか力を貸してください。

    • ベストアンサー
    • Flash

専門家に質問してみよう