classを作ったのに動かせない理由とは?

このQ&Aのポイント
  • classを作成したにもかかわらず、スクリプトを実行すると「classを読み込めませんでした」というエラーが出ます。
  • 原因を探しているが、まだ特定できていません。
  • スクリプトはムービークリップ「bar_mc」と「center_mc」を動かすためのものです。
回答を見る
  • ベストアンサー

classを作ったのに動きません。

現在classについて勉強中なのですが、自分の書いたスクリプトで実行すると「classを読み込めませんでした」とのエラーが帰ってきます。 何が原因なのか探してみたのですが、いまだにわかりません。 わかる方は教えていただけないでしょうか? ちなみに下に書いてあるスクリプトはclassとそれを動かす新規ファイル「rotation.fla」の1フレーム目に記述したものです。 ステージにはムービークリップ「bar_mc」と「center_mc」が置かれています。 //MyClass01クラス class MyClass01 { var mc:MovieClip; function MyClass01(target:MovieClip) { mc = target; } function circle(x:Number, y:Number, r:Number, d:Number):Void { mc._rotation += d; var rad = mc._rotation * Math.PI / 180; mc._x = x + r * Math.cos(rad); mc._y = y + r * Math.sin(rad); } } rotation.flaの1フレーム目 var barObj:MyClass01 = new MyClass01(bar_mc); bar_mc.onEnterFrame = function() { var x = center_mc._x; var y = center_mc._y; var r = 100; var d = 10; barObj.circle(x, y, r, d); };

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

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

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

書いてあるとおりしてみましたが, ステージ上のインスタンス名 「bar_mc」 のムービークリップが, ステージ上の 「center_mc」 を中心としてちゃんとグルグル回転しましたよ。 ムービープレビューでもパブリッシュでも, 「classを読み込めませんでした」は出ませんでした。 試した環境は Flash Professional 8 で, SWF をパブリッシュする Flash Player のバージョンは 6,7,8 のいずれでも動作しました。 パブリッシュする ActionScript のバージョン設定は当然,ActionScript 2.0 です。 「MyClass01.as」は 「rotation.fla」 と同じフォルダなどにちゃんと保存されていますか? あと,考えられることとしては, 書かれていらっしゃいませんが Flash のバージョン違いでしょうか...。 Flash 8 や Flash MX 2004 では何も考えずにデフォルトのままで問題なく動作すると思います。 Flash MX では無理です。 Flash CS3 Professional の場合は,デフォルトのパブリッシュ設定が, ActionScript3.0 になっていると思いますから,ここを ActionScript 2.0 にしなければなりません。 思い当たるのはそれくらいです。

jeridomasa
質問者

お礼

回答ありがとうございました。 もう一度試してみたら動きました。 原因はファイル名の指定がきちんとできていませんでした。 単純なミスを犯していました。 今回も丁寧に解説していただいてありがとうございました。

関連するQ&A

  • flashで円の描画。

    長文失礼します。 FLASH,CS3でActionScript2.0で作業しています。 FLASHで複数の円を重ねて円グラフの様な描画をしたくて、ネット上にあったソースを自分で少しいじりました。 しかし複数の円を描画しようとすると他の円が消えてしまいます。 外部に円を描画するスクリプト(DrawArc.as)がおいてあります。 //DrawArc.as class DrawArc { var mc:MovieClip; function DrawArc(target:MovieClip) { mc = target; } function drawLine(x:Number, y:Number, radius:Number, arc:Number, startAngle:Number, thickness:Number, color:Number, alpha:Number, yRadius:Number) { mc.clear(); mc.lineStyle(thickness,color,alpha,false,"none","none"); mc.moveTo(x,y); if (arguments.length<8) { return; } if (yRadius == undefined) { yRadius = radius; } if (Math.abs(arc)>360) { arc = 360; } var segs = Math.ceil(Math.abs(arc)/45); var segAngle = arc/segs; var theta = -(segAngle/180)*Math.PI; var angle = -(startAngle/180)*Math.PI; var ax = x-Math.cos(angle)*radius; var ay = y-Math.sin(angle)*yRadius; if (segs>0) { for (var i = 0; i<segs; i++) { angle += theta; var angleMid = angle-(theta/2); var bx = ax+Math.cos(angle)*radius; var by = ay+Math.sin(angle)*yRadius; var cx = ax+Math.cos(angleMid)*(radius/Math.cos(theta/2)); var cy = ay+Math.sin(angleMid)*(yRadius/Math.cos(theta/2)); mc.curveTo(cx,cy,bx,by); } } } } そしてFLASHのフレーム内に import DrawArc; mc = new DrawArc(this); targetNum = 0; onEnterFrame = function () { if (targetNum<=220) { targetNum += 2; change(); } else { delete this.onEnterFrame; } }; function change() { mc.drawLine(Stage.width/2,65,40,-targetNum,90,30,0x69f203,100); } とかいてあります。 これで円を描画してくれるんですが、 さらにもう一つの円を重ねて表示させたいので FLASHのフレーム内に import DrawArc; mc = new DrawArc(this); mc2 = new DrawArc(this);//新しい用 targetNum = 0; targetNum2 = 0;//新しい用 onEnterFrame = function () { if (targetNum<=220) { targetNum += 2; change(); } if (targetNum2<=210) { targetNum2 += 2; change2(); } }; function change() { mc.drawLine(Stage.width/2,65,40,-targetNum,90,30,0x002503,100); mc.mc.swapDepths(10); trace(mc.mc.getDepth()); } function change2() { mc2.drawLine(Stage.width/2,65,40,-targetNum2,90,30,0x69f203,100); mc2.mc.swapDepths(11); trace(mc2.mc.getDepth()); } と書いたのですがDepthが両方とも10になってしまいます。このDepthが別々になれば両方ちゃんと表示されると思うのですが、手詰まりになってしまいました。 どなたか解決策が分かる方教えてください。

    • ベストアンサー
    • 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のクラス定義について質問なのですが、回転するインスタンスがあり(それは最初からステージに置いてあります)、それがマウスが近づくにつれてだんだん回転が速くなるのを作りたいのですがなかなかうまくいきません。 クラス定義をせずに書いた場合ですとうまくいきましたが、それを外部ファイルにカスタムクラス(と言うんでしょうか?)をした場合、やり方がいまいち理解できずにうまくいかないんです。 クラス定義せずに書いたのはこちらです↓ 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
  • Flash AS3 減速運動の不具合の回避方法を教えて下さい

    大重美幸様のAS3.0入門ノートを使って勉強しているものです。 今回その中の「EaseingSimpleクラス」を拡張して、 任意のボタンを押すと、予めそのボタンに引数として登録しておいたステージ上のX座標、Y座標にインスタンスが減速しながら移動するクラスを作ってみました。 そこで問題発生なのですが、 ステージにボタンを二つ以上設置(仮にAとBとします)して、 「Aのボタン」をマウスダウンしてインスタンス(IdoObjとします)の移動開始して、それが指定の座標に到達する前(移動中)に「Bのボタン」を押すと意図しない座標にインスタンスが止まってしまいます。 確実に、インスタンスが静止して、次のボタンを押せば問題は起きないのですが、移動先をすぐに変更させる動きを付けるにどうしたらよいのでしょうか? よろしくお願いいたします。 タイムラインのフレームアクション idoObj→移動するインスタンス btA→ボタンA 100,100→btAが渡すX座標,btAが渡すY座標 btB→ボタンB 200,200→btBが渡すX座標,btBが渡すY座標 ********************************************************** var btObj:idoStage=new idoStage(idoObj,btA,100,100); var btObj2:idoStage=new idoStage(idoObj,btB,200,200); ********************************************************** 今回作製したidoStageクラス(下記のEaseingSimpleクラスを拡張) ********************************************************** package{ import flash.display.MovieClip; import flash.events.MouseEvent; import EaseingSimple; public class idoStage extends EaseingSimple{ var my_mc2:MovieClip;//任意のボタン var zahyoX:Number;//x座標 var zahyoY:Number;//y座標 //コンストラクタ function idoStage(mc:MovieClip,mc2:MovieClip,stgX:Number,stgY:Number){ super(mc); my_mc2=mc2; zahyoX=stgX; zahyoY=stgY; my_mc2.addEventListener(MouseEvent.MOUSE_OUT,onOUT); my_mc2.addEventListener(MouseEvent.MOUSE_OVER,onOVER); my_mc2.addEventListener(MouseEvent.CLICK,onCLICK); } public function onOUT(event:MouseEvent):void{ my_mc.stop(); my_mc2.buttonMode=false; my_mc2.alpha=1; } public function onOVER(event:MouseEvent):void{ my_mc2.buttonMode=true; my_mc2.alpha=0.5; } //引数で受け取った座標を「EaseingSimpleクラスのeaseTo」に渡してイーズする public function onCLICK(event:MouseEvent):void{ easeTo(zahyoX,zahyoY); my_mc2.buttonMode=true; my_mc2.alpha=0.3; } } } ********************************************************** EaseingSimpleクラス (ステージをクリックするとその位置にインスタンスが減速しながら移動します。) ********************************************************** package { import flash.display.MovieClip; import flash.geom.Point; import flash.events.Event; public class EaseingSimple { var my_mc:MovieClip; var endPoint:Point; //コンストラクタ function EaseingSimple(mc:MovieClip) { my_mc = mc; } //イーズ開始 public function easeTo(end_x:Number, end_y:Number):void { endPoint = new Point(end_x, end_y); my_mc.addEventListener(Event.ENTER_FRAME, easeStep); } //繰り返しステップ private function easeStep(event:Event):void { var mcPoint:Point = new Point(my_mc.x, my_mc.y); //2点間の距離 var distance:Number = Point.distance(mcPoint, endPoint); if (distance>1) { var tmpPoint:Point = getTmpPoint(); my_mc.x = tmpPoint.x; my_mc.y = tmpPoint.y; } else { my_mc.x = endPoint.x; my_mc.y = endPoint.y; my_mc.removeEventListener(Event.ENTER_FRAME, easeStep); } } //座標計算 private function getTmpPoint():Point { var tmpX:Number = my_mc.x + (endPoint.x - my_mc.x) * 0.3; var tmpY:Number = my_mc.y + (endPoint.y - my_mc.y) * 0.3; var tmpPoint:Point = new Point(tmpX,tmpY); return tmpPoint; } //イーズ中断 public function stop():void { my_mc.removeEventListener(Event.ENTER_FRAME, easeStep); } } } ********************************************************** 製作環境 FlashCS3

    • ベストアンサー
    • Flash
  • 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
  • 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
  • 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
  • AS3でうまく動作しません

    使用環境 Mac OSX Flash CS4 下記スクリプトを1フレーム目に記述し、 動作確認をしたところmcの縦の長さが伸びたり縮んだりといった意図しない 動作をしてしまいます。 mcの大きさは幅200px高さ100pxです。 よろしくお願いいたします。 var mc:MovieClip = new test_mc(); addChild(mc); mc.x = 100; mc.y = 100; var testNum:Number = 1; mc.addEventListener(Event.ENTER_FRAME,testEF); function testEF(evt:Event):void { mc.y += testNum; if(mc.y <= 0 || mc.y >= 400){ testNum *= -1; } }

    • ベストアンサー
    • Flash
  • 自分への参照を保持

    わからないことがあるので、教えてください。 以下のようなクラスがありました。 class Mover extends MovieClip{ var targetMC:MovieClip var objectRef:Object; var xVel:Number; var yVel:Number; function Mover(targetMC:MovieClip,xVel:Number,yVel:Number){ this.targetMC=targetMC this.targetMC.objectRef=this; this.xVel=xVel; this.yVel=yVel; } function updatePosition(){ this._x+=this.objectRef.xVel; this._y+=this.objectRef.yVel; } function startMoving(){ this.targetMC.onEnterFrame=this.updatePosition; } } わからないのは、コンストラクタの中の this.targetMC.objectRef=this; です。 これはMoverクラス自身を参照してるんですか?targetMCのことなんでしょうか・・・。 このあたりがよくわからないので、わかりやすく教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう