アプリ版:「スタンプのみでお礼する」機能のリリースについて

こちらでは大変お世話になっております。
前回に引き続き移動のスクリプトを教えていただきたいのです。


ムービークリップをクリックすると、振り子のように1点は固定をしたまま右へ40度移動させる。次にクリックするともとの位置に戻る、次にクリックするとまた右へ40度、次はもとに戻る…。

というような、2つの地点を行き来するだけの動きにしたいのです。


on (release) {
this._rotation -= 40;
}


ムービークリップに上のような記述をすると、1回目のクリックは良いのですが、2回目のクリックでそのまま40度ずつ回り続けてしまいます。クリックするたびに行って戻るだけの繰り返しができるアクションスクリプトを教えていただければと思います。

超初心者で勉強しはじめたところです。
どうかよろしくお願い致します。

アクションスクリプト2.0 FLASH CS5

A 回答 (2件)

どうすべきかはやはり状況や方針によって変わりますよ。



これも Flash 5 (実際は要MX以上)的な
MC(ムービークリップ)自体に書く形のスクリプトでいくつか書いてみます。


とりあえずはシンプルに。

---1つめ--------------------
//このMCが表示されたときに実行
onClipEvent (load) {
//回転角度を設定
rotate_deg = 40;
}
//このMCがクリックされたときに実行
on (release) {
//回転角度の正負を逆にする
rotate_deg = -rotate_deg;
//その角度になるようにこのMCを回転
this._rotation = rotate_deg;
}
---------------------------



上のスクリプトだと
回転が「MCを作成したとき」とか「ライブラリからステージ上に出してすぐ」の状態を0度とします。
そうではなくて
その状態から手動などで回転させている場合(例:【図】↓)は次のようにすべきかもしれません。
(手動などで回転させていなくても使えます。)

---2つめ--------------------
//このMCが表示されたときに実行
onClipEvent (load) {
//回転角度を設定
rotate_deg = 40;
//このMCが表示されたときの角度を保存
start_deg = this._rotation;
}
//このMCがクリックされたときに実行
on (release) {
//回転角度の正負を逆にする
rotate_deg = -rotate_deg;
//その角度になるようにこのMCを回転
this._rotation = start_deg + rotate_deg;
}
---------------------------



次のようにクリックされたカウントをとって
クリック回数によって回転を変えても良いかもしれません。

---3つめ--------------------
//このMCが表示されたときに実行
onClipEvent (load) {
//回転角度を設定
rotate_deg = 40;
//クリックカウント用変数を用意
click_cnt = 0;
}
//このMCがクリックされたときに実行
on (release) {
//クリックカウントの値を1加算
click_cnt++;
//回転角度の正負を逆にする
rotate_deg = -rotate_deg;
//
//もしクリックカウントが1であれば
if (click_cnt == 1) {
//その回転角度の分だけ回転
this._rotation += rotate_deg;
//もしクリックカウントが1以外であれば
} else {
//その回転角度の2倍分回転
this._rotation += 2*rotate_deg;
}
}
---------------------------



上の「3つめ」を変えて
クリックカウントが偶数の場合と奇数の場合で回転を分けても良いかもしれません。

---4つめ--------------------
//このMCが表示されたときに実行
onClipEvent (load) {
//回転角度を設定
rotate_deg = 40;
//クリックカウント用変数を用意
click_cnt = 0;
}
//このMCがクリックされたときに実行
on (release) {
//クリックカウントの値を1加算
click_cnt++;
//
//もしクリックカウントが偶数であれば
//(もしクリックカウントを2で割った余りが0であれば)
if (click_cnt%2 == 0) {
//設定回転角度になるように回転
this._rotation = rotate_deg;
//もしクリックカウントが偶数以外(奇数)であれば
//(もしクリックカウントを2で割った余りが0でなければ)
} else {
//設定回転角度の反対向きになるように回転
this._rotation = -rotate_deg;
}
}
---------------------------



また「その2」の変形で
on(release){} に全て入れてしまうことも可能です。

---5つめ--------------------
//このMCがクリックされたときに実行
on (release) {
//もしクリックフラグ click_flg が未定義であれば
if (click_flg == undefined) {
//回転角度を設定
rotate_deg = 40;
//このMCが最初にクリックされたときの角度を保存
start_deg = this._rotation;
//click_flg を true にする
click_flg = true;
}
//回転角度の正負を逆にする
rotate_deg = -rotate_deg;
//その角度になるようにこのMCを回転
this._rotation = start_deg + rotate_deg;
}
---------------------------



数式で演算できないようなもっと複雑な回転をする場合には
次のようにあらかじめ回転角度データを用意しておいても良いかもしれません。

---6つめ--------------------
//このMCが表示されたときに実行
onClipEvent (load) {
//回転角度データ(配列)を設定
degree_arr = new Array(-40, 80, -80);
//クリックカウント用変数を用意
click_cnt = 0;
}
//このMCがクリックされたときに実行
on (release) {
//もしクリックカウントがデータ数未満であれば
if (click_cnt<degree_arr.length) {
//クリックカウントの値を1加算
click_cnt++;
//それ以外は
} else {
//クリックカウントの値を2に戻す
click_cnt = 2;
}
//用意したデータの角度分このMCを回転
this._rotation += degree_arr[click_cnt-1];
}
---------------------------

↑この動作例自体は単純です。
しかしこの考え方を使ってそれを発展させると,
例えば
 最初のクリックで -89度 回転
 次のクリックで 27度 回転
 さらに次のクリックで 96度 回転
 さらに次のクリックで -77度 回転
 さらに次のクリックで … …
というような,
決められている不規則な動作(ランダムな動作ではない)にも対応させることができます。



当たり前ですが,私は(誰しも),
まず 動作イメージ(動作順序) を考えてからスクリプトのコードを書きます。
少なくともその 動作イメージ(動作順序) の数だけ(実際はその数倍以上)スクリプトは存在します。
ですから,
今はどういう状態であるのかという「状況の把握」と,
それから何をどうするのかという「具体的な方針」がまず必要だろうと思います。
 
「FLASHで振り子風の移動スクリプトを教」の回答画像2
    • good
    • 0
この回答へのお礼

再度教えて下さり本当にありがとうございます。

すべて試してみて、同じ動作でもこれほどいろいろな考え方でスクリプトが書けるのかと驚きです。
途中に説明コメントも入れていただいたので、スクリプトの意味が勉強できます。

頂いた回答をプリントして手元に置いておきます。
とくに6つめ、応用に使えそうですばらしいですね。

これほど自由自在にスクリプトを書けるなんて尊敬です。
お礼にお伺いしたいぐらいです。

何度もつまずき、もうあきらめようかと思っていたところでしたので、感激・感動はもちろんのこと、超初心者なりにもFLASHが楽しくなりました。

ご親切に本当にありがとうございました。

お礼日時:2011/06/02 22:20

0→40→0→-40→0… と変化させたいわけですから、現在0であったときに、+40するか-40するかの区別が必要になります。


つまり単純に現在の数値から計算はできません。

そこで、いくつか方法が考えられます。

方法1)
状態変数を持ち、何番目はこの位置、というのを定義する。
_global.count +=1; if (_global.count>3) {_global.count = 0;}
switch (_global.count) {
case 0: this._rotation = 0; break;
case 1: this._rotation = 40; break;
case 2: this._rotation = 0; break;
case 3: this._rotation = -40; break;
}

方法2)
どちらに動いているか記憶し、行き過ぎたら移動方向を反転する。
※_global.moving = 40 とか初期化しておく。
this._rotation += _global.moving;
if (this._rotation <= -40 or 40 <= this._rotation) {
_global.moving = - _global.moving;
}

方法3)
三角関数を使い、その角度を増していく。
_global.angle += Math.PI / 2;
this._rotation = Math.sin(_global.angle) * 40;

どの場合でも、現在の状態を保持するグローバル変数を1つ、作っておくわけです。

Action Scriptを良く知らずに書いているので間違ってるかもしれませんが、こんな感じでどうでしょう。
また、もっと細かく動かすようにするには、それぞれ方法が違ってきます。考えてみてください。
    • good
    • 0
この回答へのお礼

さっそく回答をいただきどうもありがとうございます。
多くの方法を考えていただきとても参考になりました。

すべて、on (release) {}の中に入れて試してみたのですが、方法1と3はクリックしても動きませんでした。方法2は動くのですが、40度ずつ回転を続けてしまい最初と同じ結果となってしまいます。

もう少し勉強してみます。
ご丁寧にありがとうございました。

お礼日時:2011/06/02 18:12

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