• ベストアンサー

時計の針を回転させる

テキスト入力ボックス と 時計の針 を作り、テキスト入力ボックスに3と入力すると90度に針が傾き3時を指し、6と入力すると針が180度傾き6時を指す というASを書きました。 onClipEvent ( enterFrame ){   H01 = (360/12)*_root.HTjikan;   /*変数01 = 360度を12分割 × 変数テキスト時間(テキスト入力枠)で時計の針の角度を算出*/   this._rotation = this._rotation+((H01-this._rotation)/2);   /*1/2づつ針が回転して行き、目的の角度になったら制止 */ } しかし、上記ASだと180度以上(6時以降)に設定すると、針が指定のところで止まらず、ぐるぐる回ってしまいます。自分なりに調べてみると、_rotationが180度を超えると -180 を返している為、上記の式では対応できず、針がぐるぐる回ってしまうという状態です。 6時以降も同様に時計の針を動かしたいのですが、何か良い方法はないものでしょうか? アドバイスやご教授をいただけたらと思います。 よろしくお願いします。

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

  • ベストアンサー
noname#35109
noname#35109
回答No.2

ここに回答するときではなく, 現実の自分の作成上の問題として, たまに質問者さまと同じ問題に遭遇することがありますよ。 そのとき,私はいつも, ムービークリップを直接回転させるのではなく, まずダミーの変数を回転(変動)させて, そのダミーの変数の値をムービークリップの角度に代入しています。 間に変数をかませてワンクッション置くということです。 /////////////////////////////////////////////////// onClipEvent (load) {   dummy = 0;   /* ↑ダミーの変数 dummy を初期化*/   /* Flash Player 7 以上にパブリッシュするときに必要*/ } onClipEvent (enterFrame) {   H01 = (360/12)*_root.HTjikan;   /*変数H01 = 360度を12分割 × 変数テキスト時間    (テキスト入力枠)で時計の針の角度を算出*/   if (!isNaN(H01)) {     /*もし H01 が 非数(NaN) でなければ*/     dummy = dummy+((H01-dummy)/2);     /*ダミーの角度を目的の角度まで変えて行く */     this._rotation = dummy;     /*針の回転にダミーの値を代入 */   } } /////////////////////////////////////////////////// (↑同じく各行の先頭には全角空白文字を入れています。) _rotation には実体(実際の角度)が存在するため, 他の変数が 非数(NaN) になった場合でも復活することができます。 しかし, 変数 dummy は単なる変数であるため, 一度 非数 になると,  dummy = dummy+((H01-dummy)/2); の加算後代入の部分で 非数に数を足すことができなくなり, 数に復活できなくなります。 したがって,  if (!isNaN(H01)) { で, H01 が非数でないときに限って, dummy を代入後加算する必要が出てきます。 H01 が非数になるときとは, テキストフィールド の値が ""(空白) になるとき, つまり,いったん値を消して別の値を入力するときです。 「ダミーとなる変数を用意する」 ということと, 「if (!isNaN(H01)) {} が必要である」 というだけのことで, 動かすエンジン部分のスクリプトは質問者さまが書かれたスクリプトそのままです。 ご参考までに。

thank001
質問者

お礼

sassakunさん、書き込みありがとうございます。 基本を私に合わせる形でご回答いただき、ありがとうございます。 1カ所だけ( !isNaN )私には謎でしたが、1カ所だけ謎というのが何か課題を出されたようで、ここだけ調べて一つステップアップ(^0^)という感じで、とても良い勉強をさせていただいている気分になってきます。 大変参考になり勉強になります。(^^) 書き込みいただきありがとうございました。

その他の回答 (1)

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

言葉だけだと説明しにくいのでASとともに。 確認の際は要全角スペース削除 コピペ -> 検索 -> 検索文字列: (全角スペース) 置換:(未入力) -> すべて置換 onClipEvent (enterFrame) {  // 変数01 = 360度を12分割 × (変数テキスト時間/12の余り)で時計の針の角度を算出  H01 = (360/12)*(_root.HTjikan%12);  // 変数02 = 現在の_rotationを360で表現  if (this._rotation<0) {// _rotationがマイナスの時だけ調整   H02 = 360+this._rotation;   // 例1 -180°(6時の角度) 360°+ -180°= 180°   // 例2 -90°(9時の角度) 360°+ -90°= 270°  } else {   H02 = this._rotation;  }  // (おまけ)いつも時計回りで目的角度に向かって回転したい  if(H01 < H02){   H01 += 360;  }  //  this._rotation = H02+(H01-H02)/2;  /* 現在角度から目的角度までの1/2ずつ針が回転  変数の値が-180~180の間でなくても、今回ぶつかった問題のように  自動的に修正してくれるから心配無用*/ }

thank001
質問者

補足

suzuki-_-さん、書き込みいただきありがとうございます。 大方理解できてきましたが、終わってからだとお礼が更に遅れてしまいそうなので、先にお礼書き込みとして書き込ませて頂きます。 時計回りで目的角度に回転 という部分も質問には書きませんでしたが実現したい事だったので加えて大変参考になりました。 とてもためになり勉強になっております。 ありがとうございました。(^0^)