画像の斜め移動について

このQ&Aのポイント
  • 斜めに移動させるscriptを使用して、花火のような効果を出したい。
  • 先日、時間差で画像を表示させることができるようになりましたが、サイズを小さくしたため、小雨のように見えてしまいます。
  • より花火らしさを出すために、斜めに移動させるスクリプトを使用したい。
回答を見る
  • ベストアンサー

斜めに移動

先日、「【急ぎ】setIntervalを使って各インスタンスごとに表示するタイミングを変える」トピックスでお世話になったものです。 BlurFiltan様のおかげで、時間差で画像を表示させる事は出来るようになりました。 ありがとうございます。 ですが、火の粉を意識して降らせる画像のサイズを小さくした為か、どうしても小雨が降っているようにしか見えません。 そこで、より花火らしく、ある1点(中心になるMC)を中心に左下、右下(少しずつ角度が違うもの)を降らせたいと思います。 画像の斜めに移動させるscriptは、 onClipEvent (enterFrame) { _x -= 1; _y += 1; var speed = 12; } ではないかと思うのですが、どうでしょうか? 説明が分かりにくいかもしれませんが、よろしくお願いします。

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

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

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

#1 です。 補足です。 > ある1点(中心になるMC)を中心に > 左下、右下(少しずつ角度が違うもの)を降らせたい という場合でしたら, その 中心になるMC と,火の粉MC の位置関係を求めて, その向きに動かすようにしなければなりません。 等速落下運動(空気抵抗が大きい場合は等速落下になる)でしたら, y座標移動量は固定(等速)で, x座標移動量をそのy座標移動量と中心になるMCとの位置関係から算出することになると思います。 この場合は角度などを求める必要はないので三角関数などは登場しません。 考え方は中学校低学年の数学くらいが要りますが, 式自体は小学校中学年レベルの算数でできます。 onClipEvent (enterFrame) などを書くMCと同じ階層に, 中心になるMC を置いたとして, そのMCに「center_mc」というインスタンス名を付けたとします。  _root(_rootなどの階層)   ├ onClipEvent (enterFrame) などを書くMC   ├ …上と同じものを複数配置可能…   └ …  〃  … その場合, onClipEvent (enterFrame) などを書くMCのスクリプトは次のようになります。 ただし, onClipEvent (enterFrame) などを書くMCを, 「center_mc」より下(y座標が大きい位置)に置いた場合です。 //////////////////////////////////////////////////////// onClipEvent (load) { // 等速落下するスピードを設定 speed = 5; // y に対する x の割合 ratio_x を算出 ratio_x = (_x-_parent.center_mc._x)/(_y-_parent.center_mc._y); } onClipEvent (enterFrame) { _x += speed*ratio_x; _y += speed; } //////////////////////////////////////////////////////// なお,上記スクリプトの  // y に対する x の割合 ratio_x を算出  ratio_x = (_x-_parent.center_mc._x)/(_y-_parent.center_mc._y); の部分は次の図のように考えると出てきますよね。 ┏━━ステージ━━━━━━━━━ ┃「center_mc」 ┃  ●(x1,y1) ┃  │ ┃  │←x2-x1 ┃  │ ┃  │    「スクリプトを書くMC」 ┃  └────▲(x2,y2) ┃     ↑y2-y1 ┗━━━━━━━━━━━━━━ y変位に対するx変位=(x2-x1)/(y2-y1) ただ, 等速落下運動するほど空気抵抗が大きい場合は, 当然x軸方向にもかなりの空気抵抗があるはずなので, x軸方向移動量も徐々に下げる方がよりリアルには見えるとは思います。 (つまり 枝垂れ[しだれ]モドキ。) ////////////////////////////////////////////////////// onClipEvent (load) { // 等速落下するスピードを設定 speed = 5; // 空気抵抗を設定 resistance = 9/10; // y に対する x の割合を算出 ratio_x = (_x-_parent.center_mc._x)/(_y-_parent.center_mc._y); } onClipEvent (enterFrame) { _x += speed*ratio_x; _y += speed; ratio_x *= resistance; } //////////////////////////////////////////////////////

その他の回答 (1)

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

書かれていらっしゃるスクリプトで斜めに移動すると思いますよ。 1フレーム進む時間ごとに毎回, そのムービークリップは 左に1px 下に1px 移動します。 つまり左下(斜め45度)に移動します。 で,何がご質問なのでしょうか? 「どうでしょうか?」というのが質問でしたら「正解です」という回答になります。 --- --- --- --- --- --- --- --- --- --- --- ただし, var speed = 12; は何かわかりません。 というか斜めに動くこととは関係がないと思います。 1フレーム進む時間ごとに毎回,変数 speed に 12 を代入し続けている。 というだけですね。 別にそれがあっても間違いではありませんが,特に意味はないと思います。 普通は,1フレーム進む時間ごとに毎回同じ値は代入し続けないので, onClipEvent (load) { var speed = 12; } onClipEvent (enterFrame) { _x -= 1; _y += 1; } この方が良いかなとは思いますが, どっちにしても斜めに進むこととは関係しません(見る限り,多分。)。

関連するQ&A

  • 【急ぎ】setIntervalを使って各インスタンスごとに表示するタイミングを変える

    先ほどの書き込みと被ってしまいすみません。 現在、花火の「ナイアガラの滝」をFlashで表現しようとしています。 その際にトゥイーンではなくすべてASにて制御したいのです。 そして、時間差で画面の両端から真ん中に向かって花火がつくようにしたいと思っています。 現時点では、花火の火の粉を表すMCを作成してこのMCに対して以下のようなAS(指定位置から真下に落ちる)を記述しています。 ///////////////////////////////////////////////////// onClipEvent (enterFrame) { this._y = this._y+12; if (this._y>140) { this._y = 38.5; } } ////////////////////////////////////////////////////// このMCと同じ階層に上のMCを複製したものを数個配置しており、scriptレイヤーの1フレーム目には以下のようなASを記述しています。 ////////////////////////////////////////////////////// stop(); myID = setInterval(function () { gotoAndstop(2); clearInterval(myID); }, 3000); ////////////////////////////////////////////////////// はじめに説明した火の粉のMCは1つずつレイヤー分けして2フレーム目に配置しているので、上のASのままでは、全てが同時に再生されてしまい、花火のナイアガラっぽくありません。 より、リアルにする為に時間差で花火をつけたいです。 火の粉のMCにはa、b、c、dといった感じでインスタンス名をつけています。 1フレーム目に記述している「gotoAndstop(2);」をインスタンス名で指定すればいいのでは…と思い「gotoAndstop(a);」と、指定してみたのですが、何も表示されなくなってしまいます。 まだまだ、ASについて詳しくないので、分かり易く説明していただけると助かります。 急ぎなので、分かる方返信お願いします。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • mcの中のフレームラベルの移動

    初めまして。 当方初心者なので、よくわからないので、質問させていただきます。 外部にswfとしてフレームラベルの複数ついたものがあって、 それをmc(mcs_mc)で読み込みし、スクリプトで一定時間毎に mcに読み込んだ外部swfのフレームラベル(chapter1~chapter10)を移動させたいのですが、うまく動いてくれません。 どの用にしたらよいでしょう?よろしくお願いします。 onClipEvent(load){ this._lockroot = true; } onClipEvent(enterFrame){ setInterval( function(){ mcs_mc.gotoAndPlay("chapter2"); }, 1000); }

    • ベストアンサー
    • Flash
  • 【Key.isDown】

    なんにもインスタンスを持たない【MC】を つくって、下記のソースを実行。 onClipEvent (enterFrame) { if (Key.isDown(Key.UP)) { _y -= 1; // 上に移動 } } そうすると↑キーを押すと【MC】が移動するのですが 本来やりたいことの動作確認でしかなく、 gotoAndPlay();を使うのが目的で 別に移動機能は無いものと考えてもらいます。 onClipEvent (enterFrame) { if (Key.isDown(Key.UP)) { gotoAndPlay("label"); } } フレームの移動をさせるにはどうすればいいのですか?? 教えてください><

    • ベストアンサー
    • Flash
  • FLASH外部ファイルの読み込み

    Flashでjpegファイルの読み込みをしたいのですが、 アクションスクリプトで onClipEvent(load){ _root.hyouji_mc.loadMovie("face1.jpg"); } とインスタンスに記入するとなにも表示されません。 【hyouji_mc】を青色にして実行するとスクリプトのない状態ですと青の四角が表示されるのですが、スクリプトを実行すると真っ白になり、やはり画像が表示されません。 試しに【load】をe【nterFrame】に変えてもだめでした。 【mouseDown】や【mouseMove】,【keyDown】にすると画像は表示されます。 【onClipEvent】を【on(rease)】等に変更をしても表示されます。 (1)どうにかフレームが読み込まれた時に画像が表示される様にしたいのですが、解決策としてはフレームアクションとして記述するしかないのでしょうか? (2)【onClipEvent(load,enterFrame)】で   【loadMove()】は実行できないのでしょうか? フラッシュはMXを使っています.OSは2000です。 意味がわかりにくいと思いますが、ご教授ください. よろしくお願いします。

  • アクションスクリプトでのフレーム移動について

    FlashCS3 actionscript2.0で画像が1枚ずつフェードインしてきてサムネイル一覧になるようなものを作っています。 それぞれの写真をレイヤーに分けていれ、ラベルをつけています。 全ての写真インスタンスに飛び先のラベル名だけど変更して、下記のようにアクションスクリプトを記述しました。 ―――――――――――――――――――――――――――――― onClipEvent (load) { this._alpha = 0; } onClipEvent (enterFrame) { if(this._alpha < 100){ this,_alpha += 2; } if(this._alpha >= 80){ _root.gotoAndStop("pic02"); } } ―――――――――――――――――――――――――――――― が、1つめの写真と2つめの写真はフェードインしてきて表示されるのですが、3つめの写真以降が読み込まれません。 ラベルの番号をずらすと、その一の写真は読み込むのですが、次のラベルにはジャンプしてくれません。 原因が分かる方がいらっしゃいましたら、ぜひおしえてください。 よろしくおねがいします。

    • ベストアンサー
    • Flash
  • AS1.0で基準点をそろえたい

    AS1.0でduplicateMovieClipを使った複製をした後MC同士の基準点をそろえたいのですがうまくできません 今MC1とMC2というムービークリップをduplicateMovieClipを使って複製しています まず針(MC1)というフレームがありその中に //関数が呼ばれたら描画する setInterval(hari,1000); function hari(){ i ++; duplicateMovieClip("Hari","hari" + i , i); } が書いてありこれは針が1秒ごとに描画されていくという方法です そして円(MC2)というフレームの中にも //関数が呼ばれたら描画する setInterval(EN,1000); function EN(){ i ++; duplicateMovieClip("En","en" + i , i); } がかいてありこれも複製できるようになっています 針(MC1)の中には onClipEvent (load) {       //針の位置をランダムで決めた後描画 this._x = Math.random() * 300 + 50; this._y = Math.random() * 200 + 50; } onClipEvent (enterFrame) {     //針回転     _rotation += 6; } がありこれをベースにして円(MC2)の基準点を針(MC1)にあわせて描画したいのですがやり方がわかりません 自分が考えた方法ですが onClipEvent (load) {       円1の位置x = 針1の位置x       円1の位置y = 針1の位置y } をやったんですがうまくいきません 誰か教えてください

  • ランダムで画像を表示させるには?

    環境はFlashCS5で、アクションスクリプト3.0を使用しています。 5枚の画像(インスタンス名:mc0~mc4)をランダムで表示させるムービーを制作しているのですが、 下記のスクリプトですと、ランダムで画像が表示されるのですが、画像の切り替えがループになってしまって、次から次へとランダムで画像が切り替わります。フレーム1に下記のスクリプトを記述し、フレーム1にムービーインスタンス「mc0」から「mc4」を配置しています。 function randomShowMC():void { for (var i:int=0; i<5; i++) { this["mc" + i].visible = false; } var rnd:int = Math.floor(Math.random() * 5); this["mc" + rnd].visible = true; } randomShowMC(); var myTimer:Timer = new Timer(3000); myTimer.addEventListener(TimerEvent.TIMER ,function(){randomShowMC()}); myTimer.start(); このスクリプトを改良?改造?して、ランダムの画像が1回のみ…つまり、おみくじみたいに、(mc0~mc4の画像を)ランダムで1回のみ画像を表示させたいのです…表示後の画像が切り替わらずそのままで停止させたいのです。 又は、ムービーインスタンス「mc0」から「mc4」の画像をランダムで表示させ、最初に表示された、その画像で停止させるスクリプトを新規に記述しても構いませんので、ご指導・アドバイスをお願い致します…。 どなたか、解る方がいましたらランダム画像表示で1回表示のみのループしないスクリプトを教えてください。よろしくお願い致します…。

    • ベストアンサー
    • Flash
  • 小数の足し算をすると「1000.999999」みたいになってしまう

    次のようなカウントアップのスクリプトを作りました。 onClipEvent(load){ var suuzi = 1000; } onClipEvent(enterFrame){ money += 0.001; text1 = money;//ダイナミックテキストに表示 } というふうにやって、数値をどんどん上げていくプログラムを作ったのですがはじめのうちは次のようにちゃんと表示されます。 1000.001 1000.002 1000.003 1000.004 しかしある時点から突然、 1001.2519999999 1001.2529999999 となったり、 1002.8510000000 1002.8520000000 となったりします。 なぜこのようなことが起こるのでしょうか? そして対処法を教えてください。 環境はFlash8でActionScript2.0です

    • ベストアンサー
    • Flash
  • ムービークリップに配置したボタンを作動させるには?

    Flash初心者のものです。 現在、FLASHで簡単な地図を作成しているのですが スクリプトを記述し、オンマウスによるスライド動作を表現したムービークリップ(インスタンス名:mc_sride)の中にボタン(インスタンス名:btn_a)を配置して、そこをクリックすると 地図の座標が移動するというような動きを実現したいのですが、 なかなかうまくいきません。 メインのムービーにボタンだけを配置した場合はうまく作動するのですが、 それを前述したムービークリップの中に配置すると そのボタンがまったく作動しないのです。 マウスが乗っても反応がありません。 相対パスはきちんと記述しているのですが・・・ どうすればうまく作動するようになるのでしょうか? ちなみにmc_srideのスライド動作のスクリプトは onClipEvent (load) { var div:Number = 0.5; var move_to:Number =730 this._x = 730; } onClipEvent (enterFrame) { this._x += (move_to-this._x)*div; } on (rollOver) { this.move_to -=100 } on (rollOut) { this.move_to +=100 } になります。 ボタンをうまく機能させる方法をご存知の方がもしいらっしゃたら、お手数ですがご指南願います。

    • ベストアンサー
    • Flash
  • fhashフルブラウザサイトのページ移動で困ってます、、

    フルブラウザの固定配置サイトを勉強してます。【CS4、AS3】 過去掲載http://oshiete1.goo.ne.jp/qa5140171.html を参考にさせてもらってます。 TOPページはうまくいったのですが ページ移動で別のページにいくと背景画像(TOPと別画像)が原寸表示になってしまいます、、(なぜかブラウザ画面自体をさわると直るのですが) 当方の浅い考えでは 各背景画像MCのインスタンス名を同じ「back_mc」にしているからと思っていますが、そうしないと表示もできません、、 どなたか教えてください。 よろしくお願いします。 以下は1フレーム目に書いているソースです。 添付はフレーム画面です。 stage.scaleMode = StageScaleMode.NO_SCALE; stage.align=StageAlign.TOP_LEFT; var bw:Number = back_mc.width; var bh:Number = back_mc.height; function arrangeMC():void{ var sw:int = stage.stageWidth; var sh:int = stage.stageHeight; //以下固定配置分 contents_mc.x = sw/24; contents_mc.y = sh/2+20; menu_mc.x = sw-60; menu_mc.y = sh/2-30; footer_mc.y = sh-10; if(bh/bw > sh/sw){ back_mc.width = sw; back_mc.height = bh/bw*sw; }else{ back_mc.height = sh; back_mc.width = bw/bh*sh; } } arrangeMC(); function stageOnResize(evt:Event):void { arrangeMC(); } stage.addEventListener(Event.RESIZE, stageOnResize);

専門家に質問してみよう