• ベストアンサー

角度を指定して回転

スクリプト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ではダメなのかいまいちよく分かりません。 理由と考え方を教えてください。 よろしくお願いします。

  • Flash
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

とりあえず, スクリプト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 のようなものを使った方が良いと思います。

その他の回答 (1)

  • mozori01
  • ベストアンサー率26% (7/26)
回答No.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 を使えば解決できるのがわかると思います。

関連するQ&A

  • ムービークリップの位置と角度の制御について

    スクリプト初心者です。 ●矢印の形をした、ムービークリップ(mc1)がステージ端まで移動すると跳ね返り、跳ね返る方向に向きを変えるスクリプトで悩んでいます・・。 ●ステージサイズ:400×300  シーン1、1フレーム目にmc1配置。 mc1をシーン1に配置の際、角度45度に。 mc1に下記スクリプトを書きました。 onClipEvent(load){     vx=5;     vy=5; } onClipEvent(enterFrame){ this._x += vx; this._y += vy; if (400 < this._x) { vx = -5; this._rotation=-135; } if (300 < this._y) { vy = -5; this._rotation=135; } if (this._x < 0) { vx = 5; this._rotation=-45; } if (this._y < 0) { vy = 5; this._rotation=45; } } ●ステージ端まで行くと矢印(mc1)が跳ね返る事は、出来たのですが、方向(回転角度)がうまく出来ませんでした・・。 自分でも、これでは、回転角度がうまく行かないと分かってはいるのですが・・。 どなたかお分かりの方おられましたら助けてください! よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • mcのx座標が50以上になったら次フレーム

    タイトルどおり、 mcのx座標が50以上になったら次フレーム という処理をしたく、 mcに次のアクションスクリプトを記述しました。 onClipEvent(enterFrame){ this._x += 10; } onClipEvent(load){ if(this._x >= 50){ nextFrame(); } } しかし何故か次のフレームに行ってくれません。 どこか間違っているのでしょうか。。。 nextFrame();をgotoAndPlay(2);にしても駄目でした。

    • ベストアンサー
    • Flash
  • 立体回転運動 新たにボタンを作って一定角度だけ動かす

    お世話になります。 下記のプログラムは3Dのぐるぐる回るプログラムなのですが、 onClipEvent (load) { degree = 0; r = 100; centerx = 150; centery = 100; } onClipEvent (enterFrame) { radian = Math.PI/180*degree; this._x = centerx+r*Math.cos(radian); this._y = centery+r*Math.sin(radian)/2; this._xscale = this._yscale=this._alpha=this._y; degree += 5; } -------------------------------------------------------------------- それで、ここからなのですが、 onClipEvent (enterFrame) {  --省略-- degree += 5;  ↓ のところをまず削除して、新たにボタンを作って、そのボタンを押すと、 押すたびにある一定の角度分だけ円運動するようにしたいのですが、どうしたらいいんでしょうか? 単純にボタンを作って、 そこに on(release) { degree +=5; } と書いてもまともに動きません。 初心者なものなので、よろしくお願いします。 それと、このプログラムはムービークリップに記載されているのですが、出来たらルート画面のレイヤーにactionを作って、そこにスクリプトをまとめて書きたいと思うんですが、どうしたらいいんでしょうか?ムービークリップにインスタント名をつけて、上記のプログラムの前に、 ムービークリップインスタント名.onClipEvent (load) { --省略-- } ムービークリップインスタント名.onClipEvent (enterFrame) { --省略-- } としたら、フィールド名がありませんとエラーが出てしまいます。 長くなってしまいましたが、わかりずらい説明かとは思うのですが、重ねてよろしくお願いします。

  • flash as2.0 hitTest()について

    FLASHMXで作業をしています。 mcが壁に当たると反対方向にmcを移動させたいのですが 以下では、うまくいきません。理由がわかりませんし打開策も わかりません。解決策を教えてください。よろしくお願いいたします。 onClipEvent(load){ this._x=100; this._y=380; } onClipEvent(enterFrame){ this._y -=3; if(_root.tama_mc.hitTest(_root.kabe_mc)==true){ this._y +=5; } }

  • つかんで放す

    ムービークリップ(MC)に下記のアクションスクリプトASを記述しました。 右へMCが動いて行き、マウスでクリックすると掴み動かせるようになり、放すとまた動き出すというものになるはずなのですが、上手く行かずクリックするとポインタにくっついた状態になってしまいます。 ASの書き方に問題があるのでしょうか? ご教授いただきたくおもいます。 よろしくお願いします。 onClipEvent (load) {    this._x = 20;    this._y = 200;    Hspeedx = 1; //MCの速度    Hcatch = 0; //MCキャッチの時は1、そうでない時は0に } on (press) {    Hcatch = 1; //MCキャッチ    startDrag(this); } on (release) {    Hcatch = 0; //MCを放す    sotpDrag(); } onClipEvent (enterFrame) {    if (Hcatch == 1) {       Hspeedx = 0;    }    if (Hcatc == 0) {       Hspeedx = 1;    }    this._x = this._x+Hspeedx; }

    • ベストアンサー
    • Flash
  • Flash ふわふわメニュー ロールオーバーでストップ

    下記サイトを参考にして、ふわふわしたメニューを作成したのですが、ボタン(風船)をロールオーバーしたらストップするようにするにはどうしたらよいのでしょうか?使用しているバージョンはFLASH8です。 http://hfm-kenchan.com/Lesson/log_qa/D0609292.htm  onClipEvent (load) {     this._xscale = this._yscale = 10;     vs = 0;  }  onClipEvent (enterFrame) {     vs = vs*0.8+(100-this._yscale)/5;    this._xscale = this._yscale += vs;  }  onClipEvent (load) {     yy = this._y;     rad = 0;  }  onClipEvent (enterFrame) {     this._rotation += 0.2;    rad += 0.1;    this._y = Math.sin(rad)*10+yy;    if (rad > 10)                        } 

  • MCのgotoAndPlay制御について

    今現在すごく初歩的なものを作っています。 まず、MCですが、1~10フレームは歩く動作、11~20フレームは座る動作 と言ったフレームで動作を表現したものです。 このMC内で1~10フレームを繰り返すようにgotoAndPlay(1)と10フレーム目に書きました。 そして、このMCに onClipEvent (load) { // スピードの初期値 spd = 5; } onClipEvent (enterFrame) { // spd ずつ右へ移動 this._x += spd; if(this._x>100){ spd = 0; this.gotoAndPlay(11); } } といったように A地点~B地点は歩いている動作をさせながら5ずつ移動させ、100まで来たら停止させ、 そのB地点では座る動作(MCの11フレーム目から)をスタートさせるようにしました。 しかし、実際はMCの11フレーム目で固まった状態です onClipEvent (enterFrame)なので当たり前なのは分かっているのですが、 他に方法が分かりません。 何かなるべく完結な方法はありますでしょうか?

    • ベストアンサー
    • Flash
  • 移動範囲を指定したい

    マウスを追いかけるMC1の追いかける範囲を指定したいのですがうまくいきません; 細かい指定としては↓ (1)画面の下1/5ぐらいのMC2の中にはMC1は入れない (2)マウスがMC2の中にある時はMC1はy座標は変化なし x座標はマウスを追いかける(つまり、横にしか動かない) (3)マウスがMC2から出てきたら、再びMC1はマウスを追いかける 現状としては ------------------------------------------- onClipEvent (enterFrame) { if (this.hitTest(_root.ki.kusa)){ _x += (_parent._xmouse-_x)*0.1; this._y += 0; }else{ _x += (_parent._xmouse-_x)*0.1; _y += (_parent._ymouse-_y)*0.1; } } ------------------------------------------- これでは、マウスがMC2から出てきた時に、MC1がMC2から離れないという様になってしまうのですがどうすればいいでしょうか??

  • ActionScriptで、指定した時間後に次のアクションのとり方

    例えば2秒後に次の行動を取りたい時の質問をしたいのですが、 ある画像を下からフェードインしながら現れて、停止し2秒後にフェードアウトするというアニメーションをActionnScriptで作りたいのですが、 現在は下記のようにスクリプトを組んで、下から上にフェードインしながら画像を読み込むところまではできたのですが次の2秒後にフェードアウトするというのができません。 setIntervalを使うといいのは知っているのですが、それを下記のスクリプトにどのように組んだらできるのでしょうか? わかる方がいたら教えてください、よろしくお願いします。 swfのサイズはw:300、h:100です、ステージにMovieClipを一つ置いてそれに下記のスクリプトを書き込んでいます。 ------------------------------------------------------------------- onClipEvent (load) { this.createEmptyMovieClip("img_load_mc",1); img_load_mc.loadMovie("画像URL"); this._alpha = 0; this._x = 0; this._y = 100; } onClipEvent (enterFrame) { this._alpha += 5; this._y -= 5; if(this._y <0) { this._y = 0; } } ------------------------------------------------------------------- ちなみに作成環境はFlash8 ProでActionScript2.0で作成しています。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • MCの~秒後に移動

    winXP flash ver8 を使用しています。 あるMCに下記のスクリプトで任意の箇所に移動するということをしていますが、これを30秒後とかに移動させるということは可能でしょうか。 よろしくお願いいたします。 onClipEvent (load) { targetX = 550; targetY = 30; } onClipEvent (enterFrame) { _x += (targetX-_x)/5; _y += (targetY-_y)/5; }

    • ベストアンサー
    • Flash