こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

立体回転運動 新たにボタンを作って一定角度だけ動かす

お世話になります。

下記のプログラムは3Dのぐるぐる回るプログラムなのですが、

onClipEvent (load) {
degree = 0;
r = 100;
centerx = 150;
centery = 100;
}
onClipEvent (enterFrame) {
radian = Math.PI/180*degree;
this._x = centerx+r*Math.cos(radian);
this._y = centery+r*Math.sin(radian)/2;
this._xscale = this._yscale=this._alpha=this._y;
degree += 5;
}

--------------------------------------------------------------------
それで、ここからなのですが、
onClipEvent (enterFrame) {
 --省略--
degree += 5;
 ↓
のところをまず削除して、新たにボタンを作って、そのボタンを押すと、
押すたびにある一定の角度分だけ円運動するようにしたいのですが、どうしたらいいんでしょうか?

単純にボタンを作って、
そこに
on(release) {
degree +=5;
}

と書いてもまともに動きません。
初心者なものなので、よろしくお願いします。

それと、このプログラムはムービークリップに記載されているのですが、出来たらルート画面のレイヤーにactionを作って、そこにスクリプトをまとめて書きたいと思うんですが、どうしたらいいんでしょうか?ムービークリップにインスタント名をつけて、上記のプログラムの前に、

ムービークリップインスタント名.onClipEvent (load) {
--省略--
}
ムービークリップインスタント名.onClipEvent (enterFrame) {
--省略--
}

としたら、フィールド名がありませんとエラーが出てしまいます。
長くなってしまいましたが、わかりずらい説明かとは思うのですが、重ねてよろしくお願いします。

投稿日時 - 2006-04-19 23:09:45

QNo.2102230

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

72°ずつ回転させると停止位置がずれるのは
円運動させる関数EnMove内で
degree += 5;
としているからです。
フレーム毎に5°ずつ動かしているのでぴったり72°になることはありません。
なので72を割り切ることができる数字にする必要があります。
あわせてその下のnowdeg += 5の部分も直しといてください。

5個のメニューを動かしたいということでちょっとAS書いてみました。
ステージ上にmenu1_mc、menu2_mc、… menu5_mcを配置します。
my_btnはそのままです。

//初期位置変数設定
r = 100;
centerx = 150;
centery = 100;
const = 72;
//
//初期位置設定
for (var i = 1; i<=5; i++) {
var mc = _root["menu"+i+"_mc"];
//move_bln,degreeはそれぞれMC毎に設定します。
mc.move_bln = false;
mc.degree = 90+const*i;
radian = Math.PI/180*mc.degree;
mc._x = centerx+r*Math.cos(radian);
mc._y = centery+r*Math.sin(radian)/2;
mc._xscale = mc._yscale=mc._alpha=mc._y;
}
//ボタンを押したとき-----------------------------------------
_root.my_btn.onRelease = function() {
for (var i = 1; i<=5; i++) {
var mc = _root["menu"+i+"_mc"];
if (mc.move_bln) {
//trueの時 終了
return false;
} else {
mc.move_bln = true;
}
//動かした角度を初期化
mc.nowdeg = 0;
//円運動させる関数を呼ぶ
mc.onEnterFrame = EnMove;
}
};
//円運動させる関数--------------------------------------------
function EnMove() {
radian = Math.PI/180*this.degree;
this._x = centerx+r*Math.cos(radian);
this._y = centery+r*Math.sin(radian)/2;
this._xscale = this._yscale=this._alpha=this._y;
this.degree += 9;
//動かした角度
this.nowdeg += 9;
//動かした角度が一定値を上回った時
if (this.nowdeg>=_root.const) {
//円運動関数を停止
this.onEnterFrame = null;
//円運動中ではなくなるのでfalseにする
this.move_bln = false;
//角度degreeが90°位置にあるものが手前にあるMC
if (this.degree%360 == 90) {
trace(this);
}
}
}

多少変なトコもありますが参考にでも。

投稿日時 - 2006-04-25 22:33:28

ANo.2

>1週目と2週目で軌道が微妙に違ってくる
確認してみましたが軌道は同じ様です(同じところを通ってると思います。)
my_mcの止まる位置が違うということでしょうか?

#1のASではボタンを押したときに動く一定の角度constの値は50となっていますが
一周は360°なのでこれだと一周するごとにずれてきます。
30、60°のようにキリのいい値にすれば毎回同じ位置に止まります。なので

const = 60; としてみてください。

>一番手前に来た時、リンク出来るようにしたい
現在は0°からスタートしているので位置的には右から動きだしています。
これを90°位置からスタートさせれば一番手前で止まるようになると思います。

degree = 90;

です。

投稿日時 - 2006-04-24 22:10:08

補足

ありがとうございます。

補足なんですけど、my_mcの止まる位置が違うということでしょうか?そうです、確かに30、60といった数字は同じ一難ですけど、72だと違うんですよね??72なら、5回回れば360になるから軌道は同じはずだと思うんですけど、どうして違うんでしょうかね?

一番手前に来た時、リンク出来るようにしたいは、本当は5個のmy_mcを用意して、クルクル回るように出来て、それで一番前のものがリンク出来るようにして、指定されたリンクに飛ばすようにしたいと思っているんですけど。
現状だと難しいですかね?

投稿日時 - 2006-04-25 00:45:14

ANo.1

ムービークリップのインスタンス名を my_mc
ボタンのインスタンス名を my_btn
とします。以下のASをフレームに記述します。
記述するフレーム位置はmy_mc、my_btnがあるフレーム位置と同じか
それ以降でなければなりません。

//値の初期化------------------------------------------------
r = 100;
centerx = 150;
centery = 100;
degree = 0
//ボタンを押したときに動く一定の角度
const = 50;
//円運動中かどうかを判断するフラグ
//true - 円運動中false - 円運動していない
move_bln = false

//ボタンを押したとき-----------------------------------------
_root.my_btn.onRelease = function() {

if (move_bln) {
//trueの時 終了
return false;
} else {
move_bln = true
}

//動かした角度を初期化
nowdeg = 0;
//円運動させる関数を呼ぶ
_root.my_mc.onEnterFrame = EnMove;
};

//円運動させる関数--------------------------------------------
function EnMove() {

radian = Math.PI/180*degree;
my_mc._x = centerx+r*Math.cos(radian);
my_mc._y = centery+r*Math.sin(radian)/2;
my_mc._xscale = my_mc._yscale=my_mc._alpha=my_mc._y;
degree += 5;

//動かした角度
nowdeg += 5;

//動かした角度が一定値を上回った時
if (nowdeg>=const) {
//円運動関数を停止
my_mc.onEnterFrame = null;
//円運動中ではなくなるのでfalseにする
move_bln = false
}

}

投稿日時 - 2006-04-21 00:26:15

補足

遅くなりました。
丁寧に書いていただきありがとうございます。

自分の環境下で試してみました。
一つ思うんですけど、ボタンを押して、一定角度を回転させたとき、1週目と2週目で軌道が微妙に違ってくるのはどうしてなんでしょうか?
最終的には、一番手前に来た時、リンク出来るようにしたいと思っているんですけど。
いろいろ試してみたのですが、どうもうまくいきません。
どうしたらいいんでしょうか?
お手数ですが、ご教授いただけないでしょうか?

投稿日時 - 2006-04-24 00:33:31

あなたにオススメの質問