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

こんにちは

windows flash8を使用しています。

正円のMC(circle)をホイールマウスを1回まわすごとに
18度回るようにしたいとおもっています。また、何周でもできるようにしたいです。移動の際は、減速しながら移動させようと思います。
以下のスクリプトで大体狙った動きを表現することはできたのですが、
--------------------------------------
my_ls = new Object();  //リスナーオブジェクト

n=0;  //ホイールの回ったメモリ数。初期値は0

my_ls.onMouseWheel = function(delta){
n += delta;   //deltaはホイール1メモリで3(-3)です。
}
_root.circle.onEnterFrame = function(){
R_pos = 6*n
R_dif = Math.round((R_pos - this._rotation)*0.5);
this._rotation += R_dif;
if(Math.abs(this._rotation - R_pos)<2){
this._rotation =R_pos;
}
}

_root.circle.onRollOver = function(){
Mouse.addListener(my_ls);
}

_root.circle.onRollOut = function(){
Mouse.removeListener(my_ls);
}

-------------------------------------

なぜか、回転が半分(180度)を超えるとくるくると回り続けてとまらなくなります。

まだactionscript初心者で調べながらやっているんですが、
どうしても原因がわかりません(><)

どうかよろしくお願いします!

A 回答 (1件)

なるほど,180度を超えるとクルクル回り出しますね。



原因はこれです↓。

Flashドキュメンテーション
_rotation (MovieClip._rotation プロパティ)
http://livedocs.macromedia.com/flash/8_jp/main/0 …
 --- Fumio Nonaka 氏 の訂正を含めて引用 ---
 > 時計回りに回転させる場合は 0 ~ 180 の値を指定します。
 > 反時計回りに回転させる場合は 0 ~ -180 の値を指定します。
 > この範囲を超える値は、360の倍数を加算または減算され、
 > 範囲内に収まる値が取得されます。


180度までは良いんですけど,
例えば181度になったとすると(実際にはなりませんが),
181度 = -179度 となるわけです。
すると,
書かれているスクリプトだと onEnterFrame で逆回転に 1周し始めようとしだすのです。
クルクル回り出すのではなくて,逆方向に暴走しだすのです。


180度や-180度を超えると再計算されるのですから,
this._rotation で自分自身を基準にすると,ダメなのです。

this._rotation の変わりに,変数を作り,
その変数を加算減算して,その結果を,
this._rotation に持っていけば,再計算されても問題はなくなります。

----------------------------------------
my_ls = new Object(); //リスナーオブジェクト

n=0; //ホイールの回ったメモリ数。初期値は0
// ↓★この変数追加
circle_rotat = 0;

my_ls.onMouseWheel = function(delta){
n += delta; //deltaはホイール1メモリで3(-3)です。
}
_root.circle.onEnterFrame = function(){
R_pos = 6*n
// ↓★この行変更
R_dif = Math.round((R_pos - circle_rotat)*0.5);
// ↓★この行変更
circle_rotat += R_dif;
// ↓★この行変更
this._rotation = circle_rotat;
// ↓★この行変更
if(Math.abs(circle_rotat - R_pos)<2){
// ↓★この行変更
circle_rotat =R_pos;
// ↓★この行変更
this._rotation = circle_rotat;
}
}

_root.circle.onRollOver = function(){
Mouse.addListener(my_ls);
}

_root.circle.onRollOut = function(){
Mouse.removeListener(my_ls);
}
----------------------------------------

これで行けるでしょう↑。
書かれてある内容自体は一切変えていません。
ダイレクトに this._rotation を動かすのではなく,
変数 circle_rotat を動かして,その値を this._rotation に代入しているだけです。
    • good
    • 0
この回答へのお礼

sassakunさんありがとうございます!
ソースの直しまで・・・ほんとたすかりました^^
原因の内容がわかるとなるほどってかんじでした、
早速がんばって勉強します!
ほんとありがとうございました^^

お礼日時:2006/06/06 01:42

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