プロが教えるわが家の防犯対策術!

いつもお世話になります。

「ボタンの有効と無効」及び「左右ボタンで方向切替」を合体させてアクションスクリプトを記述しました。ボタンが1個の時に、falseとtrueで有効・無効を教えていただきました。
次にボタンを2個とした場合、右ボタンを押し、即座に左ボタンを押すとやはり移動位置が狂ってしまいます。私にとっては行数が増え、どのように対処すればいいのかわかりません。
教えてください。

//クラスのインポート
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 未満であれば
(cnt<g_n-1) {
var myTween = new Tween(my_mc, "_x", Regular.easeOut, my_mc._x, my_mc._x-g_w, 3, true);
//bt1のボタン機能を無効にする
R_btn.enabled = false;
//myTweenのモーション終了時に実行するメソッドを定義
myTween.onMotionFinished = function() {
//ボタン機能を有効にする
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);
//bt1のボタン機能を無効にする
L_btn.enabled = false;
//myTweenのモーション終了時に実行するメソッドを定義
myTween.onMotionFinished = function() {
//ボタン機能を有効にする
L_btn.enabled = true;
}
//R_btnを表示する
R_btn._visible = true;
//なおかつカウンタが 1 になれば
if (cnt == 1) {
//L_btnを非表示にする
L_btn._visible = false;
}
//カウンタから1を減算
cnt--;
}
};

A 回答 (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 以上で動作

※後にこのページを見る方がいらした場合の状況説明図↓
「移動位置が狂ってしまう」の回答画像1
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/06 21:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!