ActionScript 3.0初心者のための質問

このQ&Aのポイント
  • ActionScript 3.0のrandom関数の範囲は?
  • sList[i].vx = Math.random() -0.5;の意味とvxの定義
  • 速度を配列で記入する理由
回答を見る
  • ベストアンサー

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
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • dmq
  • ベストアンサー率80% (21/26)
回答No.4

連投申し訳ございません。 回答No.3のコードにおけるSnowクラスのコンストラクタ、Snow.Snow()に 誤りがありました。正しくは以下の通りです。  /**   * コンストラクタ。   * @param id 通し番号。(番号が小さいほど大きく、速くなります)   */  public function Snow(id:int)  {   var amount:Number = id / LIMIT;   coefficient = amount + 0.1;   cacheAsBitmap = true;   addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);   // ↓ Flashで予めシェイプを作ってリンケージする場合、ここからの処理は不要   var shape:Shape = new Shape();   var r:int = 0xFF * (0.2 + amount * 0.8);   var g:int = 0xFF * (0.5 + amount * 0.5);   var b:int = 0xFF * (0.5 + amount * 0.5);   shape.graphics.beginFill((r << 16) + (g << 8) + b);   shape.graphics.drawCircle(0, 0, SIZE_MIN + (SIZE_MAX - SIZE_MIN) * amount);   shape.graphics.endFill();   addChild(shape);   // ↑ Flashで予めシェイプを作ってリンケージする場合、ここまでの処理は不要  }

naonao321
質問者

お礼

このたびはありがとうございました。 とても読み応えのある文章を大変うれしく思っております。 しばらく検証しましたが、なかなか概念的な所が難しいです。 引き続き検証を続けたいと思いますが、これ以上お礼が長引くのは よくないと思い、書かせていただきした。 後日また質問をさせていただきますので、お見かけになりましたら 是非お願い致します。ありがとうございました。

その他の回答 (3)

  • dmq
  • ベストアンサー率80% (21/26)
回答No.3

※ この回答はNo.2の補足に対するものです。 >B.メイン側はSnowを作るだけで何もせず、Snowに勝手に(自律的に)動いてもらう方法 >について非常に興味があります Flashに限らずどのゲーム制作もそうですが、基本的に子の動きに親が関わっては いけません。親はただ「動け」と命令するだけです。子は「動け」の命令に反応して、 その子が雪なら落下するよう座標を書き換えますし、 その子が鳥なら(もしいたら)雪を避けるようにして飛んでいくでしょう。 その際、雪は風に流されるかもしれませんし、鳥は飛ぶために翼(孫)に 「動け」と命令するかもしれませんが、そんなこと親は知る必要もありません。 そうすると親のプログラムコードはビックリするくらいシンプルに作ることができます。 このように「動け」、と言うだけで各自がまるで生きているかのように勝手な 動きをすることを「多態性(Polymorphism)」と言います。これが理解できると、 Flashを使った複雑なゲームとかが簡単に作れるようになる、最短ルートとなるでしょう。 下記にコードを提示します。何の変哲もない雪を降らせるだけのアニメーションですが、 Mainは雪を一度作って、それ以降は何もしていないことに気づくと思われます。 幸いなことに、Flashには毎フレーム発生するイベント"enterFrame"があるため、 Mainは逐一「動け」と命令することさえもサボることができます。 // ■■■ Main.as package {  import flash.display.Sprite;  [SWF(width="320",height="240",backgroundColor="0x000033",frameRate="60")]  /** ドキュメント クラス。 */  public final class Main extends Sprite  {   /** コンストラクタ。 */   public function Main()   {    var field:Sprite = new Sprite();    for (var i:int = Snow.LIMIT; --i >= 0; )    {     field.addChildAt(new Snow(i), 0);     // 別に間にfieldを挟まなくても構わないが、これでfieldのscale調整してやると     // 画面の一部に雪を降らせたり、fieldを増やして3箇所に雪を降らせたり     // field.rotationを弄ることで雪を降らせる画面をぐるぐる回したりもできる     // SnowみたいにfieldもSpriteを継承してやることで複雑な動きを作ることも    }    addChild(field);   } // これ以降はSnowが勝手に動くので何もしない(あるいはほかの仕事をやらせる)  } } // ■■■ Snow.as package {  import flash.display.Shape;  import flash.display.Sprite;  import flash.events.Event;  import flash.geom.Point;  /** 雪(単体)。 */  public final class Snow extends Sprite  {   /** 限界数量。(これを変えることで雪の数を増減できます) */   public static const LIMIT:int = 500;   /** 最小サイズ。 */   private static const SIZE_MIN:Number = 1;   /** 最大サイズ。 */   private static const SIZE_MAX:Number = 5;   /** 移動速度・方角。 */   private var vector:Point = new Point();   /** 速度を変えるための係数。 */   private var coefficient:Number;   /**    * コンストラクタ。    * @param id 通し番号。(番号が小さいほど大きく、速くなります)    */   public function Snow(id:int)   {    coefficient = amount + 0.1;    cacheAsBitmap = true;    addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    // ↓ Flashで予めシェイプを作ってリンケージする場合、ここからの処理は不要    var shape:Shape = new Shape();    var amount:Number = id / LIMIT;    var r:int = 0xFF * (0.2 + amount * 0.8);    var g:int = 0xFF * (0.5 + amount * 0.5);    var b:int = 0xFF * (0.5 + amount * 0.5);    shape.graphics.beginFill((r << 16) + (g << 8) + b);    shape.graphics.drawCircle(0, 0, SIZE_MIN + (SIZE_MAX - SIZE_MIN) * amount);    shape.graphics.endFill();    addChild(shape);    // ↑ Flashで予めシェイプを作ってリンケージする場合、ここまでの処理は不要   }   /** 位置情報をリセットします。 */   private function reset():void   {    x = stage.stageWidth * Math.random();    y = -SIZE_MAX;    vector.x = 0.1 * Math.random() * coefficient;    vector.y = 1.5 * coefficient;   }   /**    * ステージに登録されたイベントによって呼び出されます。    * @param evt イベント情報。    */   private function onAddedToStage(e:Event):void   {    addEventListener(Event.ENTER_FRAME, onEnterFrame);    reset();    y = stage.stageHeight * Math.random();   }   /**    * 毎フレーム開始時のイベントによって呼び出されます。    * @param evt イベント情報。    */   private function onEnterFrame(e:Event):void   {    x += vector.x;    y += vector.y;    if (y > stage.stageHeight + SIZE_MAX)    {     reset();    }   }  } }

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0
naonao321
質問者

お礼

詳細なご回答ありがとうございます。 なかなか手強そうです。まだまだなぜそのメソッドが必要かが わかるまでに至っておりませんが、いただいた記述をもとに しつこくやっていきたいと思います。

  • dmq
  • ベストアンサー率80% (21/26)
回答No.2

前回回答で言いそびれてしまいましたが、質問のタイトルには何がどう わからないかを簡潔に書くと皆がちゃんと質問を見てくれるようになりますよ? (初心者です、とか解りません、だけだとページすら見てくれない人が結構多いです) 1.前回のコードを含めて総合的にみると、フレームごとのX増加量のように思えます。 sList[i].x = 100とすると画面左端によった状態での降下となる現象に ついては、このソースから把握するのは困難しいです。前回ソースの //x方向とy方向の動き設定(奥のものほど遅くなる) に該当する部分はどこに行ってしまったのでしょうか?Snow.as、なければSnowと言う 名前でリンケージされているシンボルにアクションが含まれていないでしょうか? 2.一言で言うと、「Snowを動かすため」です。方法として、大きく2通りがあります。 A.Snowを配列に登録して、メイン側が一つ一つ監視、操作していく方法  (入門者向け。ごく簡単なムービーによく使われます。今回はこちらですね) B.メイン側はSnowを作るだけで何もせず、Snowに勝手に(自律的に)動いてもらう方法  (中~上級者向け。本格的なFlashムービー制作には絶対外せない方法です) ソースを見る限り前者Aの作りになっているようなので、Aの動きについて解説します。 ・メインはSnowを220個作り、表示のためステージに登録するが、さらにメインが監視を  するため作った220個のSnowを配列に登録する。(この登録するメソッドがpushです) ・配列の中身を総なめして、一つ一つ移動量に応じてXY座標を操作する。  300より下に行き過ぎたやつは画面上に引き上げる。 自律して動いてもらうのでしたら、配列に登録(push)は要らないですが、メインが Snowを監視するのでしたらSnowがメインから見れる場所にいないとだめです。

naonao321
質問者

補足

度重なるご回答ありがとうございます。 お話にあった、B.メイン側はSnowを作るだけで何もせず、Snowに勝手に(自律的に)動いてもらう方法について非常に興味があります。大まかにどのような考え方なのかご説明いただけませんでしょうか? 是非よろしくお願い致します。

  • dmq
  • ベストアンサー率80% (21/26)
回答No.1

ソースを30秒眺めて、雪を降らせるムービーと推測しました。 1.Math.random()は0以上1未満の値を取得します。そこから-0.5しているので、  結果的に-0.5以上0.5未満となります。 2.このvxは使われていません。消しても問題ありません。sListのBall.vxと  混同されているようですが、たまたま名前が同じなだけで関係ありません。 3.この「雪」は左右に流れていきます。バラバラに流れさせるために配列を  使っています。配列じゃないと、全部の雪が一方向に流れていきます。また、  都度ランダムで左右の速度を決めると、雪がブルブル震えだして不自然となります。

参考URL:
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/Math.html#random()
naonao321
質問者

補足

dmq様 ご回答ありがとうございます。 掲載させていただいた参考スクリプトは 今回の質問の場合少し不適切でしたので、 以下のスクリプトについて、再度ご回答といただけないでしょうか。 よろしくお願い致します。 以下のスクリプトにて 1、中段に sList[i].xv = Math.random()-0.6;という記述 をご覧になられると思いますが、このxvを消すと動かずにエラーがおきます。 xvからxのみにすると今度は最初はランダムに配置されたオブジェクトが、しかしすぐに左端に大集合してしまいます。このvxは毎フレームごとのxの増加量と考えてよろしいのでしょうか? また、sList[i].xv = Math.random()-0.6;について、 これをsList[i].x = 100とするとすべてのオブジェクトがx座標100のまま降下していくと考えたのですが、画面左端によった状態での降下でした。どうしてこのようになるのでしょうか? 2、同じく中盤の sList.push(snow);という記述について、 なぜこのような操作が必要なのでしょうか?恐らく、必要な事は間違いないと思いますが、どのような考え方によってこれが記述されたかがあまりよくわかりません。 //数 var num:int = 220; //いれる配列 var sList:Array = []; for (var i:int = 0; i<num; i++) { //作成 var snow:Snow = new Snow(); //初期位置 snow.x = Math.random()*stage.stageWidth; snow.y = Math.random()*stage.stageHeight; //大きさを生成順に小さくしていく snow.scaleX = snow.scaleY = 1/(0.02*i+1); //配置して配列にいれる addChildAt(snow, 1); sList.push(snow); //それぞれのX方向の速度設定 sList[i].xv = Math.random()-0.6; } //動きのイベント addEventListener(Event.ENTER_FRAME,parallax); function parallax(e:Event):void { for (i=0; i<num; i++) { //画面の下にでたら上に移動 if (sList[i].y>300) { sList[i].x = Math.random()*stage.stageWidth; sList[i].y = 0; } } } 長文に渡り恐縮です。 是非よろしくお願い致します。

関連するQ&A

  • ActionScript3.0 雪を降らせる方法

    はじめまして! Flashを勉強し始めたばかりの初心者ですが 雪のインスタンスを作成し、ステージの上から下へランダムな大きさで(ぼかしも入れつつ)降ってくるムービーを作りたいと思っています。 色々検索した結果、下記サンプルソースを発見したので とりあえず、 「snow_mc」というムービークリップをflaファイルのライブラリに格納し ParticleSimulatorクラスをリンゲージ設定後、 下記フレームアクションに追加したのですが、、、雪が降ってきません・・ var Snowdrop = new ParticleSimulator(); addChild (Snowdrop); エラーもでてこないのでどこをどう直せばいいかわらず困っております・・ まったくのど素人で申し訳ありませんが どなたかご教授いただけるととっても助かります! ちなみに、使用したクラスは下記です。 <ParticleSimulatorクラス> package{ import flash.display.*; import flash.events.*; public class ParticleSimulator extends Sprite{ private static var GRAVITY:Number = 9.8; private static var ro:Number = 1.205; private static var nyu:Number = 0.00001512; private var myImage:Class; private static var w:int = 685; private static var h:int = 455; public function ParticleSimulatorR(){ var bitmap:Bitmap = new myImage(); addChild(bitmap); for(var i:int = 0 ; i < 100 ; i++){ var l:Number = Math.random() * 0.000005; var p:Particle = new Particle(l*1500000); p.x = w*Math.random(); p.y = h*Math.random(); p.alpha = Math.random()/2 + 0.4; p.diameter = l; p.mass = l * 10; addChild(p); p.addEventListener(Event.ENTER_FRAME, loop); } } public function loop(e:Event):void{ var p:Particle = Particle(e.target); p.t++; p.vy = Math.pow((p.mass * GRAVITY) / (3 * Math.PI * ro * nyu * p.diameter), (1 - Math.exp(-3*Math.PI*ro*nyu* p.diameter * p.t/ p.mass))); //p.x += 1; p.y += p.vy; // マウスからの距離 var distance:Number = Math.sqrt((mouseX - p.x)*(mouseX - p.x) + (mouseY-p.y)*(mouseY-p.y)); // 加速度(距離が近いほど大きく、質量が大きいほど小さく) p.ax = (400 / distance) * 0.1 / (p.mass * 1000000); if(mouseX > p.x) p.ax *= -1; p.vx += p.ax; p.x += p.vx; if(p.x > w || p.y > h){ p.x = w*Math.random(); p.vx = p.ax = 0; p.y = 0; p.t = 0; } } } }

  • actionscriptに詳しい方助けてorz

    actionscript3.0を勉強中の初心者です。 現在、フルフラッシュサイトを制作中なのですが、 基本はactionscriptを使用しないで、 作っているのですが、 一部、雪を降らせる演出をactionscriptで実装しています。 そのスクリプトは組めたのですが、 実際にその演出をしたい階層がうまく変更できません。 現状は最前面になっているのですが、 それを最背面の一つ手前にしたいです。 具体的なビジョンとしては 最背面の背景→その上にある画像(部分的に切り抜かれて背景が見えます) この二つの間に雪を降らせたいのですが、 うまくいきません。 何か方法をご存知の方いたら教えていただけると助かります。 スクリプトは下記になります。 addEventListener(Event.ENTER_FRAME , onNewSnow) ; function onNewSnow(eventObj : Event) : void { if (Math.random() <0.3) { var snow_mc:snows = new snows(); snow_mc.x=stage.stageWidth*Math.random(); snow_mc.y=-20; snow_mc.scaleX=snow_mc.scaleY=Math.random()+0.5; addChild(snow_mc); snow_mc.addEventListener(Event.ENTER_FRAME, onSnowStep); } } function onSnowStep(eventObj:Event):void { var target_mc:MovieClip=eventObj.target as MovieClip; target_mc.rotation+=Math.ceil(20/target_mc.scaleX); target_mc.x+=4*Math.random()-2; target_mc.y+=5; if (target_mc.y >(stage.stageHeight+target_mc.height)) { target_mc.removeEventListener(Event.ENTER_FRAME, onSnowStep); removeChild(target_mc); } }

    • ベストアンサー
    • Flash
  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • AS2 ランダムに出現する煙

    初めて質問させてもらいます。 FLASHのActionScriptで画面下から画面上へ昇っていく煙をランダムに出現させるASを作成したのですが、動き的には満足しているのですが開始時に画面に一気に煙がですぎになります。 煙のない状態から始めるには何を付け加えればいいのかわかりません。 どなたかご教授願えるかたお願いいたします。 環境 FLASH cs3.AS2にて製作 ソース ・タイムライン ----------------------------------------------- for (var i = 0; i<10; i++) { snow.duplicateMovieClip("snow"+i, i); } ----------------------------------------------- ・mc ----------------------------------------------- onClipEvent (load) { sw = Stage.width; sh = Stage.height; th = this._height; this._x = Math.random()*sw; this._y = Math.random()*sh; speed = Math.random()*4+1; flick = Math.random()*4+1; rotate = Math.random()*1; } onClipEvent (enterFrame) { this._y -= speed; this._x -= flick; this._rotation +=rotate; if (this._y<-869.8) { this._y = 1400; } if (this._x>sw+th || this._x<-th) { this._x = Math.random()*sw; this._y = -th; } } ----------------------------------------------- よろしくお願いいたします。

    • ベストアンサー
    • 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
  • Flash ActionScript 3のエラー

    下記のコードについて、エラーがわからず困っています。 上から13行目の(stage.addChild(background)に対して、 Error Message: "Cannot access a property or method of a null object reference." がでます。 この13行目までは、ちゃんと動いていたのに、これ以降コードを加えていくと、 動きません。 お分かりになる方、どうぞ教えてください。 まだ初心者(2週間)なので、初歩的な質問かもしれませんが、よろしく お願いします。 [コード] import flash.display.MovieClip; import flash.display.Stage; import flash.events.Event; public class GameEngine extends MovieClip { public function GameEngine() { super(); //create background and add to stage var background:Background = new Background(); stage.addChild(background); background.x = 500 / 2; background.y = 400 / 2; //create fly and add to stage var fly:Fly = new Fly(stage); stage.addChild(fly); fly.x = 100; fly.y = 400 / 2; //creat new enemy objects addEventListener(Event.ENTER_FRAME, createEnemy, false, 0, true); } private function createEnemy(e:Event):void{ if(Math.floor(Math.random() * 90) == 5){ var enemy:FlySwatter = new FlySwatter(stage); } } } (行はじめの } の余白が入力した通りに表示されませんので、余白は無視してください)

  • removeChild()についてご教授願います。

    AS3.0の初心者です。 Stratボタン、Stopボタンで以下のスクリプトで表示と非表示を繰返ししたいのですが、 Stopボタンで、単にremoveChild();にしますと、 「#2025: 指定した DisplayObject は呼び出し元の子でなければなりません。」 とエラーとなります。 色々と調べてみたのですが、よく判判りません。 Stopボタンの記述をどの様にすればよいのでしょうか? 初歩的質問で大変恐縮ですが、どうかご教授お願い致します。 [メインスクリプト] var stageH = stage.stageHeight; var stageW = stage.stageWidth; //Stratボタン start.addEventListener(MouseEvent.MOUSE_DOWN,gene); function gene(e:Event):void { for (var i = 0; i < 20; i++) { var mc:Candy = new Candy(); mc.x = Math.random()*stageW + 10; mc.y = Math.random()*stageH + 10; addChild(mc); } } //Stopボタン stop.addEventListener(MouseEvent.MOUSE_DOWN,stp); function stp(e:Event):void { removeChild(mc); この部分がよく判らないのですが、 どの様に記述したら良いのでしょうか? } --------------------------------------- [mc のスクリプト] var mcH:int = this.height; var mcW:int = this.width; var stageH = stage.stageHeight; var stageW = stage.stageWidth; var speedY:uint = Math.random() * 5 + 5; var speedX:uint = Math.random() * 2; addEventListener(Event.ENTER_FRAME,loop); function loop(Event):void { y += speedY; x += speedX; if ( y > stageH ) { y = - mcH; } if ( x > stageW ) { x = - mcW; } } -----------------------------------------

    • ベストアンサー
    • Flash
  • 円をランダムで描画していき、最初の円から徐々に透明になる

    現在AS3.0にてランダムで永遠と円を描きながらも、描画した円から順番に透明になっていくスクリプトを書いているのですが、以下のスクリプトですと全体が透明になっていき、最終的に何も残らなくなってしまいます。 常に透明度1の円を描画しつつも、先に描画した円から徐々に透明になっていくスクリプトにするにはどうすればよいのでしょうか?ご教授お願いできればと思います。 addEventListener(Event.ENTER_FRAME, rain); import flash.display.Sprite; import flash.display.MovieClip; var mySprite:Sprite = new Sprite(); var myClip:Sprite = new Sprite(); addChild(myClip); function rain(event:Event):void { with(mySprite.graphics) { var circle:int = Math.floor(Math.random()*100); var stageX:int = Math.floor(Math.random()*stage.stageWidth); var stageY:int = Math.floor(Math.random()*stage.stageHeight); beginFill(0x000000); drawCircle(stageX, stageY , circle); endFill; myClip.addChild(mySprite); var diff:Number = 0.01; myClip.alpha -= diff; } }

    • ベストアンサー
    • Flash
  • 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
  • Flashで画面全体にインスタンスを降らす

    Flashで作成した画面内に作成したインスタンスを降らすという アニメーションを作成しました。 ■as3 --------------------------------------------------------------- stage.scaleMode = StageScaleMode.NO_SCALE; var w:int = stage.stageWidth; var h:int = stage.stageHeight; stage.addEventListener(Event.RESIZE, function(event){ w = stage.stageWidth; h = stage.stageHeight; }); var num:int = 10; var list:Array = []; for (var i:int = 0; i<num; i++) { var mc:Mc = new Mc(); mc.x = Math.random()*w; mc.y = -30; addChildAt(mc, 1); list.push(mc); list[i].vx = Math.random()-0.5; } addEventListener(Event.ENTER_FRAME,parallax); function parallax(e:Event):void { for (i=0; i<num; i++) { if(list[i].x != 0){ list[i].x += list[i].vx/(0.03*i+1); list[i].y += 5/(0.03*i+1); }else{ list[i].y += h; } if (list[i].y>h) { list[i].x = Math.random()*w; list[i].y = 0; } } } こちらはFlashをパブリッシュしてswfだけで見れば、 問題なく、y:-30からパラパラ降り注いだものになります。 下まで行けば上にもどって繰り返します。 ただ、下記のようにして、 html上に可変状態で挿入すると 中途半端な位置から降り注いでしまいます。 ■html/css -------------------------------------------------------------- <style type="text/css"> <!-- #apDiv1 { position:absolute; left:0; top:0; width:100%; height:100%; z-index:1000; background: #999900; } --> </style> <script src="Scripts/AC_RunActiveContent.js" type="text/javascript"></script> </head> <body> <div id="apDiv1"> <script type="text/javascript"> AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','100%','height','100%','src','motion','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','motion','wmode','transparent'); //end AC code </script><noscript><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="100%" height="100%"> <param name="movie" value="motion.swf" /> <param name="quality" value="high" /> <param name="wmode" value="transparent"> <embed wmode="transparent" src="motion.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="100%" height="100%"></embed> </object> </noscript></div> ちゃんと全画面にswfは広がっているようなのですが・・・ 何か考えられる原因はございますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash