• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:actionscript3.0 初心者です。)

ActionScript3.0初心者のための円の半径の変化に関する質問

このQ&Aのポイント
  • ActionScript3.0初心者が円の半径をマウスカーソルのX座標に対応させて変化させようとしています。
  • プレビューで何も表示されない原因がわからず困っています。
  • 円の半径の値をiの形で代入させることが無理矢理だったのかどうか知りたいです。

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

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

#1です。 ◎ #1に書かれた「補足」の1つ目より。 > 結果として、拡大縮小の変化は起こりますが、 > 追跡は実行されませんでした。 > どの箇所が誤りと考えられますでしょうか? 書かれているスクリプトでは 追跡が起こらない以前の問題で 「赤●」すら表示されないでしょう? #1で書いたように > マウスのx座標に応じた半径の赤●を > 消しては描いて 消しては描いて… をしなければなりません。 つまり先に消すのです。 つまり _maru.graphics.clear(); が先です。 その点だけを先に修正すると function boo は次のようになります。 //---とりあえずの修正------------- function boo(eventobj:Event):void { _maru.graphics.clear(); var i:Number=mouseX; _maru.x=_maru.x*0.7+mouseX*0.195+0.005; i=_maru.x; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); } //-------------------------------- これで「赤●」が描画されるようになります。 次にマウスの追跡がおこなわれていないということですが 私の見る限りマウスによってちゃんと座標は変わっていますよ。 「赤●」の大きさの変化に目がまどわされているだけではないでしょうか? 「赤●」の大きさを固定すれば「赤●」のx座標がマウスによって変わることがハッキリ見えると思います。 //---大きさの変化を止める実験------- function boo(eventobj:Event):void { _maru.graphics.clear(); var i:Number=mouseX; _maru.x=_maru.x*0.7+mouseX*0.195+0.005; i=_maru.x; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,100); _maru.graphics.endFill(); } //-------------------------------- ↑その「赤●」の動き方が良いとか悪いとかそんなことは知りません。 「赤●」がマウスによって動くことは確かです。   ========================== ◎ #1に書かれた「補足」の2つ目より。 > 上記のプログラミングに「Y軸方向の追跡」 >(要するにステージ内全体) > を追加しようと以下を記述しましたが、 > 今回は表示すらされなくなってしました。 これも上の最初に書いたことと同じです。 せっかく描いた「赤●」を消してしまっては見えませんよ。 前のフレーム時間で描いた「赤●」を消してから 今のフレームで「赤●」を描くのです。 > 消しては描いて 消しては描いて… です。 ですから function boo は次のようになります。 //---修正------------------------- function boo(eventobj:Event):void { _maru.graphics.clear(); var i:Number=mouseX; _maru.y=mouseY; _maru.x=_maru.x*0.7+mouseX*0.195+0.005; i=_maru.x; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); } //--------------------------------  

naonao321
質問者

お礼

ありがとうございます。 お礼は以下にまとめさせていただいております。

その他の回答 (1)

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

座標の方に関しては _maru.x = 100; _maru.y = 200; や _maru.x = mouseX; のようにして 普通に _maru に対するプロパティを設定しているわけですから 半径に関してもそれと同じように 普通に _maru に対するプロパティを設定すれば良いのではないのでしょうか? そういう考え方で 他の部分の修正も入れた「boin.as」の全文例です↓。 //--------------------------------------- package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite { var _maru:Sprite; public function boin() { _maru = new Sprite(); _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,100); _maru.graphics.endFill(); _maru.x = 100; _maru.y = 200; _maru.width = 0; _maru.height = 0; addChild(_maru); addEventListener(Event.ENTER_FRAME,boo); } function boo(event:Event):void { _maru.x = mouseX; _maru.width = mouseX*2; _maru.height = mouseX*2; } } } //---------------------------------------     もしくは, _maru.graphics.drawCircle(0,0,i); のように 半径を i などで指定したい場合は 次のようにするのも1つの方法です。 //--------------------------------------- package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite { var _maru:Sprite; public function boin() { _maru = new Sprite(); _maru.x = 100; _maru.y = 200; addChild(_maru); addEventListener(Event.ENTER_FRAME,boo); } function boo(event:Event):void { var i:Number = mouseX; _maru.graphics.clear(); _maru.x = i; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); } } } //--------------------------------------- これ↑はつまり 1フレーム進む時間ごとに毎回 マウスのx座標に応じた半径の赤●を 消しては描いて 消しては描いて… という動作をずっと繰り返させるという方法です。 数式を用いたラインアート的なFlashなどで結構使われる方法です。 最初のスクリプトと2つ目のスクリプトとでは プログラム上の動作内容は全然違いますが 見た目上の動作は全く同じように見えると思います。     また,見た目上同じであることを考えるだけなら 次のようにしても同じですけどね。。。 //--------------------------------------- package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite { var _maru:Sprite; public function boin() { addEventListener(Event.ENTER_FRAME,boo); } function boo(event:Event):void { if (_maru != null) { removeChild(_maru); _maru = null; } _maru = new Sprite(); var i:Number = mouseX; _maru.x = i; _maru.y = 200; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); addChild(_maru); } } } //--------------------------------------- これ↑はあまりお薦めできませんが, 1フレーム進む時間ごとに毎回 マウスのx座標に応じた半径の赤●入りのスプライトを 削除しては作成し 削除しては作成し… という動作をずっと繰り返させるという方法です。 お薦めはできませんが, 何か他のことをする際の可能性(1つの手)としては無きにしも非ずな方法だとは思います。

naonao321
質問者

お礼

ありがとうございます。 丸が大きすぎたみたいです。すみませんでした。 毎回BlurFiltan様には本当に助けられています。 今回、補足にて再度ご質問させていただきましたが、 相変わらずの丁寧で豊富な情報でありがたいです。 是非またお願いします。

naonao321
質問者

補足

早速のご回答ありがとうございます。 お手数ですが、以下二つの補足について、改めてご回答いただけませんでしょうか? ご記述いただきました、2番目のプログラムをもとに 「オブジェクトが時間差で拡大縮小の変化が起こり、且つX軸のについてマウスを追跡する」ものを意図して下のもを記述しました。結果として、拡大縮小の変化は起こりますが、追跡は実行されませんでした。どの箇所が誤りと考えられますでしょうか? ..................................................................................................... package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite { var _maru:Sprite; var addNumnerX:Number = new Number; public function boin() { _maru = new Sprite(); _maru.x = 100; _maru.y = 200; addChild(_maru); _maru.addEventListener(Event.ENTER_FRAME,boo); } function boo(eventobj:Event):void { var i:Number = mouseX; _maru.x = _maru.x*0.7 + mouseX*0.195 + 0.005; i = _maru.x; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); _maru.graphics.clear(); } } } ................................................................................ 引き続きお願いします。 上記のプログラミングに「Y軸方向の追跡」(要するにステージ内全体)を追加しようと以下を記述しましたが、今回は表示すらされなくなってしました。(エラーは出ていません。)この場合はどのような変更を加えればよろしいでしょうか?僭越ではありますがよろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite { var _maru:Sprite; var addNumnerX:Number = new Number; public function boin() { _maru = new Sprite(); _maru.x = 100; _maru.y = 200; addChild(_maru); _maru.addEventListener(Event.ENTER_FRAME,boo); } function boo(eventobj:Event):void { var i:Number = mouseX; _maru.y = mouseY; _maru.x = _maru.x*0.7 + mouseX*0.195 + 0.005; i = _maru.x; _maru.graphics.beginFill(0xFF0000); _maru.graphics.drawCircle(0,0,i); _maru.graphics.endFill(); _maru.graphics.clear(); } } } 以上よろしくお願いします。

関連するQ&A

専門家に質問してみよう