Spriteのサイズが取得できない

このQ&Aのポイント
  • Spriteのサイズを取得できません。ビットマップのサイズは取得できるのですが、スプライトのサイズが取得できない問題に直面しています。
  • ビットマップをスプライトにaddChildした後、スプライトのwidthとheightのプロパティを参照しても、値が0になってしまいます。
  • この問題を解決するためには、別の方法でスプライトのサイズを取得する必要があります。
回答を見る
  • ベストアンサー

Spriteのサイズが取得できない

毎度初歩的な質問で恐縮です。 下記のようにビットマップの中心が、スプライトの左上になるように スプライトにビットマップをaddChildしました。 で、その後のwidth,heightのプロパティを参照したところ ビットマップのサイズは取得できるのですが、 スプライトのサイズが取得できません。 どのようにすれば取得することができるのでしょうか。 var bm:Bitmap = new Bitmap(event.bitmapData) as Bitmap; bm.x = bm.width / 2 * -1 ; bm.y = bm.height / 2 * -1 ; bm.smoothing =true var bm_s:Sprite = new Sprite; bm_s.x = app_width / 2 + def_z ; bm_s.y = app_height + def_z ; bm_s.z = def_z; bm_s.width = bm.width ; bm_s.height = bm.height ; bm_s.addChild( bm ); trace( bm.width.toString() ); ←値は取得できる trace( bm_s.width.toString() );←値が0になる

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

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

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

#1です。 こちらでも実験してみましたが trace( bm_s.width.toString() ); の値は 0 にはなりませんでしたよ。 元の BitmapData の横幅サイズが取得できました。 もっともこれは パブリッシュ設定で Flash Player のバージョンを Flash Player 10 以上にした場合ですが。 z座標 がサポートされたのは Flash Player 10 以降だからです。 (オーサリング環境で言えば z座標 のサポートは Flash CS4 以降です。) しかし, 仮に Flash Player 9 に設定したとしても 「そんなプロパティなんて未定義だよ!」みたいなエラーが出るだけで 「0」が出力されることはありませんが。。。 それと var bm:Bitmap = new Bitmap(event.bitmapData) as Bitmap; このような意味不明なことを書かれても 第三者である私にとっては何のことか(どういう状況なのか) さっぱりわからないので こちらでは勝手に Pic というクラス名をつけた 160×120 px の BitmapData シンボルをライブラリに用意した上で var bm:Bitmap = new Bitmap(new Pic(0,0)) as Bitmap; のようにして BitmapData を呼び出していますが。 ※参考【添付図】↓ 【私が実験してみたスクリプト全文例】↓ [SWF(frameRate="20",width="550",height="400")] var app_width = 550; var app_height = 200; var def_z = 0; var bm:Bitmap = new Bitmap(new Pic(0,0)) as Bitmap; bm.x = bm.width / 2 * -1 ; bm.y = bm.height / 2 * -1 ; bm.smoothing =true var bm_s:Sprite = new Sprite; bm_s.x = app_width / 2 + def_z ; bm_s.y = app_height + def_z ; bm_s.z = def_z; bm_s.addChild( bm ); addChild( bm_s ); trace( bm.width.toString() ); //←160 が出力される trace( bm_s.width.toString() );//←160 が出力される

ekekojr
質問者

お礼

検証頂きありがとうございます。 こちらでも検証してみましたが、 Flash CS5.5では、おっしゃる通り問題なく取得することができました。 しかし、FlashBuilder4.6では以下のコードで、z位置の指定により、値が0になる 同様の現象が確認できました。 なぜこのようなことになるのか、わかりませんが、 FBでは不具合になるということがわかりましたので、 今後注意したいと思います。 わざわざお付き合い頂きありがとうございました。 【FlashBuilderで実験したスクリプト全文】 <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" initialize="init(event)"> <fx:Script> <![CDATA[ import mx.events.FlexEvent; [Embed('d:/pic.png')] private var ImageAsset : Class; protected function init(event:FlexEvent):void { var app_width = 550; var app_height = 200; var def_z = 0; var bm:Bitmap = new ImageAsset() as Bitmap; bm.x = bm.width / 2 * -1 ; bm.y = bm.height / 2 * -1 ; bm.smoothing =true var bm_s:Sprite = new Sprite; bm_s.addChild( bm ); bm_s.x = app_width / 2 + def_z ; trace( bm_s.width.toString() );//←160 が出力される bm_s.y = app_height + def_z ; trace( bm_s.width.toString() );//←160 が出力される bm_s.z = def_z; trace( bm_s.width.toString() );//← 0 が出力される } ]]> </fx:Script> <fx:Declarations> <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 --> </fx:Declarations> </s:WindowedApplication>

その他の回答 (1)

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

書かれていらっしゃるスクリプトで 本当に ビットマップデータ は表示されますか? サイズが取得できないとか以前の問題で とんでもないスクリプトに見えますよ。 正常に動作するはずもありませんし ビットマップデータも表示されるはずがないと思います。 bm_s.width = bm.width ; bm_s.height = bm.height ; bm_s.addChild( bm ); ↑こんなの無茶です。 bm_s(スプライト)は作成した時点で空です。 その空のスプライトのサイズを何某かの大きさにするということは スプライトの大きさを無限大倍にするということになります。 一旦 ActionScript のことは離れて 算数(数学?)の式について考えてみましょう。  0×?=320 ↑この式の?に入る数など存在しませんよね? bm_s.width = bm.width ; //←空のスプライトの横幅を無限大倍する bm_s.height = bm.height ; //←空のスプライトの高さを無限大倍する bm_s.addChild( bm ); //←その後にスプライトの中に何か入れる こんなことあり得ません。 仮にあり得たとしても そこには無限大倍に拡大されたビットマップデータが表示されるはずです。 でもそんなことはあり得ないのでFlash がスプライトを放棄します。 その結果 trace( bm_s.width.toString() );←値が0になる ということになると思います。 //bm_s.width = bm.width ; ←削除 //bm_s.height = bm.height ; ←削除 bm_s.addChild( bm ); これで取得できるようになるのではないでしょうか?

ekekojr
質問者

補足

いつも丁寧に回答頂きありがとうございます ビットマップデータはきちんと表示されています。 >Flash がスプライトを放棄します。 上記の一文が気になり、 どこでスプライトが放棄されたかを調べてみたところ スプライト生成後、すぐにビットマップデータを追加すると 正常に取得することができました。 ですが、その後、x座標、y座標、z座標とプロパティを設定していくと z座標を設定後、スプライトのサイズが0になってしまいました。 var bm_s:Sprite = new Sprite; bm_s.addChild( bm ); trace( bm_s.width.toString() ); ←値は取得できる bm_s.x = app_width / 2 + def_z ; trace( bm_s.width.toString() ); ←値は取得できる bm_s.y = app_height + def_z ; trace( bm_s.width.toString() ); ←値は取得できる bm_s.z = def_z; trace( bm_s.width.toString() ); ←値が0になる スプライトはz座標に対応していない?ということなのでしょうか。 ちなみにz座標で設定している値はゼロ(0)です。

関連するQ&A

  • actionscript 3.0 勉強中のもです

    numChildrenから出した値をつかって実験中です。 以下の記述に置いて、contaner1.numChildrenの数値(結果:2)をif構文の条件式に使おう したところうまく行きません。if(container1.numChild == 2)にしてみると、読み込み専用ですと言われてしまいます。どのように考えたらよろしいのでしょうか?お心当たりありましたら是非よろしくお願い致します。 import flash.display.Sprite; var container1:Sprite = new Sprite(); var container2:Sprite = new Sprite(); var counter:Sprite = new Sprite(); var circle1:Sprite = new Sprite(); var n:Number= new Number; circle1.graphics.lineStyle(10,0x3355bb,); circle1.graphics.drawCircle(40, 50, 40); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0x00CCFF); circle2.graphics.drawCircle(80, 90, 40); var circle3:Sprite = new Sprite(); circle3.graphics.beginFill(0x7766FF); circle3.graphics.drawCircle(60, 40, 40); container2.addChild(container1); container1.addChild(circle1); container1.addChild(circle2); addChild(circle1); addChild(circle3); trace(container1.numChildren); // 2 trace(container2.numChildren); // 1 trace(circle1.numChildren); // 0 trace(circle2.numChildren); n = container1.numChildren if(n == 2)//container1.numChildrenの数を代入値として使いたい。 { circle1.x=300 }

    • ベストアンサー
    • Flash
  • 下記二つのbitmapDataに関するサンプルソースですが、なぜ問題な

    下記二つのbitmapDataに関するサンプルソースですが、なぜ問題なくaddChildされるのでしょうか? 普通に考えると上から下へパブリッシュされていると思っていたのですが、 厳密には違うということでしょうか? ---------------------------------- var txt:TextField = new TextField(); txt.text = 'あああ'; var bitmapdata = new BitmapData(txt.width,txt.height); var bmp:Bitmap = new Bitmap(bitmapdata); bitmapdata.draw(txt); addChild(bmp); ---------------------------------- bitmapdata.draw(txt); の記述位置をaddChild()の下に記述してもエラーが出ること無く実行されます。 しかし、 bitmapdata.draw(txt); の記述がなければエラーが出ませんが、描画されません。 ---------------------------------- var txt:TextField = new TextField(); txt.text = 'あああ'; var bitmapdata = new BitmapData(txt.width,txt.height); var bmp:Bitmap = new Bitmap(bitmapdata); addChild(bmp); bitmapdata.draw(txt); ---------------------------------- 単純にaddChild()した後に、draw()することができるということでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • as3 ムービークリップにビットマップデータを挿入するクラスがうまくい

    as3 ムービークリップにビットマップデータを挿入するクラスがうまくいかない 上記のとおりなんですが、 前提として ■ライブラリにjpgを一枚読み込んで、Photoというクラス名でリンケージしてあります。 ■ステージにmcというムービークリップを配置しています。 mcにビットマップ化したjpgをaddchildしたかったので、 メインフレームに下記を書きました。 -------------------------------------------------------- var name_str:String = "Photo"; var myClass:Class = Class(getDefinitionByName(name_str)); var bmd:BitmapData = new myClass(0, 0); var bm:Bitmap = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; mc.addChild(bm); -------------------------------------------------------- ※今後動的に生成するのでクラス名は変数にしています。 これは問題なく行きました。 上記を外部クラス化したかったので、 下記のようにしました。 ■PhotoClass ---------------------------------------------------------------------- package { import flash.display.MovieClip; import flash.events.Event; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.getDefinitionByName; import flash.display.PixelSnapping; public class PhotoClass extends Bitmap { private var myClass:Class;//クラス名 private var bmd:BitmapData; private var bm:Bitmap; //コンストラクタ public function PhotoClass(_name:String) { myClass = Class(getDefinitionByName(_name)); bmd = new myClass(0, 0); bm = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; init(); } public function init():Bitmap { return bm; } } } ---------------------------------------------------------------------- ■メインフレーム var photoAdd:Bitmap = new PhotoClass("Photo"); mc.addChild(photoAdd); これがうまくいきません。 エラーはないのですが、ちゃんとmcに画像が読み込まれません。。。。 ご教授いただければと思います!

    • ベストアンサー
    • Flash
  • 下記コードですが、なぜtrace出来ないか、わかりますか?

    下記コードですが、なぜtrace出来ないか、わかりますか? ----------------------------------------------------------------------- var bmpData:BitmapData = new BitmapData(100,100,true,0xff000000); var bmp:Bitmap = new Bitmap(bmpData,PixelSnapping.AUTO,true); addChild(bmp); bmp.addEventListener(MouseEvent.CLICK,hoge); function hoge(e){ trace('なぜか無反応!'); } ----------------------------------------------------------------------- よろしくお願いします。

    • ベストアンサー
    • Flash
  • アクションスクリプト ビットマップデータ 描画

    Flashゲーム作成のため、アクションスクリプトを学び始めた初心者です。 ゲーム作成中にプレイヤーがミスをした場合、"MISS!!"という文字を画面に描画し、下から上へスクロールさせる処理を考えています。 ビットマップデータにテキストフィールドで指定したテキストを描画しているのですが、その描画位置を指定できなくて困っています。 canvas = new BitmapData(WIDTH, HEIGHT, true, 0x0);// 透明、初期色0x00000000 var bitmap:Bitmap = new Bitmap(canvas); bitmap.scaleX = bitmap.scaleY = 1;// 1倍表示 addChild(bitmap); var tf:TextField = new TextField(); tf.defaultTextFormat = new TextFormat("MS ゴシック", 50, 0xFF0E0E ,true); tf.width = stage.stageWidth; // 幅 tf.height = 50; tf.autoSize = TextFieldAutoSize.CENTER; tf.y = 240; tf.text = "MISS!!"; canvas.draw(tf); これで実行すると、画面上にMISS!!と表示されて、tf=240が適応されません、どうしたらテキストの表示位置の縦方向の位置を変えることができるのでしょうか?教えていただきたいです。

    • ベストアンサー
    • Flash
  • javascriptでの値の取得について

    すごく素人だと思うのですが。 この手のタイプで得られる値を外部で取得できないのでしょうか? 戻り値で返すわけにもいかないですし、よく理解できていません var val: ○.○=function(){ここで得た値をvalに入れたい} 例1 var target; ・・・ request.onreadystatechange=function(){ if(request.readyState==4 && request.status==200){ //target=request.responseText;みたいなことをしたい } } 例2 var width,height; ・・・ image.onload=function(){ //width=image.width; height=image.height;みたいなことをしたい }

  • jqueryでdata-の画像サイズの取得方法

    通常の場合、 <img src="hoge.png" /> $("img").on("load",function(){ var w = $(this).width(); var h = $(this).height(); $(this).css({"width":w +"px", "height":h +"px"}); }); でサイズは取得できますが、 <img src="hoge.png" data-src="hoge2.png" /> の場合でhoge2.pngの画像サイズを取得する方法を探しています。 分かる方がいらしたら教えてください。 よろしくお願いします。

  • AS3.0 写真の切り替え

    調べても調べても漠然とした状態が続いてるので質問させていただきました。 まず、サンプルとしてこんなようなものが作りたいんです。 http://www.subaru-sls.co.jp/ ここの企業みたいな写真が一定時間でその場所その場所に移動していくというのを作りたいのですが、今後のことを考え、タイムラインにASを組むのではなく、外部AS(ドキュメントクラス?)だけで作りたいのです。 因みに写真などの配置はなんとかできたのですが、写真が切り替わるのがまったくわかりません。 こちらが現状況のコードになります。↓ package { import flash.display.Sprite; import flash.display.Loader; import flash.net.URLRequest; import flash.display.Shape; import flash.events.TimerEvent; import flash.utils.Timer; import flash.events.MouseEvent; import flash.display.Bitmap; [SWF(width = "550",height = "400")] public class main extends Sprite { //プロパティ var mc01:Sprite = new Sprite(); var mc02:Sprite = new Sprite(); var mc03:Sprite = new Sprite(); var imgUrl01:String = "kabegami1.jpg"; var imgUrl02:String = "kabegami2.jpg"; var imgUrl03:String = "kabegami3.jpg"; var onUrl01:URLRequest = new URLRequest(imgUrl01); var onUrl02:URLRequest = new URLRequest(imgUrl02); var onUrl03:URLRequest = new URLRequest(imgUrl03); var img01:Loader = new Loader(); var img02:Loader = new Loader(); var img03:Loader = new Loader(); var square01:Shape = new Shape(); var square02:Shape = new Shape(); var square03:Shape = new Shape(); var i:int = 0; var timer:Timer = new Timer(20); //コンストラクタ public function main () { init (); } //メソッド private function init () { square01.graphics.beginFill (0x000000); square02.graphics.beginFill (0x000000); square03.graphics.beginFill (0x000000); square01.graphics.drawRect (10, 10, 330, 380); square02.graphics.drawRect (350, 10, 110, 380); square03.graphics.drawRect (470, 10, 70, 380); square01.graphics.endFill (); square02.graphics.endFill (); square03.graphics.endFill (); img01.mask = square01; img02.mask = square02; img03.mask = square03; img01.load (onUrl01); img02.load (onUrl02); img03.load (onUrl03); addChild (square01); addChild (square02); addChild (square03); addChild (img01); addChild (img02); addChild (img03); timer.addEventListener (TimerEvent.TIMER,onTimer); timer.start (); img01.addEventListener (MouseEvent.MOUSE_DOWN,mouseDownHandler); } private function mouseDownHandler (event:MouseEvent):void { } private function onTimer (event:TimerEvent):void { i++; img01.alpha -= 0.01; } } } 長文になってしまいましたが、どうかご教授お願いします。

    • ベストアンサー
    • Flash
  • ac3 if 構文の作り方

    以下のスクリプとで、最初にbox1が動き出して、box1がbox2を、x座標について値が上回ったとき、box2も動き出す、というもので詰まっています。すごく単純な見落としをしているのだと思いますが、どうにも行きません。お知恵をお借りできますと助かります。 import flash.display.Sprite; import flash.events.Event; var box1:Sprite=new Sprite; box1.graphics.beginFill(0x00FF00);   box1.graphics.drawRect(50,100,50,50);   box1.graphics.endFill(); var box2:Sprite=new Sprite; box2.graphics.beginFill(0x00FF00);   box2.graphics.drawRect(100,200,50,50);   box2.graphics.endFill(); addChild(box1); addChild(box2); box1.addEventListener(Event.ENTER_FRAME,mo); function mo(e:Event):void{ box1.x += 1;} trace("ok") if(box1.x>box2.x){ box2.addEventListener(Event.ENTER_FRAME,mo2); function mo2(e:Event):void{ box2.x += 1} trace("ok2")};

    • ベストアンサー
    • Flash
  • actionscript初心者です。importに

    友人に教えてもらったプログラムを練習用に解読?しています。 以下のプログラムにおいて、 importを含んだ時 importを含まない時(2つを消してしまった場合)では プレビューにおいては両者とも問題なく動作しますが 以下に、importを加える必要があるのでしょうか? よろしくお願い致します。 import flash.display.Sprite; import flash.events.MouseEvent; var circle1:Sprite = new Sprite(); circle1.graphics.beginFill(0xFFCC00); circle1.graphics.drawCircle(20, 20, 20); circle1.buttonMode = true; circle1.addEventListener(MouseEvent.CLICK, clicked); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0xFFCC00); circle2.graphics.drawCircle(120, 40, 40); circle2.buttonMode = false; circle2.addEventListener(MouseEvent.CLICK, clicked); function clicked(event:MouseEvent):void { trace ("OK"); } addChild(circle1); addChild(circle2);

    • ベストアンサー
    • Flash

専門家に質問してみよう