• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:移動位置が狂ってしまう)

移動位置が狂ってしまう

このQ&Aのポイント
  • ボタンの有効と無効を合体させてアクションスクリプトを記述したが、2つのボタンを押すと移動位置が狂う
  • 行数が増え、どのように対処すればいいのか分からないので教えてほしい
  • クラスのインポートや画像の設定などを紹介している

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

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

移動位置が狂うのは「R_btn」や「L_btn」クリックで お互いのボタン機能を操作していないからでしょう。 書かれているスクリプトでは 「R_btn」をクリックしても「L_btn」をクリックしても "クリックしたボタンのみ" の機能を無効にしています。 そうではなくて 「R_btn」をクリックしても「L_btn」をクリックしても どちらにしてもTweenが終わるまで "両方" のボタン機能を無効にしておく必要があります。 書かれているスクリプトを そのまま延長した場合のスクリプト例です↓。 (「★」を付けた部分が変更点) //------------------------------ //クラスのインポート import mx.transitions.Tween; import mx.transitions.easing.*; //画像1枚の横幅を設定 var g_w:Number = 120; //画像の枚数を設定 var g_n:Number = 7; //カウンタ用変数 var cnt:Number = 0; //「L_btn」を非表示にしておく L_btn._visible = false; //「R_btn(→ボタン)」クリック時の動作を定義 R_btn.onRelease = function():Void { //もしカウンタが 画像の枚数-1 未満であれば if (cnt<g_n-1) { var myTween = new Tween(my_mc, "_x", Regular.easeOut, my_mc._x, my_mc._x-g_w, 3, true); //★L_btn & R_btn のボタン機能を無効にする L_btn.enabled = false; R_btn.enabled = false; //myTweenのモーション終了時に実行するメソッドを定義 myTween.onMotionFinished = function() { //★L_btn & R_btn のボタン機能を有効にする L_btn.enabled = true; R_btn.enabled = true; }; //L_btnを表示する L_btn._visible = true; //なおかつカウンタが 画像の枚数-2になれば if (cnt == g_n-2) { //R_btnを非表示にする R_btn._visible = false; } //カウンタに1を加算 cnt++; } }; //L_btnクリック時の動作を定義 L_btn.onRelease = function():Void { //もしカウンタが 0 より大きい場合は if (cnt>0) { var myTween = new Tween(my_mc, "_x", Regular.easeOut, my_mc._x, my_mc._x+g_w, 3, true); //★L_btn & R_btn のボタン機能を無効にする L_btn.enabled = false; R_btn.enabled = false; //myTweenのモーション終了時に実行するメソッドを定義 myTween.onMotionFinished = function() { //★L_btn & R_btn のボタン機能を有効にする L_btn.enabled = true; R_btn.enabled = true; }; //R_btnを表示する R_btn._visible = true; //なおかつカウンタが 1 になれば if (cnt == 1) { //L_btnを非表示にする L_btn._visible = false; } //カウンタから1を減算 cnt--; } }; //------------------------------ 一応は以上です。 ===================== しかし... 私はせっかちですから 閲覧者の立場で上のスクリプトを動作させると非常にイライラします。 私でしたらボタン機能は無効にせずに次のようにします。 (本題とは関係のない ★オマケ 機能も勝手に入れてます) //------------------------------ //クラスのインポート import mx.transitions.Tween; import mx.transitions.easing.*; //画像1枚の横幅を設定 var g_w:Number = 120; //画像の枚数を設定 var g_n:Number = 7; //表示する文字列の設定(★オマケ) var str_arr:Array = ["画像1", "画像2", "画像3", "画像4", "画像5", "画像6", "画像7"]; //文字列を表示するテキストフィールドを作成(★オマケ) //(本当は好きな場所に手動で「my_txt」を作成する) createTextField("my_txt", 0, 10, 10, 0, 0); my_txt.autoSize = "left"; my_txt.border = true; my_txt.background = true; //カウンタ用変数 var cnt:Number = 0; //「my_txt」に文字列を表示(★オマケ) my_txt.text = str_arr[cnt]; //「L_btn」を非表示にしておく L_btn._visible = false; //「R_btn(→ボタン)」クリック時の動作を定義 R_btn.onRelease = function():Void { //もしカウンタが 画像の枚数 未満であれば if (cnt<g_n) { //カウンタに1を加算 cnt++; //-g_w*cnt に向けて x座標 をTween var myTween = new Tween(my_mc, "_x", Regular.easeOut, my_mc._x, -g_w*cnt, 3, true); //L_btnを表示する L_btn._visible = true; //なおかつカウンタが 画像の枚数-1になれば if (cnt == g_n-1) { //R_btnを非表示にする R_btn._visible = false; } //「my_txt」に文字列を表示(★オマケ) my_txt.text = str_arr[cnt]; } }; //L_btnクリック時の動作を定義 L_btn.onRelease = function():Void { //もしカウンタが 0 より大きい場合は if (cnt>0) { //カウンタから1を減算 cnt--; //-g_w*cnt に向けて x座標 をTween var myTween = new Tween(my_mc, "_x", Regular.easeOut, my_mc._x, -g_w*cnt, 3, true); //R_btnを表示する R_btn._visible = true; //なおかつカウンタが 0 になれば if (cnt == 0) { //L_btnを非表示にする L_btn._visible = false; } //「my_txt」に文字列を表示(★オマケ) my_txt.text = str_arr[cnt]; } }; //------------------------------ とりあえずは関係のない「(★オマケ)」部分の動作は無視してください。 動く先の座標を 動いている最中かもしれない(不安定な)「my_mc」を基準にして決定するのではなく, しっかりと安定した数「-g_w*cnt」で決定するようにしています。 こうすれば見たい画像までイライラせずにスムーズに my_mc を移動させることができます。 ※以上のスクリプト   ActionScript 2.0 / Flash Player 6 以上で動作 ※後にこのページを見る方がいらした場合の状況説明図↓

noname#142022
質問者

お礼

とてもFLASHらしい心地いい動きにしていただきましてありがとうございます。 それにオマケも!