FLASHアクションスクリプトでオブジェクトを常にセンター表示させる方法とは?

このQ&Aのポイント
  • アクションスクリプトを使用して、FLASHの画面上でオブジェクトを常にセンターに表示する方法について質問があります。
  • 具体的には、オブジェクトを座標x600 y500で始まるように設定し、画面のサイズを拡大縮小してもオブジェクトが常にセンターに表示されるようにする方法を教えてください。
  • また、提供されたアクションスクリプトではオブジェクトが指定の位置に表示されるものの、画面サイズの変更に伴って動きがなくなってしまいます。そのため、より正確にオブジェクトをセンターに表示する方法を知りたいです。
回答を見る
  • ベストアンサー

FLASH アクションスクリプト

画面のサイズを拡大縮小しても 常にセンターに表示させる アクションスクリプトで質問がございます。 back_mcが【背景】 main_mcが【オブジェクト】 _root.main_mc._x = ( Stage.width - _root.main_mc._width ) /2; _root.main_mc._y = ( Stage.height - _root.main_mc._height) /2; このアクションスクリプトで【オブジェクト】が最初から常にセンター表示になる事は分かるのですが、例えば座標x600 y500で始まるようにするのはどうしたら良いのでしょうか。 下記のアクションスクリプトでは、【オブジェクト】がx600 y500の位置に最初はあるのですが画面のサイズを拡大縮小してもピクリとも動きません。 Stage.align = "TL"; Stage.scaleMode = "noScale"; Stage.addListener(this); this.onResize = function() { _root.main_mc._x = 600;( Stage.width - _root.main_mc._width ) /2; _root.main_mc._y = 500;( Stage.height - _root.main_mc._height) /2; _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; } this.onResize(); いまいち分かりにくい質問ですが伝わりますでしょうか。 分かる方、宜しくお願い致します。

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

まず大前提の確認ですが, back_mc【背景】も,main_mc【オブジェクト】も, 基準点を左上のコーナーにしてあるムービークリップですよね (基準点の座標によってスクリプトは変わります)。 また,back_mc【背景】も,main_mc【オブジェクト】も, _root の直下に配置されていますよね。 そういう前提だと, ご質問の日本語通りにスクリプトを書き直すと次のようになります。 ----------------------------------- Stage.align = "TL"; Stage.scaleMode = "noScale"; // // main_mc を初期座標 (600,500) に配置 _root.main_mc._x = 600; _root.main_mc._y = 500; // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; // // この階層(MC)を Stage クラスのリスナーとして登録 Stage.addListener(this); // // ステージのサイズが変わった時に実行 this.onResize = function() { // main_mc を ステージ中央に配置 _root.main_mc._x = (Stage.width-_root.main_mc._width)/2; _root.main_mc._y = (Stage.height-_root.main_mc._height)/2; // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; }; ----------------------------------- ActionScriptという言語や, 座標の計算のなどの問題ではなくて, 肝腎の 「何がどうなったときに何をどうしたいのか」 ということ。 これがコーディングに欠けていると思います。 『最初はx=600,y=500 でステージがリサイズされたときに 中央』 これをそのままスクリプトにすると(コーディングすると), 上のようになると思います。 ======================= ちなみにどうでも良いことですが, 「私の個人的な好みのイメージ」として 上のようなスクリプトにしても 私が思う良い動き ではありません。 また,そうする意味をあまり感じません。 個人的には次のような動きにすると, x=600,y=500 にする意味もわかりますし,イメージ的にもしっくり来ます。 ----------------------------------- Stage.align = "TL"; Stage.scaleMode = "noScale"; // // 中央配置するスピードの変数 spd を設定 // (0以上1未満の数で好みによって変える) spd = 1/8; // // main_mc を初期座標 (600,500) に配置 _root.main_mc._x = 600; _root.main_mc._y = 500; // // この階層(MC)を Stage クラスのリスナーとして登録 Stage.addListener(this); // // ステージのサイズが変わった時に実行 this.onResize = function() { // back_mc のサイズをステージ全体に合わせる _root.back_mc._width = Stage.width; _root.back_mc._height = Stage.height; // 表示を即更新 updateAfterEvent(); }; // 上の this.onResize を即実行 this.onResize(); // // 1フレーム進む時間毎に随時実行 this.onEnterFrame = function() { // main_mc を ステージ中央に徐々に移動 _root.main_mc._x += ((Stage.width-_root.main_mc._width)/2-_root.main_mc._x)*spd; _root.main_mc._y += ((Stage.height-_root.main_mc._height)/2-_root.main_mc._y)*spd; }; ----------------------------------- back_mc【背景】 は, 最初表示されたときも,ステージのサイズが変わったときも, ステージのフィットさせています。 一方, main_mc【オブジェクト】 は, x=600,y=500 から徐々に中央配置させています。 つまり, back_mc【背景】 も main_mc【オブジェクト】 も, 全く別のタイミングで全く別の動きをさせています。 イベントハンドラも別々です。 上のスクリプトのようにするにしても,下のスクリプトのようにするにしても, どっちにしても, 「何がどうなったときに何をどうしたいのか」 をしっかりと持つことが肝腎だと思います。

m-----c
質問者

お礼

ご親切にありがとうございました。 とても勉強になりました。

その他の回答 (1)

  • ryo2501
  • ベストアンサー率46% (15/32)
回答No.1

Stage.scaleMode = "noScale"; Stage.align = "TL"; main_mc._x = 600; main_mc._y = 500; var stage_obj :Object = new Object(); stage_obj.onResize = function() {   onEnterFrame = mover; } function mover() {   var sx :Number = Stage.width / 2;   var sy :Number = Stage.height / 2;   main_mc._x += (sx - main_mc._x) / 5;   main_mc._y += (sy - main_mc._y) / 5; } Stage.addListener(stage_obj);

m-----c
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • フルウィンドウのFlash Firefoxなどでずれる

    http://creator.job-stage.jp/guide/fla_sample/flash_0001.html のサイトを参考にしてフルスクリーンのサイトを作っています。 Firefoxなどで確認したところ、 中央部に表示されず上半分にずれてしまいます。 Firefox用などのスクリプトが必要ですか? //1. ステージ クラスを宣言。 flStage.align = "LT"; Stage.scaleMode = "noScale"; //2. レイアウトの関数を宣言。 function LayOut() { _root.MC_Logo._x = 50; _root.MC_Logo._y = 50; _root.MC_CopyRight._x= Stage.width - _root.MC_CopyRight._width-20; _root.MC_CopyRight._y= Stage.height - 20; _root.MC_main._x = (Stage.width - _root.MC_main._width)/2; _root.MC_main._y = (Stage.height- _root.MC_main._height)/2; } //3. ブラウザーをリサイズした時の設定。 myListener = new Object(); myListener.onResize =function() { LayOut(); break; }; Stage.addListener(myListener); LayOut();

    • ベストアンサー
    • Flash
  • acttionscript2.0から3.0へ。。。(-.-)

    acttionscript2.0から3.0へ。。。(-.-) どなたか、AS2.0で記述されたスクリプトをAS3.0に書き換えていただけないでしょうか? ユーザーのモニター解像度・大きさに合わせてブラウザー内で100%・ フルスクリーンで表示させたい場合、 どういったActionScriptを書けばいいのかと考えて 2.0でのスクリプトは手に入ったのですが。。 すいません、どなたかよろしくお願いいたします。 Stage.align = "LT"; Stage.scaleMode = "noScale"; function LayOut() { _root.MC_Logo._x = 50; _root.MC_Logo._y = 50; _root.MC_CopyRight._x = Stage.width - _root.MC_CopyRight._width- 20; _root.MC_CopyRight._y = Stage.height - 20; _root.MC_main._x = (Stage.width - _root.MC_main._width)/2;// x 座標を中央にスクリプトで計算。 _root.MC_main._y = (Stage.height - _root.MC_main._height )/2;// y 座標を中央にスクリプトで計算。 } myListener = new Object(); myListener.onResize = function() { LayOut(); break; }; Stage.addListener(myListener); LayOut(); stop();

    • ベストアンサー
    • Flash
  • acttionscript2.0から3.0へ。。。(-.-)

    acttionscript2.0から3.0へ。。。(-.-) どなたか、AS2.0で記述されたスクリプトをAS3.0に書き換えていただけないでしょうか? 下記サイトにAS2.0で記述されていました。 http://creator.job-stage.jp/guide/fla_sample/flash_0001.html そして上記サイトよりダウンロードしたflaに記述されていたスクリプトが下記です。 さらにその下には上記サイト内に記述されていてものも載せています。 Stage.align = "LT"; Stage.scaleMode = "noScale"; //----------------------------------------------------- //ここから、【関数】レイアウトの設定。 //各ムービークリップの座標を設定します。 //----------------------------------------------------- function LayOut() { //ムービークリップ「MC_Logo」の座標を設定 _root.MC_Logo._x = 50; _root.MC_Logo._y = 50; //ムービークリップ「MC_CopyRight」の座標を設定 _root.MC_CopyRight._x = Stage.width - _root.MC_CopyRight._width- 20; _root.MC_CopyRight._y = Stage.height - 20; //ムービークリップ「MC_main」の座標を設定 _root.MC_main._x = (Stage.width - _root.MC_main._width)/2;// x 座標を中央にスクリプトで計算。 _root.MC_main._y = (Stage.height - _root.MC_main._height )/2;// y 座標を中央にスクリプトで計算。 } //----------------------------------------------------- //ここから、リサイズ時の設定を行います。 //----------------------------------------------------- myListener = new Object(); myListener.onResize = function() { LayOut(); break; }; Stage.addListener(myListener); LayOut();//最後に、ロード完了時に一度、レイアウト用、関数「UpDate」を実行させる。 stop(); ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ ここからがサイト内に記述されていたスクリプトです。 //1. ステージ クラスを宣言。 flStage.align = "LT"; Stage.scaleMode = "noScale"; //2. レイアウトの関数を宣言。 function LayOut() { _root.MC_Logo._x = 50; _root.MC_Logo._y = 50; _root.MC_CopyRight._x= Stage.width - _root.MC_CopyRight._width-20; _root.MC_CopyRight._y= Stage.height - 20; _root.MC_main._x = (Stage.width - _root.MC_main._width)/2; _root.MC_main._y = (Stage.height- _root.MC_main._height)/2; } //3. ブラウザーをリサイズした時の設定。 myListener = new Object(); myListener.onResize =function() { LayOut(); break; }; Stage.addListener(myListener); LayOut();

    • ベストアンサー
    • Flash
  • アクションスクリプト 

    下記のアクションスクリプトで徐々に目標値へ近づけたいのですが、 うまくいきません。 わかる方よろしくお願いします! btn.onRollOver = function() { clearInterval(myID); for (var i:Number = 1; i<=Max; i++) { if (this.id != i) _root["btn"+i].thumb._y = 0 _root["btn"+i].name_txt._y = 20; _root["btn"+i].frame_mc._y = -2; _root["btn"+i].frame_mc.transform.colorTransform = downColor; } else { this.thumb._y = -5 this.name_txt._y = 15              this.frame_mc._y = -6 } }

    • ベストアンサー
    • Flash
  • ASで降らせた雪のマスクの掛け方について。

    下記のサイトのASを使用させていただき、雪の降るFlashを作成したのですが、 参照サイト : http://www.webdesignlibrary.jp/2006/06/flash_snow.php このスクリプトで降らせた雪を、例えば星型の図形をマスクにして、 その範囲内で雪が降るようにしたいと思い、 色々と丸一日掛けて調べたのですが、全く上手く行きません。 とりあえず、色々と調べてみた結果、 【 xxx.setMask 】 を使えば良いのだろうか・・?、、、と言う所までは 行き着いたのですが、スクリプトを、どう改造?してみても、全く思う結果が得られません。 【 _root.setMask 】 で、ステージ全体を、目的の図形MCでマスクする事で、 思う結果に近しいカタチは出来たのですが、_root.setMask でステージをマスクしてしまうと、 例えば、マスク外に何か画像処理を施したくても、マスク外の画像は全て消えてしまいますし、 その画像の大きさ込みでマスクを作成すると、その画像の上にも雪が降ってしまうので、 完全に行き詰ってしまっています。 ASで降らせた雪だけをマスクする方法はありますでしょうか? どなたか、ご存知の方がいらっしゃいましたらば、 是非にご教示願えますと、大変ありがたいです。  何卒よろしくお願い申し上げますm(_ _)m 以下、使用AS ------------------------------------------------ width = 550; height = 400; total = 200; for (var t = 0; t != total; t++) { var mc = _root.attachMovie("snowflake", "snowflake"+t, _root.getNextHighestDepth()); mc._x = (Math.random()*(width+20))-10; mc._y = (Math.random()*(height+20))-10; mc.yspeed = (Math.random()*1.75)+0.25; mc.speed = (Math.random()*3)+2; mc._xscale = mc._yscale=(mc.speed+mc.yspeed)*10; mc.onEnterFrame = function() { var angle = Math.atan2(_root._xmouse-(width/2), _root._ymouse)+1.5707963267949; this._y += Math.sin(angle)*this.speed+this.yspeed; this._x += Math.cos(angle)*this.speed; if (this._x>width+10) { this._x = -10; } else if (this._x<0-10) { this._x = width+10; } if (this._y>height+10) { this._y = -10; } else if (this._y<0-10) { this._y = height+10; } }; } ------------------------------------------------ 【 AS使用環境 】 Adobe Flash CS3, アクションスクリプト2.0

    • ベストアンサー
    • Flash
  • flashの画面全体で表示

    はじめまして。 質問させてください。 flashで背景画像のみを画面いっぱいに表示して 他のムービクリップはブラウザの大きさに左右されずサイズと場所を固定したくて 下記のように記述しました。 ---------------------------------------------- bg_h = _root.bg._height/_root.bg._width; Stage.scaleMode = "noScale"; Stage.align = "TL"; function setPosition() { _root.bg._width = Stage.width; _root.bg._height = bg_h*_root.bg._width; _root.rogo._x = 10; _root.rogo._y = 10; } ls = new Object(); ls.onResize = setPosition; Stage.addListener(ls); ---------------------------------------------- 上記だとブラウザのサイズが縦長になってしまうと下に大きく白い余白が空いてしまいます。 "noBorder"の使った時のように比率の差が大きい方のサイズに合わせたいのですが どうすれば良いのかわかります。 ご存知の方がいらしたら教えて頂ければと思います。 よろしくお願い致します。

  • 1フレームにActionを設定したときの止め方

    ただ今flash勉強中の初心者です。検索したり本を調べたりしても根本が理解できていないためか、解答策が見つからず困っています。 自分で作ったものではないのですが、1フレーム目にActionを書いています。動きとしては、テレビの砂嵐のような画面に、二種類の文字がランダムに出て、ラインもランダムに出てくるという感じです。以下のscriptだと永遠と続くのですが、5秒ぐらいランダムに文字とラインが出て、その後砂嵐の画面だけにして止めたいのですが、どうしたら良いかわかりません。 使用しているソフトはFlash8、MacOSX10.4です。 import flash.display.BitmapData; var tv_noise:BitmapData = new BitmapData(Stage.width,Sage.height,true); _root.attachBitmap(tv_noise,20); _root.attachMovie("text1","text_1",3); _root["text_1"].scale = 350; _root["text_1"].onEnterFrame = random_me; _root.attachMovie("text2","text_2",2); _root["text_2"].scale = 350; _root["text_2"].onEnterFrame = random_me; _root.attachMovie("line","line_1",1); _root["line_1"]._y = Stage.height/2; _root["line_1"]._alpha = 40; _root["line_1"].onEnterFrame = scale_me; function random_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); this._y = 10+Math.round(Math.random()*Stage.height); this._xscale = this._yscale = Math.round(Math.ramdom() *this.scale); this._alpha = 10+Math.round(Math.random()*100); } function scrach_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); tv_noise.noise(Math.round(Math.random()*100000),80,170,8,true); } 宜しくお願いします。

    • ベストアンサー
    • Flash
  • スライドバーのアクションスクリプト

    いつも大変お世話になっております。 伸び縮むサイドバーを作っているのですが、伸ばしたまではいいのですが、元の位置に戻すほうがどうもうまくいきません。 以下、途中まで書いたスクリプトです。 ■.recruit_mcがバーの部分になります。 onClipEvent (load) { _root.recruit_mc._x = 859; _root.recruit_mc._y = 272; } onClipEvent (enterFrame) { rec_to_button.onRelease = function() { _root.recruit_mc.onEnterFrame = function() { if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } }; }; } -------------------------------------------------------------- if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } の箇所で else を使って、逆の場合をいろいろと書いているのですが どうもうまくいきません。 ボタンを押したら859→620まで移動、またボタンを押したら620→859 まで移動するようにするには、あとどう書き加えればいいですか? ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • アクションスクリプトについて

    今シューティングゲームで画面の右から敵がきて左に向かってくflashを作ってるのですが、 敵が画面から消えてまた右端から出てくるときに下や上すぎて体が半分しか見えない ときがあります。 なのでy軸を制限したいのですが、どうすればいいのでしょうか? よろしくお願いします。 onClipEvent(enterFrame) { if (_x < 0) { _rotation = 0; _x = Stage.width; _y = Math.random() * Stage.height; }

    • ベストアンサー
    • Flash
  • マウスカーソルに応じたmcのスクロール(ループ型)

    マウスカーソルに応じて、複数配置してるmcがカーソルに合わせてスクロールして、ステージからはみ出したら、はみ出した側のステージの反対から出てくるっていうscriptを作ったのですが、うまくいきません。ループしてくれないんです。 ---- _root ---------------------- menu.mcというのがあり、そのmcの中にmenu01.mc、menu02.mc、menu03.mc・・・という感じでmcが配置してあります。menu.mc自体に別のスクリプト掛けてるので、こういう形にしてます。 ---- _root>menumc ---------------------- menu01.mcなどそれぞれのmenuのmcが入ってます。 さらに、それぞれのmcの中にscroll.mcというのをおき、そのscroll.mcにscriptが書いてあります。 ---- _root>menu.mc>menu01.mc 内scroll.mcのscript------ _visible = false; center = Stage.width/2; halfWidth = _parent._width/2; this.onEnterFrame = function() {  with(_parent){  //Scroll Speed   if (_root._xmouse<=180 || (_root._xmouse>250) && (_root._xmouse<=429)) {    moveX = (center-_root._xmouse)/15;   }else if(_root._xmouse>180 && _root._xmouse<=250){    moveX = 0;   }   _x = _x+moveX;   //Return Scroll   if(_x > Stage.width+halfWidth){    _x -= _width+Stage.width;   }else if(_parent._x < -halfwidth){    _x += _width+Stage.width;   }  } }; --------------------- で、これだときちんと思ったような動きでスクロールはするんですが、ただループしてくれないんです。しかもスクロールする毎にそれぞれのmcの間隔がずれてる気がします。最悪の場合だと、mcの上に別のmcが重なったりしてます。 なぜ、このような現象になってしまうのでしょうか?