• 締切済み

ブラウザサイズに合わせてオブジェクトをリサイズする方法について

FLASH CS3 ActionScript3.0での質問です。 http://oshiete1.watch.impress.co.jp/qa5140171.html の質問を参考に 背景画像がブラウザサイズにより拡大縮小するFLASH制作を 試みたのですが、下記のエラーとなってしまいます。 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at sb_fla::MainTimeline/arrangeMC() at sb_fla::MainTimeline/sb_fla::frame1() 上記URLページを参考にすこしだけ変更して // ムービー内の拡大縮小なし stage.scaleMode = StageScaleMode.NO_SCALE; // 整列の基準を左上にする stage.align = StageAlign.TOP_LEFT; // 「back_mc」 の初期横幅と高さを変数に記録しておく var bw:Number = back_mc.width; var bh:Number = back_mc.height; // MC を整列させる関数 arrangeMC を定義 function arrangeMC():void{ // // ローカル変数 sw にステージの幅を代入 var sw:int = stage.stageWidth; // ローカル変数 sh にステージの高さを代入 var sh:int = stage.stageHeight; // // 「loader_mc」をステージ中央に配置 loader_mc.x = sw/2; loader_mc.y = sh/2; // // 「main_mc」をステージ中央に配置 main_mc.x = sw/2; main_mc.y = sh/2; // // 「galleryback_mc」をステージ下に配置 main_mc.x = sw/2; galleryback_mc.y = (sh-sh)+720; // // 「back_mc」をステージの "幅に合わせて" リサイズ back_mc.width = sw; back_mc.height = bh/bw*sw; // 「galleryback_mc」をステージの "幅に合わせて" リサイズ galleryback_mc.width = sw; } // 上で定義したarrangeMCを即実行 (初期表示用) arrangeMC(); // 関数 stageOnResize を定義 function stageOnResize(evt:Event):void { // 上で定義したarrangeMCを実行 (リサイズ時用) arrangeMC(); } // ステージにイベントリスナーを登録 //引数(ステージリサイズ時に実行、実行関数stageOnResize) stage.addEventListener(Event.RESIZE, stageOnResize); というふうにしました。 タイムライン上には loader_mc. main_mc galleryback_mc(サイズ変更) back_mc(サイズ変更) のムービークリップを配置しています。 今回のエラーについていろいろ調べたのですが ActionScriptよりのムービークリップ配置ではなくじかにタイムライン上に配置することが問題なのでしょうか・・・ エラー回避できませんでした・・・ なにとぞご回答よろしくお願いいたします。 またこの他に良い方法があれば是非お教え下さい。

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

みんなの回答

回答No.1

> ActionScriptよりのムービークリップ配置ではなくじかにタイムライン上に配置することが問題なのでしょうか・・・ それは問題ではありません. TypeError: Error #1009: このエラーはまだ、または既に参照できない オブジェクト(のプロパティまたはメソッド)に アクセスしようとしたときに起こります.(そのままですが…) メインタイムライン1フレーム目にご質問のASを書いておられますが、 loader_mc main_mc galleryback_mc(サイズ変更) back_mc(サイズ変更) 配置されているという以上のオブジェクトのうち、 いずれかが当該フレームではまだ登場していないのでは、と思います、 (ex.3フレーム目に配置)違っていたらすみません. もし上記のようなミスだった場合は以下を試してみてください. 最小限の修正で、且つ1フレーム目より後に オブジェクトを登場させたい場合は、 後で登場させるオブジェクト内1フレーム目に 以下のスクリプトを書きます. ここでは例としてmain_mcを後から登場させるものとします. //////////メインタイムライン 1フレーム目スクリプト修正 //ローカル変数としてではなくタイムライン変数として保持 var sw:int = stage.stageWidth; var sh:int = stage.stageHeight; // MC を整列させる関数 arrangeMC を定義 function arrangeMC():void{ sw = stage.stageWidth;//新しいステージ幅を取得 sh = stage.stageHeight;//新しいステージ高を取得 loader_mc.x = sw/2; loader_mc.y = sh/2; //main_mc.x = sw/2;←■削除 //main_mc.y = sh/2;←■削除 //main_mc.x = sw/2;//←■削除 ~~ (以下同) ---------------------------- //////////main_mc内 //リサイズ用リスナーをステージのリサイズイベントに登録 stage.addEventListener(Event.RESIZE, mainResize); //リサイズ用リスナー関数 //通常の関数として呼び出せるようイベントオブジェクトに //デフォルト値(null)を設定 function mainResize(e:Event = null):void { this.x = MovieClip(root).sw/2; this.y = MovieClip(root).sh/2; } //初回登場時に(通常の関数として)実行 mainResize();

関連するQ&A

  • fhashフルブラウザサイトのページ移動で困ってます、、

    フルブラウザの固定配置サイトを勉強してます。【CS4、AS3】 過去掲載http://oshiete1.goo.ne.jp/qa5140171.html を参考にさせてもらってます。 TOPページはうまくいったのですが ページ移動で別のページにいくと背景画像(TOPと別画像)が原寸表示になってしまいます、、(なぜかブラウザ画面自体をさわると直るのですが) 当方の浅い考えでは 各背景画像MCのインスタンス名を同じ「back_mc」にしているからと思っていますが、そうしないと表示もできません、、 どなたか教えてください。 よろしくお願いします。 以下は1フレーム目に書いているソースです。 添付はフレーム画面です。 stage.scaleMode = StageScaleMode.NO_SCALE; stage.align=StageAlign.TOP_LEFT; var bw:Number = back_mc.width; var bh:Number = back_mc.height; function arrangeMC():void{ var sw:int = stage.stageWidth; var sh:int = stage.stageHeight; //以下固定配置分 contents_mc.x = sw/24; contents_mc.y = sh/2+20; menu_mc.x = sw-60; menu_mc.y = sh/2-30; footer_mc.y = sh-10; if(bh/bw > sh/sw){ back_mc.width = sw; back_mc.height = bh/bw*sw; }else{ back_mc.height = sh; back_mc.width = bw/bh*sh; } } arrangeMC(); function stageOnResize(evt:Event):void { arrangeMC(); } stage.addEventListener(Event.RESIZE, stageOnResize);

  • ActionSccript3.0 クラスについて

    Flash 初心者です。 現在AS3を勉強して半年くらいになります。一通り仕組みは理解できたのですが、2つのクラスを合わせて使うときに詰まってしまいました。内容は、 フルフラッシュで背景画像はリサイズ可能でメニュー・フッター等のサイズが固定のクラス 『BgSet.as』 package { import flash.events.Event; import flash.display.*; import flash.text.TextField; import flash.display.StageAlign; import caurina.transitions.Tweener; public class BgSet extends MovieClip { private var parH:Number; private var parW:Number; public function BgSet() { init(); } private function init():void{ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.BOTTOM_RIGHT; var bw:Number = back_mc.width; var bh:Number = back_mc.height; function arrangeMC():void{ var sw:int = stage.stageWidth; var sh:int = stage.stageHeight; menu_mc.x = sw; main_mc.x = sw/2; main_mc.y = sh/2; footer_mc.y = sh; logo_mc.x = sw; logo_mc.y = sh; back_mc.width = sw; back_mc.height = bh/bw*sw; } arrangeMC(); function stageOnResize(evt:Event):void { arrangeMC(); } } } } と、 背景画像にビットマップでドットを敷き詰めるクラス 『BgBtm.as』 package { import flash.display.BitmapData; import flash.display.Sprite; public class BgBtm extends Sprite { public function BgBtm() { var bmd:BitmapData = new BitmapData(3, 3, true, 0x00ffffff); bmd.setPixel32(0, 0, 0xffffffff); bmd.setPixel32(1, 1, 0xffffffff); var sp:Sprite = new Sprite(); sp.graphics.beginBitmapFill(bmd, null, true, false); sp.graphics.drawRect(0, 0, 1200, 1200); sp.graphics.endFill(); addChild(sp) } } } この二つのクラスを一つずつ実行することは問題なく出来るのですが、二つの.asファイルを『Main.as』から呼び出して実行しようと思いフォルダ『MyProgram』に入れました。 それぞれ package MyProgram{ として、 Main.asは package { import flash.display.MovieClip; import MyProgram.*; としたまでは良かったのですがこの先でつまづいています。。 ここまでで出てきた問題は、 1、BgSetのback_mc・menu_mcへアクセス出来ない。 2、BgBtmのビットマップが表示されない 3、仮にBgSetをflaファイルのドキュメントクラスに定義してBgSet.as内からBgBtmをnewして実行した場合でもビットマップが表示されない。 ということが起きています。 Main.asファイルをいろいろと書き換えて試しているのですが答えが出ません。 どなたかご教授お願い致します。

    • ベストアンサー
    • Flash
  • FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定

    FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定 FLASH:: ブラウザ領域にあわせて背景をリサイズ、その後固定 WEBほぼ初心者ですが、ネットで検索しながら、フルフラッシュの可変レイアウトサイト作成に挑戦中です。 ステージは1920x1200、scaleModeはNO_SCALE, TOP_LEFTアラインです。 やりたいことは、最初にサイトに入った時のstageWidth,stageHeightにあわせて背景BG_mc(1920x1200です)を拡大・縮小し、以後もしウインドウサイズが変更になっても、そのサイズを維持させることです。 現状どうにかたどりついたスクリプトでは、近いことはできているのですが、問題が2つあります。 1: 初回アクセス時にBG_mcのリサイズが適用されず、元のサイズででてしまう。   いったんブラウザをリサイズすると、以後はリサイズが適用され続けます。 2: ブラウザサイズが変更されると、リサイズが動的に適用されつづけてしまう。 最初に拾ったサイズでBG_mcを固定して、以後ブラウザのリサイズは無視したいのですが・・。 下記がそのスクリプトです。 使用ソフトはFLASH CS4, AS3,現状ではGoogle Chromeのみでパブリッシュしてテストしています。 stage.addEventListener(Event.RESIZE, resizeListener); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; //var DispX:int = Capabilities.screenResolutionX; //var DispY:int = Capabilities.screenResolutionY; function resizeListener (event:Event):void { trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight); BG_mc.width = stage.stageWidth; BG_mc.height = stage.stageHeight; //if (stage.stageWidth > stage.stageHeight) { //BG_mc.width = stage.stageWidth; //BG_mc.height = stage.stageWidth*0.625; //} else { //BG_mc.width = stage.stageWidth; //BG_mc.height = stage.stageWidth; //} } どなたかわかる方、いらっしゃらないでしょうか? そもそもやろうとしていることは、Flashのみで可能なのでしょうか? レイアウトはHTMLを活用したほうがよいのでしょうか? よろしくお願いします。

  • AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後

    AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後にまた、ムービークリップを設置。 ステージ横一杯にムービークリップ(以下MC)を縦2列で並べてステージをリサイズするたび、 MCをすべて削除してまた横一杯にMCを2列で並べるというものを作成中なのですが、リサイズの仕方によってはMCが何個か残ってしまいMCを再配置できないという現象がおきます。 以下のようにコーディングしているのですがどこが問題なのでしょう? 環境:AS3、Flash CS4、MC:W:80xH:100 Set(); stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE,AddMC); function AddMC(eventObject:Event):void { var delate:uint=mc.numChildren; for (var k:uint=0; k<delate; k++) { mc.removeChildAt(k); } if (delate<=0) { var SetTimer:Timer=new Timer(500,1); SetTimer.addEventListener(TimerEvent.TIMER,ReAdd); SetTimer.start(); function ReAdd(eventObject:TimerEvent):void { Set(); } } } // function Set():void { var yoko:uint=Math.ceil(stage.stageWidth/80); for (var i:uint=0; i<yoko; i++) { for (var j:uint=0; j<2; j++) { var BX:MovieClip=new box(); mc.addChild(BX); BX.x=40+80*i; BX.y=50+100*j; } } } よろしくお願いします。

    • ベストアンサー
    • Flash
  • ステージにある複数のインスタンスを制御したいです

    ステージに配置してある複数のインスタンスをアクションスクリプトで制御したいです。 インスタンスには「mc0」~「mc9」の連番で名前をつけています。 例えば、それぞれのインスタンスのタイムラインを再生させる指示を与えるとすると、 mc0.gotoAndPlay("main"); mc1.gotoAndPlay("main"); mc2.gotoAndPlay("main"); mc3.gotoAndPlay("main"); ・ ・ ・ mc9.gotoAndPlay("main"); となると思いますが、もっとスマートに書くとするとどんな書き方があるでしょうか? 数がもっと増える可能性があるので、もっと合理的な方法を知りたいです。 アクションスクリプトで生成したインスタンスを動かすには、 for(var i:int=0;i<10;i++){ var mc:MovieClip=new McMC(); addChild(mc); mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } のような感じで動かすのはやったことがあるので 既にステージに直接配置されているインスタンスもfor文で同じように制御できると思い 以下のように試してみましたが… for(var i:int=0;i<10;i++){ var mc:MovieClip; mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } 未定義となってしまいます。 やはり地道に書くしかないのでしょうか? ご教授を宜しくお願い致します。 ※FlashCS4、AS3で作業しています。

    • ベストアンサー
    • Flash
  • flashcs4 as3.0のエラーについて

    TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at 2mouse_03_fla09_as3_fla::MainTimeline/mymouse() 以下のスクリプトを実行すると上記のエラーが発生してしまいます。 ネットで調べてもわかりませんでした。AS3.0を学習していることろです。 よろしくお願いいたします。 ---------------------------------------------------------- やっていることは、マウスをMC(mc)に変換して、mc1との当たり判定をしたいだけです。 実行すると、実行画面でマウスを動かすと同時に上記のエラー出てしまいます。 ----------------------------------------------------------- stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; mc.event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(event){ if(mc1.hitTestObject(mc)){ mc.stage.removeEventListener(Event.ENTER_FRAME,mymouse); mc.visible=false; } }

    • ベストアンサー
    • 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
  • (AS3)外部swfを読み込んだが表示されない

    AS3で、以下のようなコードで外部SWFを呼び出して表示するというプログラムを組んでいるのですが、なぜか画面に表示されません。ContentTypeを調べたりなど色々やってみたところ、情報が取得できるのでなんらかの理由でステージに配置されていない、または配置されているが見えなくなっています。読み込むのを画像データにしてみるとうまくいきます。画像読み込みとSWF読み込みのコードって共通ですよね? package {  import flash.display.*;  import flash.net.*;   public class Main extends Sprite {    function Main():void {     var filename:String = "easy.swf";     var request:URLRequest = new URLRequest(filename);     var loader:Loader = new Loader();     loader.load(request);     addChild(loader);   }  } } 読み込むSWFのバージョンは9.0、このプログラムの書き出しも9.0で行っているのでバージョンの問題でも無いはずです。どなたかお分かりでしたら、どうかご教授お願い致します。

  • フルウィンドウの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
  • ランダムに mcを連続attachMovieさせるアニメ

    MX2004初心者です。 ライブラリにsakura_mc(10フレーム)があります。 さくらの花びらが手前に飛んでくるこまアニメです。 //乱数生成関数 function rndInit(maxNum){   var a = math.random();   var b = Math.ceil( a*maxNum );   return b; }  MC = "sakura"  SW = Stage.width;  SH = Stage.height; this.onEnterFrame = function(){   if( rndInit(10) == 1 ){   count ++;   newName = MC + count;   attachMovie( "sakura_mc", newName, 1 );   //表示位置の設定   this[ newName ]._x = Math.random()*SW;   this[ newName ]._y = Math.random()*SH;    } }  この方法だと、sakura_mcがステージ上ランダムな位置に連続で再生 してくれます。  ただ、二つ以上のsakura_mcを同時にステージに再生はしてくれません。  sakura_mcを同時にいっぱい再生させたい場合はどうすればよいでしょうか?  sakura2_mcをつくって同じ命令を追加してもダメでした。  よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう