ActionScript3.0についての質問

このQ&Aのポイント
  • ActionScript3.0の教材のスクリプトにある「mc.x0 = mc.x;」の意味、理解できません
  • ムービークリップのxの位置を0に設定しているのか不明で、疑問に思っています
  • 初心者にも分かりやすく、説明していただけると助かります
回答を見る
  • ベストアンサー

ActionScript3.0について質問です

初めまして、よろしくお願いします。 いまActionScript3.0を勉強中なのですが、どうしても分からないとこがあるので質問させてください。 あるAC3.0の教材で、下のスクリプトが載っていたのですが、そこに書かれてある「mc.x0 = mc.x;」はなにをしているのでしょうか? ムービークリップのxの位置を0に設定しているのかなと思ったのですが、それでしたらmc.x=0; でいいと思ったので、さっぱりわかりません。 どなたかすみませんが、素人の僕にでも分かりやすく説明してもらえると助かります! よろしくお願いします!! package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; public class Maru extends Sprite{ public function Maru(){ //コンストラクタ var mcList:Array = new Array(); mcList.push(A_mc); mcList.push(c_mc); mcList.push(t_mc); mcList.push(i_mc); mcList.push(o_mc); mcList.push(n_mc); mcList.push(S_mc); mcList.push(c2_mc); mcList.push(r_mc); mcList.push(i2_mc); mcList.push(p_mc); mcList.push(t2_mc); for(var i:int = 0; mcList.length; i++){ var mc:MovieClip = mcList[i]; mc.x0 = mc.x; mc.x = 100; mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } } function enterFrameHandler(ev:Event):void{ var mc:MovieClip = ev.target as MovieClip; var goalx:Number = mc.x0; moveStr(mc, goalx); } function moveStr(targetmc:MovieClip, goalx:Number):void{ if( goalx - targetmc.x < 0.5 ){ targetmc.x = goalx; targetmc.removeEventListener(Event.ENTER_FRAME,enterFrameHandler); }else{ var easing:Number = 0.15; targetmc.x += (goalx - targetmc.x) * easing; } } } }

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

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

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

mc.x0 は ムービークリップ「mc」 の中の 変数 x0 です。 mc.x は ムービークリップ「mc」 の x座標です。 したがって次の2行   mc.x0 = mc.x;   mc.x = 100; に注釈を加えると次のようになります。   //ムービークリップ「mc」 の中の変数 x0 に   //ムービークリップ「mc」 の現在の座標を保存   mc.x0 = mc.x;   //そしてムービークリップ「mc」 の x座標 を 100 にする   mc.x = 100; 作成しているものが見えないので何とも言えませんが ムービークリップ「mc」 の最初の配置位置が大切なんじゃないでしょうか? ムービークリップの最初の配置位置は変数に記録しておいて そのムービークリップのx座標を100にするなど色々動かしてまた元の位置に戻すときに ムービークリップ「mc」内に保存した個々の元の座標にする。 だいたいそんな内容ですよ。 例えば たくさんのムービークリップを ☆ 型に配置する場合, 手でムービークリップの位置を決めるのは簡単なことです。 ActionScriptで配置しようと思えば, 各座標などを計算したりあらかじめデータを調べておいて そうなるように配置しなければなりません。 それは大変で手間です。 それで最初の座標は作者の置いた場所(つまりどこでも良い)ということにしているのではないかと思います。 靴をぬいで上がる飲み屋さんの下駄箱とか 銭湯のロッカーのようなものです。 Aさんのロッカーは139で Bさんのロッカーは26で Cさんのロッカーは231で… などのような管理台帳や一覧表を用意して銭湯のロッカーを管理することもできますが それだと,銭湯屋さんも客もみんなが手間です。 それで普通客にはロッカーの番号札の付いたキーを持って歩かせますよね。 帰るときは自分の番号札を見れば 「調べる」とか「考える」とか「思い出す」という作業をせずに簡単に自分のロッカーのところに戻れるじゃないですか。 そんなようなシステムです。

nekoze-man
質問者

お礼

非常に分かりやすい説明ありがとうございます!! またよろしくおねがいします!

関連するQ&A

  • actionscript3.0 初心者です。

    ある円の半径を、マウスカーソルのX座標に対応させて変化させよう思い、以下の記述を行ったのですが、プレビューにて全く何も表示されません。お心当たりあれば是非教えていただきたいです。やはり、半径の値をiの形で代入させるようにしたことが無理矢理だったのでしょうか。よろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite {  public function boin() { var _maru:Sprite = new Sprite(); var i:Number = new Number();    _maru.graphics.beginFill(0xFF0000);    _maru.graphics.drawCircle(0,0,i);    _maru.graphics.endFill();    _maru.x = 100;    _maru.y = 200;    addChild(_maru);  addEventListener(Event.ENTER_FRAME,boo);  {   function boo(event:Event):void    {     _maru.x = mouseX;     i = mouseX;     }   } } } } ASファイル(boin)

    • ベストアンサー
    • Flash
  • actionscript 3.0 勉強中のもです。

    ある四角の枠状のものを加速をつけて落下させることを意図して入力をしましたが、ただいま以下のプログラミングにおいて「外部からの表示可能な複数の定義は使用できません。」とメッセージを受けました。当方、勉強中にて全くメッセージ内容の見当がつきません。もしご回答、アドバイス等いただけましたら助かります。またプログラムの書き方についても以下でお気づきの点がありましたら、ご指導いただければ幸いです。 よろしくお願い致します。 package{ import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Rakka extends Sprite{ var maru_mc:Sprite = new Sprite; maru_mc.graphic.lineStyle(6,0xee0033) maru_mc.graphic.drawRect(0,0,120,120) var i:int; this.addChild(maru_mc); maru_mc.addEventListener(Event.ENTER_FRAME,goBound); stage.addEventListener(Event.MouseEvent,onEnter); } function onEnter(e:MouseEvent):void{ maru_mc.x = mouseX maru_mc.y = mouseY } function goBound(e:Event){ i = 5; mouse_mc.y = mouse_mc.y +i*y/100 } }

    • ベストアンサー
    • Flash
  • actionscript 3.0 初心者です

    以下の3つの質問にご回答いただければ幸いです。 以下の参考にさせていただいている、スクリプトにて 1、random関数の()の後に来る数字はどのような範囲を意味しているのでしょうか? 2、sList[i].vx = Math.random() -0.5;という記述について、これはあるオブジェクトの 落下(進行)の速度を示しているらしいのですが、その手前の記述で、 private var vx:Number = 0;という記述があります。自分で定義したものをプロパティーとして使い事はできるのでしょうか?(もしくわこのvxはarrayのプロパティとして使われていると考えてよろしいのしょうか?) 3、なぜ速度をわざわざ配列で記入する必要があるのでしょうか? 多岐にわたっておりますが、是非よろしくお願い致します。 package{ import flash.display.Sprite; import flash.display.MovieClip; import flash.geom.Matrix; import flash.events.Event; import flash.filters.BlurFilter; public class Main extends Sprite { private var snow:Ball;     private var num:int = 200; private var sList:Array = []; private var vx:Number = 0; public function Main(){ for(var i:int = 0; i < num; i++){ var snow:Ball = new Ball(2,0xaaffff) //初期位値 snow.x = Math.random() * stage.stageWidth; snow.y = Math.random() * stage.stageHeight; //大きさを生成順に小さく snow.scaleX = snow.scaleY = 1 / (0.02 * i + 1); //配置して配列に入れる addChild(snow); sList.push(snow); //それぞれのx方向の速度設定 sList[i].vx = Math.random() -0.5; } addEventListener(Event.ENTER_FRAME,go1); } private function go1(evt:Event):void{ for(var i = 0; i < num; i++){ //x方向とy方向の動き設定(奥のものほど遅くなる) sList[i].x += sList[i].vx / (0.02 * i + 1); sList[i].y += 4 / (0.02 * i + 1); //ステージ外(下)に出たら移動 if(sList[i].y > 400){ sList[i].x = Math.random() * stage.stageWidth; sList[i].y = 0; } } } } }

    • ベストアンサー
    • Flash
  • actionscript 3.0 勉強中のもです。

    よろしくお願いします。 ある右へ動いていく四角をクリックするとそれ自体のvisibleプロパティに変化(消える)を起こす事を意図して以下のような、プログラムを作りました。しかしながら、横移動の動作を確認しましたが、クリックをしても横移動を続けるだけでした。_mc.addEventListener(Event.ENTER_FRAME,onGo)を抜かした状態で見てみると、しっかり消えることを確認しました。しかし_mc.addEventListener(Event.ENTER_FRAME,onGo) を加えると上記のようになります。2つのイベントリスナーをつなげて書く事は間違った事ではないと思っています。どのように考えて書き直したらしたらよろしいのでしょうか?お心当たりございましたらどうぞよろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { var _mc:Sprite = new Sprite; function Main() { _mc.graphics.beginFill(0x334455); _mc.graphics.drawRect(0,0,120,120); _mc.graphics.endFill(); _mc.x= 130; _mc.y= 220; addChild(_mc); _mc.addEventListener(MouseEvent.CLICK,onClick2); _mc.addEventListener(Event.ENTER_FRAME,onGo); } function onClick2(event:MouseEvent):void { trace(event.target.name + "をクリックしました。"); _mc.visible= !(_mc.visible); } function onGo(event:Event):void { if(_mc.visible=true) { _mc.x += 1 } } } }

    • ベストアンサー
    • HTML
  • as3 getChildByNameに変数を利用する

    ※実際にやりたいことは違うのですが、 分かりやすくするため簡易的にしています。 ステージに配置された2つのインスタンスを y=300に移動するというものを作りたいと思っています。 (実際には100以上になるので動的に生成したいです。) var num:int = 2; var _mc:Array = []; var _mcName:Array = []; for(var i=0; i < num; i++){ _mc.push("test_mc"+i); _mcName.push("test_mc"+i); } for(var n=0; n < num; n++){ _mc[n] = new MovieClip; _mc[n].addEventListener(Event.ENTER_FRAME, function() { MovieClip(getChildByName(_mcName[n])).y = 300; }); } 上記を実行すると下記のエラーが出ます。 TypeError: Error #2007: パラメータ name は null 以外でなければなりません。 at flash.display::DisplayObjectContainer/getChildByName() at MethodInfo-1() 下記のように並べて記述するとうまくいくのですが・・・・ これを100個以上も書くのはばかばかしいので。。。 _mc[0] = new MovieClip; _mc[0」.addEventListener(Event.ENTER_FRAME, function() { MovieClip(getChildByName(_mcName[0])).y = 300; }); _mc[1] = new MovieClip; _mc[1」.addEventListener(Event.ENTER_FRAME, function() { MovieClip(getChildByName(_mcName[1])).y = 300; }); ご教授お願いいたします!

    • ベストアンサー
    • Flash
  • ActionScript3.0についての質問です。

    ActionScript3.0についての質問です。 ムービークリップAの中に入れ子でムービークリップBを作成し、またその中に入れ子でムービークリップCを作成しました。 そしてこのムービークリップCをクリックできるようにしたいのですがうまくいかないんです。 こんなふうに書いてみたのですがどこが間違っているのか指摘してもらえると嬉しいです。 package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komorebi extends MovieClip{ public function komorebi(){ A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); } function clickHandler(ev:Event){ signBoard.gotoAndPlay("parkUp"); } } } >A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); これがちょっと怪しい気がするのですが、A.B.C ←こういった参照のしかたでよろしいんでしょうか? もし説明不足でしたらまた追記しますので言ってください! すみませんがよろしくお願いします!!

    • ベストアンサー
    • Flash
  • 外部ASを二つ組み合わせる方法

    flash初心者です。二つのASファイルを組み合わせて作ろうとしているのですが、 外部ASをドキュメントクラスを使用して読み込み複数ある場合、調べた結果importを利用してクラスを定義出来るとの事ですが、定義が重複していますと出てしまいます。 パッケージを二個書こうとしても外部から表示可能な複数の定義は使用出来ませんと出てしまいます。二つのスクリプトを一つに纏めた方がいいのでしょうか? どなたかご教授下さい。 ASは同じディレクトリ上に配置しています。 package { import flash.display.Sprite; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.events.Event; public class CardMenu extends Sprite { private var cardList:Array = ["card01", "card02", "card03", "card04", "card05"]; private var _currentCard:MovieClip; public function CardMenu() { for ( var i:int = 0; i < cardList.length; i++ ) { var mc:MovieClip = this[cardList[i]]; mc.X = mc.x0 = mc.x; mc.Y = mc.y0 = mc.y; mc.R = mc.rot = mc.rotation; mc.S = mc.sca = mc.scaleX; mc.dep = getChildIndex(mc); mc.btn.addEventListener(MouseEvent.CLICK, openHandler); mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } } private function openHandler( e:MouseEvent ):void { if (Boolean(_currentCard)) { _currentCard.X = _currentCard.x0; _currentCard.Y = _currentCard.y0; _currentCard.R = _currentCard.rot; _currentCard.S = _currentCard.sca; setChildIndex(_currentCard, _currentCard.dep); _currentCard.btn.visible = true; } _currentCard = e.target.parent as MovieClip; _currentCard.X = stage.stageWidth / 2; _currentCard.Y = stage.stageHeight / 2; _currentCard.R = 0; _currentCard.S = 1; setChildIndex(_currentCard, numChildren - 1); _currentCard.btn.visible = false; } private function enterFrameHandler( e:Event ):void { var card:MovieClip = e.target as MovieClip; card.x += ( card.X - card.x ) * 0.2; card.y += ( card.Y - card.y ) * 0.2; card.rotation += ( card.R - card.rotation ) * 0.2; card.scaleX += ( card.S - card.scaleX ) * 0.2; card.scaleY = card.scaleX; } } } package { import flash.display.Sprite; import box; public class box extends Sprite { public function Main() { var box:box = new box(); } } }

  • ActionScript3.0について質問です。

    ActionScript3.0について質問です。 ムービークリップ(town1)の中にムービークリップ(park)を作成して、その入れ子にしたムービークリップをマウスオーバーしたときにストップをかけたいのですが反応しません。 下のように、parkをクリックしたときにtown1を停止させたく書いてみたのですが、どこが間違っているのか分からずどなたかお力を貸してください! package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komoTown extends Sprite{ public function komoTown(){ town1.park.addEventListener(MouseEvent.MOUSE_OVER,rolloverHandler); } function rolloverHandler(event):void{ town1.stop(); } } } 分かりづらい説明ですみません! よろしくお願いします!!

    • ベストアンサー
    • Flash
  • Actionscript3.0のクラス定義の仕方

    ActionScript3.0のクラス定義について質問なのですが、回転するインスタンスがあり(それは最初からステージに置いてあります)、それがマウスが近づくにつれてだんだん回転が速くなるのを作りたいのですがなかなかうまくいきません。 クラス定義をせずに書いた場合ですとうまくいきましたが、それを外部ファイルにカスタムクラス(と言うんでしょうか?)をした場合、やり方がいまいち理解できずにうまくいかないんです。 クラス定義せずに書いたのはこちらです↓ addEventListener(Event.ENTER_FRAME, onEnterframe); function onEnterframe(eventObj:Event):void { //インスタンスの座標 var hanePt:Point=new Point(hane_mc.x,hane_mc.y); //マウスの座標 var mousePt:Point=new Point(stage.mouseX,stage.mouseY); //インスタンスとマウスの距離 var distance:Number=Point.distance(hanePt,mousePt); //距離が200以下の時に回転する if(distance<200){ hane_mc.rotation+=2000/Math.max(50,distance); } これですとちゃんと動きました。 そしてクラス定義にしたのがこちらです↓ メインのタイムラインのところにはこちらを書いて↓ var mousePt:Point=new Point(stage.mouseX,stage.mouseY); var haneobj1:Hane = new Hane(hane_mc); haneobj1.moveHane(mousePt); 外部ファイルにはこちらを書きました↓ package{ import flash.display.MovieClip; import flash.events.Event; import flash.geom.Point; public class Hane extends MovieClip{ //インスタンスのプロパティ var hane_mc:MovieClip; var ballPt:Point; var distance:Number; public function Hane(hane:MovieClip){ hane_mc = hane; ballPt = new Point(hane_mc.x,hane_mc.y); } public function moveHane(mou:Point):void{ distance = Point.distance(ballPt,mou); addEventListener(Event.ENTER_FRAME, kaitenHandler); } public function kaitenHandler(ev:Event):void{ //距離が200以下の時に回転する if(distance<200){ hane_mc.rotation+=2000/Math.max(50,distance); } } } } とくにエラーは出ないのですが、動くときと動かないときがあります。 動いたとしても一定の動きで、マウスが近づいてもとくに回転速度は変わりません。 どこか間違っているところあればご教授してください!! よろしくお願いします!!!

    • ベストアンサー
    • Flash
  • ActionScript3.0についての質問です

    はじめまして。 いまFlash ActionScript3.0を勉強中です。 フルスクリーンについてどうしてもわからないことがありまして 質問させていただきました。 フルスクリーン処理をasファイルで制作中で、 fullscreenボタンを押すとnormalボタンに切り替わる処理ができません。 特にエラーも起きなくて混乱中です。 すいませんがよろしくお願いします。 ※質問内容以外省略。 package { //インポート import flash.display.Sprite; import flash.display.SimpleButton; import flash.display.Stage; import flash.display.StageDisplayState; import flash.events.Event; import flash.events.MouseEvent; import flash.events.FullScreenEvent; [SWF(backgroundColor="#000000", width="600", height="400", frameRate="30")] public class Main extends Sprite { //プロパティ private var fullscreenBtn:Sprite; private var fullscreenBtn1:SimpleButton; private var normalBtn1:SimpleButton; // コンストラクタ public function Main() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; init(); stage.addEventListener(Event.RESIZE, updatePos, false, 0, true); } // メソッド private function init():void { fullscreenBtn = new Sprite(); addChild(fullscreenBtn); fullscreenBtn.y = 6; var fullscreenBtn1 = new FullscreenBtn(); var normalBtn1 = new NormalBtn(); fullscreenBtn.addChild(fullscreenBtn1); fullscreenBtn.addEventListener(MouseEvent.CLICK,btChangeClicHandler); stage.addEventListener(FullScreenEvent.FULL_SCREEN,stageFullScreenHandler); updatePos(null); } //イベント private function updatePos(evt:Event):void { fullscreenBtn.x = stage.stageWidth - 85; } //マウスイベント private function btChangeClicHandler(evt:MouseEvent):void { if (stage.displayState == StageDisplayState.FULL_SCREEN) { stage.displayState = StageDisplayState.NORMAL; } else { stage.displayState = StageDisplayState.FULL_SCREEN; } } //ボタンの切り替え ※この処理がうまくいきません。エラーは起こりません。 private function stageFullScreenHandler(evt:FullScreenEvent):void { if (evt.fullScreen) { fullscreenBtn.removeChild(fullscreenBtn1); fullscreenBtn.addChild(normalBtn1); } else { fullscreenBtn.removeChild(normalBtn1); fullscreenBtn.addChild(fullscreenBtn1); } } } }

    • ベストアンサー
    • Flash

専門家に質問してみよう