こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

角度を指定して回転

スクリプト1
////////////////////////////////////////////////////////////////

onClipEvent (load) {
this.x_rotation = 0;
d = 1;
}

onClipEvent (enterFrame) {
this._rotation = _rotation += d;
if (this._rotation>=90 || this._rotation<=0) {
d = -d;
}
}

////////////////////////////////////////////////////////////////

スクリプト2
////////////////////////////////////////////////////////////////

onClipEvent (load) {
this.x_rotation = 0;
}

onClipEvent (enterFrame) {
this._rotation = _rotation += 1;
if (this._rotation>=90) {
this._rotation = -1;
}
}

////////////////////////////////////////////////////////////////

これは、MCが0度~90度の範囲で行ったり来たりするscriptです。
正常に動かないというわけではありませんが、スクリプト2では、90度に達した後いきなり0度に戻ってしまいます。
90度に達したら80度、70度と0度まで戻って欲しいのです。
なぜdを使うのか、スクリプト2ではダメなのかいまいちよく分かりません。

理由と考え方を教えてください。
よろしくお願いします。

投稿日時 - 2008-05-22 07:21:38

QNo.4040880

すぐに回答ほしいです

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

とりあえず,
スクリプト1 の各行に註釈日本語を入れると次のようになります。

---------------------------------------
// このムービークリップが表示されたとき
onClipEvent (load) {
// ↓間違いですよね???
// this.x_rotation = 0;
// このムービークリップの回転を0度にする
this._rotation = 0;
// 変数 d の値を -1 にする
d = 1;
}

// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) {
// 回転を d(1) ° 加算する
this._rotation = _rotation += d;
// もし 90° 以上 または 0° 以下になれば
if (this._rotation>=90 || this._rotation<=0) {
// 変数 d の正負 を逆にする
d = -d;
}
}
---------------------------------------


スクリプト2 の各行に註釈日本語を入れると次のようになります。

---------------------------------------
// このムービークリップが表示されたとき
onClipEvent (load) {
// ↓間違いですよね???
// this.x_rotation = 0;
// このムービークリップの回転を 0°にする
this._rotation = 0;
}

// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) {
// このムービークリップの回転を 1°加算して
// その角度にこのムービークリップの回転を合わせる
this._rotation = _rotation += 1;
// もしこのムービークリップの回転が 90°以上になれば
if (this._rotation>=90) {
// このムービークリップの回転を -1°にする
this._rotation = -1;
}
}
---------------------------------------


本題とはあまり関係がありませんが,
すごく気になる点があるのでまずそこから。

 // このムービークリップの回転を 1°加算して
 // その角度にこのムービークリップの回転を合わせる
 this._rotation = _rotation += 1;

という妙な書き方は普通しません。
 太郎君の出席番号を15にして,
 太郎君の出席番号を太郎君の出席番号にする。
これは別に間違いではありませんが,
太郎君の出席番号を2回も15にする意味は普通ありません。

とにかくそこはどうでも良いです。
その書き方は変であっても,
1フレーム進む時間ごとに 1°ずつ時計回りに回転することには違いありません。

とにかく1フレーム進む時間ごとに 1°ずつ時計回りに回転して,
そして,
 // もしこのムービークリップの回転が 90°以上になれば
 if (this._rotation>=90) {
   // このムービークリップの回転を -1°にする
   this._rotation = -1;
 }
これで 90°回転したとき,回転は -1°になります。


> スクリプト2では、90度に達した後いきなり0度に戻ってしまいます。

正確に書き替えるとこういうことです↓。
→スクリプト2では、90度に達したときいきなり-1度になってしまします。
さらに厳密に書くと,90度になった瞬間-1度になるので90度の状態は見えません。
→スクリプト2では、89度に達したあと-1度になってしまします。
ということになります。


スクリプト2の各フレーム時間毎の角度↓
(#1の方の書かれていらっしゃる通りです。)

    0→1→2→…→89(→90表示されずに即↓)
 -1→0→1→2→…→89(→90表示されずに即↓)
 -1→0→1→2→…→89(→90表示されずに即↓)
     …      …      …

つまり,スクリプト2ではダメと言うのではなく,
スクリプトに書いてあるそのままの通りに実行されているだけです。



====================

> なぜdを使うのか、

dを使うとシンプルで簡単だからでしょうね。
簡単で確実なものが良いです。

他の方法も考えてみましたが複雑になるだけですし,
また,どの方法を使っても,どこかで変数は必要になると思います。


回転速度 d を変数にせずに,
1 や -1 を直接回転角度に代入する方法例1↓。

-----------------------------------
// このムービークリップが表示されたとき
onClipEvent (load) {
// フラグである変数 flag を true にする
flag = true;
}

// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) {
// もし flag の値が true であれば
if (flag) {
// このムービークリップの回転を 1°加算
this._rotation += 1;
} else {
// flag が true でなければ
// このムービークリップの回転を 1°減算
this._rotation -= 1;
}
// もし このムービークリップの回転が 90°以上
// もしくは 0°以下になれば
if (this._rotation>=90 || this._rotation<=0) {
// flag の true と false を逆転させる
flag = !flag;
}
}
-----------------------------------


回転速度 d を変数にせずに,
1 や -1 を直接回転角度に代入する方法例2↓。

-----------------------------------
// このムービークリップが表示されたとき
onClipEvent (load) {
// 回転角度をメモしておく変数 memo の初期化
memo = 0;
}

// 1フレーム進む時間ごとに毎回実行
onClipEvent (enterFrame) {
// もし今の回転が memo 以上であれば
if (this._rotation>=memo) {
// このムービークリップの回転を 1°加算
this._rotation += 1;
// もし今の回転が memo 以下であれば
} else if (this._rotation<memo) {
// このムービークリップの回転を 1°減算
this._rotation -= 1;
}
// もし このムービークリップの回転が 90°以上になれば
if (this._rotation>=90) {
// このムービークリップの回転角度+1 を memo に代入
memo = this._rotation+1;
// もし このムービークリップの回転が 0°以下になれば
} else if (this._rotation<=0) {
// このムービークリップの回転角度+1 を memo に代入
memo = this._rotation-1;
}
}
-----------------------------------

「何を複雑で危ないこと(不確実なこと)してるの?!」
という感じです。
書いてはみましたがこういう方法は使わない方が良いです。
特に 直接回転角度に代入する方法例2 はダメです。

やはり 書かれていらっしゃるようなものの場合 は,
スクリプト1のように,
回転角度を変数にした d のようなものを使った方が良いと思います。

投稿日時 - 2008-05-22 18:35:41

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

_rotationの値をよく見て(トレースして)みましょう。

■スクリプト2での_rotationの中身
 0 // 初期化
 1 // 1回目
 2 // 2回目
 :
 89 // 89回目
 90 // 90回目 ここで"if(_rotation>=90)"条件が満たされる
 -1 // 90回目のif文の中の処理
 0 // 91回目
 1 // 92回目
 :

上の問題を解決するには、スクリプト1で d を使えば解決できるのがわかると思います。

投稿日時 - 2008-05-22 10:30:12

あなたにオススメの質問