• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ActionScriptで思うような動きを出せず、困っています)

ActionScriptで思うような動きを出せず、困っています

このQ&Aのポイント
  • ActionScriptの学習を始めたばかりで、うまく動きません。
  • x座標とy座標を指定し、減速しながら移動する動きを作りたい。
  • 初歩的な質問で申し訳ありませんが、助言をお願いします。

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

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

最小変更で行くと, 次のようになると思います。 ----------------------------- maru1.Gox = 700; maru1.Goy = 25; flg = false; maru1.onEnterFrame = function() { this._x += (maru1.Gox-this._x)/10; if (this._x>=650) { maru1.Gox = 35; flg = true; } if (flg == true) { this._y += (maru1.Goy-this._y)/10; } }; -------------------------- 単に if(flg = ture) が致命傷なだけだと思います。 「=」 は代入演算子です。 flg が true であるかどうかを判定させるのですから, 「==」 の等価演算子を使う必要があります。 また, 「ture」が綴り間違いで,「true」ですね。 また,if( ){ } は,( ) 内が true であるか false であるかを判定し, ( )内が true であれば,続く中カッコ { } 内のステートメントを実行します。 したがって, if (flg == true) { ~ } と書くのではなく, if (flg) { ~ } と書くのが一般的です。 if (flg == true) と書くと, 「もし flg の値が true であるという条件が true であると…」 という回りくどい判定文となります。 ちなみに, if (flg == false) { ~ } を書きたい場合は, if (!flg) { ~ } となります。 「!」 は論理否定 (NOT) 演算子 です。 あと最初の,onLoad = function() という無意味なものを取りました。

cropuis
質問者

お礼

>>sassakunさん 早速のご回答誠にありがとうございます。 本当に分かりやすいご説明で、trueとfalseの部分の、疑問も解けました!! 早速、ご指定いただいた、箇所を修正致しましたところ、問題は改善されました。 もしよろしければもう一点、質問をさせていたいてもよろしいでしょうか。 onLoad = function()の部分についてなのですが、今回のような場合であれば、 maru1.Gox = 700; maru1.Goy = 25; flg = false; などを定義する場合、onLoad = function()が必要だと間違った解釈をしていたのですが、 実際にonLoad = function()を使用するのはどういったときなのでしょうか? 文章がお粗末な上に、曖昧な質問で申し訳ありまん。 助言を頂ければ幸いです。 どうぞよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#35109
noname#35109
回答No.3

#1&2です。 onLoad = function について気になったので少し調べてみました。 調べても今ひとつわからないというのが正直なところですが。 しかし,フレームに, ムービークリップ.onLoad = function(){ } を定義するのはやはり通常間違いであるようですよ。 私は,このご質問を見るまで見たことがなかったです。 当然,使ったこともありませんでした。 フレームに書くのではなく, ActionScript 2.0クラス定義ファイル になら書く場合があるとからしいです。 MovieClip.onLoadイベントハンドラメソッド http://www.fumiononaka.com/TechNotes/Flash/FN0503003.html  ~引用~ > MovieClipインスタンスを配置したタイムラインに、 > このイベントハンドラメソッドを定義して動作する場合は、 > かなり限定されます。 > 実際上は、タイムラインに定義することはまれで、 > またその定義も適切とはいえない場合が少なくないでしょう。  ---中略--- > メインタイムラインの第1フレームで_level0(_root)に設定した > MovieClip.onLoadイベントハンドラメソッドは、呼出されるようです。 > しかし、ブラウザで確認すると、 > MozillaベースのブラウザやSafariでは呼出されないという > 報告がされています(Flash Player 7)。 その他, 検索してみると,ほんの少しだけのページがヒットしますね。 また,ほんの少しのページのほとんどが,「いつ使う?」とか「使えない!」とかいう論議や論理の場所ばかりのように思えます。 Google検索「MovieClip.onLoad」 http://www.google.co.jp/search?hl=ja&q=MovieClip.onLoad&lr=lang_ja まあ,めったにない場合に使用することがあるらしいです。 そのめったにない場合には私は遭遇したことがありません。 というか, そのめったにない場合というのも,あえてそういう状況を作り出して実験したり論議のネタにしているとしか思えないページばかりが見つかりますね。 通常は使わないのが普通だと思います。

cropuis
質問者

お礼

お礼が遅くなってすみません。 本当に詳しい助言をありがとうございます。 今回、頂いたアドバイス、資料をもとに、 再度、作成に取り組んだところ、以前よりもスムーズかつ着実に作成することができております。 これからもさらに勉強を重ね頑張っていきたいと思います!! また、様々な疑問にぶつかることがあるとは思いますが、 是非助言を頂ければ幸いです。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#35109
noname#35109
回答No.2

#1です。 > 実際にonLoad = function()を使用するのは > どういったときなのでしょうか? どういうときも使わないでしょう。 ご質問で書かれていらっしゃる onLoad = function() は, ターゲットパスを略した形ですが,省略さずに書くと this が入ります。 (つまり勝手にthisが補完されて動作します。) ---------------------------- this.onLoad = function () { maru1.Gox = 700; maru1.Goy = 25; flg = false; }; ---------------------------- この this は, そのスクリプトを書いたタイムラインの階層を示します。 _root に書いたスクリプトでしたら _root.onLoad という意味になります。 意味不明でしょう。 _root がロードされたとき { } 内を実行。 意味がわかりません。 ですから,普通は使わないと思います。 おそらく, 元々は,フレームに書いたスクリプトではなく,ムービークリップに書いたスクリプトで, そのムービークリップに書いたスクリプトをフレームに並行移植させたからそんな変な書き方になったのではないでしょうか? この場合の onLoad や onEnterFrame は, 元々はムービークリップの onClipEventイベントハンドラ が, Flash MX以降,フレームにも使えるようになったというもの(イベントハンドラメソッド)です。 ですから,MX以降 すごく柔軟にプログラミングできるようになったのです。 ムービークリップのイベントハンドラ http://homepage3.nifty.com/ginga-b/MX/mc_eventhandler.html > イベントハンドラメソッド > イベントハンドラメソッドは、FlashMXで導入された、 > これからの主役となるイベントハンドラです。 > フレームアクションにも記述できるため、 > シンボル共通のハンドラを記述することができます。 フレームに書いたスクリプトを消して, ムービークリップ maru1 を選択して, maru1 自体に次のように書くのなら意味がわかります。 ----------------------------- onClipEvent (load) { Gox = 700; Goy = 25; flg = false; } onClipEvent (enterFrame) { this._x += (Gox-this._x)/10; if (this._x>=650) { Gox = 35; flg = true; } if (flg == true) { this._y += (Goy-this._y)/10; } } ----------------------------- 同じように動作しますよ↑。 // このムービークリップが表示されたとき onClipEvent (load) { // 変数 Gox と Goy を設定 Gox = 700; Goy = 25; // フラグを false にしておく flg = false; } そして,この後に, onClipEvent (enterFrame) { ~ } で1フレーム進む時間ごとに毎回 { ~ } が実行される。 これだと,変でも何でもありませんし,意味もわかります。 これを, そのまま上の階層のフレームに移植しようとすれば,  onClipEvent (load) { ~ }    ↓変更↓  onLoad = function () { ~ }  onClipEvent (enterFrame) { ~ }    ↓変更↓  maru1.onEnterFrame = function(){ ~ } に変更してしまいたくなる気持ちもわからなくもありません。 onLoad = function () { ~ } は一応使えますが,一応使えるだけで,意味はないと(私は)思います。  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [Flash]actionscript2.0を用いて歯車を作りたいのですが

    Adobe FLASH CS2を使い2つのかみ合った歯車を制作しています。 ドラッグで片方の歯車を回転させると もう片方の方は逆回転になるはずですが、 うまいことactionscriptをかくことができません。 片方はこのようなactionscriptを使っているのですが うまい作り方はないでしょうか。 よろしくおねがいします。 on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //このMCの基準点とマウスとの距離を算出 td0 = Math.sqrt(rx0*rx0+ry0*ry0); //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onEnterFrame を定義 this.onEnterFrame = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; //このMCの移動を計算 }; } on (release, releaseOutside) { //この onEnterFrame を削除 delete this.onEnterFrame; }

  • 吸着後の事

    吸着後についてわからない事があります。 ドラッグ&ドロップでmaru_mcをsikakuというMCに吸着させています。 sikakuというMCに衝突していない時は指定座標に戻るようにしているのですが、二点うまくいかないところがあります。 吸着後、maru_mcをsikakuから離す時、maruがその場を動こうとしない時があり、すんなりドラッグできない。 maru_mcが、衝突していない時でも指定座標にもどらず、sikakuに吸着してしまう時があります。 改善点等たくさんあるとおもいますが、よろしくお願いします。 下記スクリプトです。 maru_mcのスクリプト on (press) { this.startDrag(); this.onEnterFrame = function() { if (this.hitTest(_root.sikaku)) { this._x += (_root.sikaku._x-this._x)/4; this._y += (_root.sikaku._y-this._y)/4; } }; } on (release, releaseOutside) { this.stopDrag(); this.onEnterFrame = function() { if (!this.hitTest(_root.sikaku)) { this._x += (400-this._x)/6; this._y += (300-this._y)/4; } else { this._x += (_root.sikaku._x-this._x)/4; this._y += (_root.sikaku._y-this._y)/4; } }; }

  • フェードインから反転のアニメーション:actionscript

    ActionScriptでランダムに画像を読み込んだ状態でランダムフェードインして、ランダム秒数後に反転する。 反転すると違う画像がランダムに読み込まれていて、そしてまたランダム秒数後にまた反転してひっくり返るとまたランダムに画像が読み込まれているという、変わったアニメーションを作りたいのですが。(下の図を参照してください。) 現在ここまで↓できていて、xscaleを使えばできそうな感じなのですが、どうスクリプトを組めばよいかわかりません、どなたか教えてください。 環境;Flash 8,ActionScript2.0 ------------------------------------------------------------------- 回転させるparent_mcの1フレームに記述: // フェードイン設定 var load_time:Number = getTimer(); var wait_time:Number = Math.random()*1000; this._alpha = 0; // 反転タイマー関数 function InversionTimer() { flg++; } // ランダム秒設定 var max_sec:Number = 9; var min_sec:Number = 4; var random_sec:Number = Math.floor(Math.random()*(max_sec-min_sec+1))+min_sec; // フラグ変数 var flg:Number = 0; // MCのスケール関係 var scale:Number = 100; var scale_spd:Number = 8; this.onEnterFrame = function() { if (load_time+wait_time<getTimer()&&flg==0) { this._alpha += 2; if (this._alpha>99) { this._alpha = 100; flg = 1; setTimeout(InversionTimer, random_sec*1000); } } if (flg==2) { this.loader._xscale = scale; scale -= scale_spd; if (scale<=0) { scale = 0; this.child_mc.unloadMovie(IMG); flg = 3; } } else if (flg==3) { ???????????? } };

    • ベストアンサー
    • Flash
  • 素早い動き

    現在スロットのゲームを作っていまして、 リールの回転中はなんとなく回ってるっぽい絵を揺らして表現していたのですが、 これを実際のリールが回っているようにしたいと思っています。 今は、以下のように絵柄を並べてそれぞれonEnterFrameでthis._y+=30などとし、 this._yがある程度大きくなったら上に戻して回転しているように見せる、という方法で動かしています。 kaiten_1.onEnterFrame = function(){ this._y += 30; if(this._y > 325.9){ this._y = -714.1; } } これはこれでちゃんと動くのですが、3リールを回したときに、 昔のシューティングゲームで画面に弾が多くなったときのように 動きが遅くなってしまいます。 リールをストップボタンで止めていくと、残ったリールの回転速度は上がります。 swf自体の容量は100kb以下とそんなに重くもないので 原因がよくわかりません。 これを解決する方法はわかりますでしょうか? もしくは今やっている方法の他に、この動きを実現する方法があれば教えていただけますでしょうか?

    • ベストアンサー
    • Flash
  • FlashCS5 ActionScript2.0で3つのボタンを制御し

    FlashCS5 ActionScript2.0で3つのボタンを制御しています。 それぞれインスタンス名はbt1,bt2,bt3です。 動きはマウスオーバーで120%大きくなり、ロールアウトで100%へと戻るものです。 しかし、ロールアウトの動作中に他のボタンに触ると、ロールアウトの動作が中断してしまいます。 なぜでしょうか? //////////////////////////////////////// stop(); sx = 3; var i; //----------- for( i = 1; i < 4; i++){ Nov = "bt" + i; _root[Nov].onRollOver = function(){ Name = this._name; btOverMotion(Name); } _root[Nov].onRollOut = function(){ Name = this._name; btOutMotion(Name); } } //----------- function btOutMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale < 100){ delete this.onEnterFrame; }else{ _root[No]._xscale -= sx*2; _root[No]._yscale -= sx*2; } } } //----------- function btOverMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale > 120){ delete this.onEnterFrame; }else{ _root[No]._xscale += sx; _root[No]._yscale += sx; } } }

    • ベストアンサー
    • Flash
  • actionscript2のクラスの中の書き方について

    Flash ActionScript2のクラスの中の書き方について悩んでいます。 クラスの中にMcを定義するものですがthis.mct.onPressのところで class testAの中の_move()が実行できません。いろいろ試してみました がうまく実行できませんでした。なにかいいやり方はないでしょうか? よろしくお願いします。 class testA{  var mct:MovieClip;  function testA(mct:MovieClip){   this.mct = mct;   this.mct.onPress = function(){    _parent._move();   }  }  function _move(){    this.mct.onEnterFrame = function(){   }  } }

    • ベストアンサー
    • Flash
  • Actionscriptでのフレーム間の移動

    // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ maru1を移動させる処理を呼んで、gotoAndplayでmaru1レイヤーの2フレーム目へ飛び、2フレーム目が再生されたら、次にクイックソートのプログラムに戻り、関数 Pofmaru2(r); を処理するようにしたいのですが、うまくいきません。C言語であれば普通if文の処理がされたら自動でプログラムに戻ってきて、Pofmaru2(r);の処理へ移ると思うのですが....Actionscriptはそうならないのでしょうか? ネットや本などで色々調べてみたのですが解決策が見つからず行き詰ってしまって困っています。 flash mxでプログラム通りにフレーム間を移動するようにするのは無理なのでしょうか?

  • onEnterFrameで予定の位置で止まってくれない。

    http://www.icnet.ne.jp/~ang74g5c/ ↑このようなものを作ってみました。 フラッシュのサイズは800×600px。 一つの色のパネルの大きさも800×600pxで、様々な色を合わせて3行3列で合計9個のパネルを並べたものをイラストレータで作成してフラッシュに入れ、インスタンス名はcolorpannel(基準点は左上)としました。 右上の番号を押すと想定の位置で止まるようにしたいと思い、フレームに以下の設定をしてみました。 (右上の番号にはそれぞれnum1~num9までのインスタンスネームをつけています。) ------------------------------------- num1.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>=0) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<=0) { _root.colorpannel._x += 30; } if (_root.colorpannel._y>=0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<=0) { _root.colorpannel._y += 30; } }; }; num2.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>=-800) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<=-800) { _root.colorpannel._x += 30; } if (_root.colorpannel._y>=0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<=0) { _root.colorpannel._y += 30; } }; }; num3.onRelease = function() { _root.onEnterFrame = function() { if (_root.colorpannel._x>=-1600) { _root.colorpannel._x -= 30; } if (_root.colorpannel._x<=-1600) { _root.colorpannel._x += 30; } if (_root.colorpannel._y>=0) { _root.colorpannel._y -= 30; } if (_root.colorpannel._y<=0) { _root.colorpannel._y += 30; } }; }; (以下、num9まで座標位置が変わったものだけを記述していますので省略します。) ------------------------------------- URLを見ていただくとわかるように、各色の止まる位置が微妙にズレて隣の色が見えてしまっているのです。 OnEnterFrameなので、座標位置を指定してdeleteで止めれば良いのかな?とは思っているのですが、その書き方もよくわかりません。 どなたか、おわかりにある方がいらっしゃいましたら教えていただけませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • gotoAndPlayされないです

    はじめてFlashを作ります。 "ATTACK1"と"ATTACK2"のフレームを0.2秒の間隔で10回交互に表示したあと、 "ATTACK3"と"ATTACK4"のフレームをenterが押されるまで交互に表示する というプログラムを作りたいのですが、 "ATTACK1"と"ATTACK2"のフレームを交互にずっと表示されるだけで、 ATTACK3へ移動しません。 "ATTACK1"というラベルのフレームに以下のように書きました。 ActionScript2.0でやっています。 どこが悪いのか教えてください。お願いします。 ATTACK1フレームのActionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } } }; ATTACK2フレームのAcctionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; gotoAndPlay("ATTACK1"); delete this.onEnterFrame(); } } };

    • ベストアンサー
    • Flash
  • ActionScript

    ActionScript3.0でムービクリップ(たとえば丸)をA点からB点に移動し、その後C点、さらにD点という具合に移動させたい場合、どのようにスクリプトを書くのが一般的なのでしょうか?やはりif文などを使うのでしょうか? ものすごく初歩的なことのようですが、わからずにいます。何卒よろしくお願いします。

    • ベストアンサー
    • Flash