電子書籍の厳選無料作品が豊富!

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);
}
}
}
}
とくにエラーは出ないのですが、動くときと動かないときがあります。
動いたとしても一定の動きで、マウスが近づいてもとくに回転速度は変わりません。
どこか間違っているところあればご教授してください!!
よろしくお願いします!!!

A 回答 (2件)

>>1さん来ないみたいなので代わりに補足レス



>未定義stage

Haneクラスのインスタンスが
stageにaddChildされてないと
Haneインスタンスのstageはnullです

もう少しいうとこのHaneクラス自体は
MovieClipの拡張クラスである必要性が
あんまりないように思います

hane_mcにリスニングさせればいいかと思います



public function moveHane(mou:Point):void{

distance = Point.distance(ballPt,mou);
addEventListener(Event.ENTER_FRAME, kaitenHandler);
}

public function kaitenHandler(ev:Event):void{
if(distance<200){
hane_mc.rotation+=2000/Math.max(50,distance);
}



public function moveHane():void{
hane_mc.addEventListener(Event.ENTER_FRAME, kaitenHandler);
}
public function stopHane():void{
hane_mc.removeEventListener(Event.ENTER_FRAME, kaitenHandler);
}
private function get dst():Number{
return new Point(hane_mc.mouseX,hane_mc.mouseY).length
}

public function kaitenHandler(ev:Event):void{
if(dst<200){
hane_mc.rotation+=2000/Math.max(50,dst);
}


片づけ用にstopHane()を用意
distanceをdstとしてgetter実装
これでdistanceとballPtプロパティは不要になってます
    • good
    • 0
この回答へのお礼

とても分かりやすい説明有り難うございました!!
おかげでスッキリしました!
getterの使い方も分かったので大変勉強になりました。

ありがとうございます!!

お礼日時:2010/12/17 01:03

1) var mousePt:Point=new Point(stage.mouseX,stage.mouseY);


2) var haneobj1:Hane = new Hane(hane_mc);
3) haneobj1.moveHane(mousePt);

1) でマウスの座標を取得した後に、、
3) でマウスの座標を引数で渡していますね。
マウスの座標は 1) で1回しか取得していないので、常に同じ数値で計算しています
なので、一定の動きをしています。

マウスの座標を常に取得してあげましょう。

この回答への補足

すみません追記です。
できれば

var mousePt:Point=new Point(stage.mouseX,stage.mouseY);

を外部のファイルに記述したいのですが、記述すると「未定義stage...」とエラーが出てしまいます。
これは何かインポートしなくてはならないのでしょうか?
もしよろしければ助言頂けると嬉しいです!

補足日時:2010/12/08 00:54
    • good
    • 0
この回答へのお礼

ありがとうございます!!
はい、一応そこまではそうだろうなと思ってはいたのですが、そこからどうすればいいのか色々試したのですがなかなかうまくいかず。。。

もう少し助言を頂けると嬉しいです!

お礼日時:2010/12/07 23:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!