トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     回転についてのロジック
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
chillout
Åê¹ÆNo.8884
投稿日時: 2004-7-5 23:13
新米
居住地:
投稿: 8
使用環境:
MacOSX10.4, Flash CS3
回転についてのロジック
ロジックを考えていて行き詰まってしまったのでご教示ください。
ムービークリップの現在の角度をcurrentRotationとし、
目標となる角度をtargetRotationとしたとき、
currentRotationからtargetRotation間での回転が「右回転」の方が速いか「左回転」の方が速いかを判定するロジックを考えています。
たとえば、currentRotationが45でtargetRotationが-90のときは「左回転」といった具合です。
図などに書けば一目瞭然なのですが、これをスクリプトで動的に判定したいのです。
ヒントだけでも教えていただけないでしょうか?
野中文雄
Åê¹ÆNo.8889
投稿日時: 2004-7-6 6:59
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 回転についてのロジック
図に描いて判断する過程を、論理的に言葉で表現することが大切です。

(1)差を取って、(2)360度に換算した正数の角度(0≦θ<360)が、(3)180より大きければ、左回りでしょう。
// フレームアクション
currentRotation = 45;
targetRotation = -90;
bLeft = (((targetRotation-currentRotation)%360+360)%360>180);
trace(bLeft);  // 出力: true;

引用:
chilloutさんは書きました:
ムービークリップの現在の角度をcurrentRotationとし、
目標となる角度をtargetRotationとしたとき、
currentRotationからtargetRotation間での回転が「右回転」の方が速いか「左回転」の方が速いかを判定するロジックを考えています。
たとえば、currentRotationが45でtargetRotationが-90のときは「左回転」といった具合です。
図などに書けば一目瞭然なのですが、これをスクリプトで動的に判定したいのです。


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

chillout
Åê¹ÆNo.8895
投稿日時: 2004-7-6 14:34
新米
居住地:
投稿: 8
使用環境:
MacOSX10.4, Flash CS3
Re: 回転についてのロジック
こんなにスマートに記述できるのですね!
ありがとうございます。
野中さんのポストや執筆された本にはいつも勉強させていただいています。

一点理解できない部分があります。
360度に変換している部分、
(rotation%360+360)%360
ですが、なぜこのような式で変換できるのかわかりません。
結果を見ると確かに変換できているのですが、理屈が理解できないです。
公式として覚えてしまうのもいいですが、できれば理解したいと思いますので
ご教示いただけないでしょうか?
野中文雄
Åê¹ÆNo.8897
投稿日時: 2004-7-6 15:35
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 回転についてのロジック
理屈がわかりませんと、応用できませんね。理解は大事だと思います。
引用:
chilloutさんは書きました:
360度に変換している部分、
(rotation%360+360)%360
ですが、なぜこのような式で変換できるのかわかりません。
...
公式として覚えてしまうのもいいですが、できれば理解したいと思いますので
ご教示いただけないでしょうか?

今日から数えて70日後は、何曜日でしょう? 火曜日であることは、すぐにおわかりになりますね。1週間は7日周期ですから、7で割算した余り(剰余)が同じ日は、同じ曜日になるからです。

逆に、ある範囲の整数を周期的に得たい場合には、その範囲となる整数の剰余を利用します。MovieClipインスタンスにつぎのMovieClipアクションを設定すると、時計回りに回転するとともに、変数nRotationの値とそれを360で割った剰余が[出力]されます。剰余は1周360度ごとに、0に戻ることがわかります。
// MovieClip: 回転するインスタンス
// MovieClipアクション
onClipEvent (load) {
    var nRotation = 0;  // MX 2004対応
}
onClipEvent (enterFrame) {
    nRotation += 10;
    // nRotationとその360の剰余を出力
    trace([nRotation, nRotation%360]);
    this._rotation = nRotation;
}

しかし、実際のMovieClip._rotationプロパティは、-180より大きく180以下の値を返します。これを0から360の正数にするには、割る数360を加えればよいでしょう。ある日の丁度1週間後の曜日は、その日と同じはずだからです。
// MovieClipアクションを一部修正
onClipEvent (enterFrame) {
    nRotation += 10;
    this._rotation = nRotation;
    // _rotation値、その360の剰余、360を加えて得た剰余を出力
    trace([this._rotation, this._rotation%360, (this._rotation+360)%360]);
}

MovieClip._rotationプロパティと異なり、変数nRotationは-3600という値を取るかもしれません。その場合360を加えたのでは足りません。では、正数になるまで(つまり10回)360を足さなければならないでしょうか? マイナスの値も360の剰余を取れば、必ず-360より大きい数値になります。

改めて、最初の式をご覧ください。


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

chillout
Åê¹ÆNo.8898
投稿日時: 2004-7-6 16:08
新米
居住地:
投稿: 8
使用環境:
MacOSX10.4, Flash CS3
Re: 回転についてのロジック
いただいた解説を理解できるまでよく読んでみます。
まだ完全には理解できていませんが、目から鱗状態です。
本当にありがとうございました!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops