トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     同時進行するアニメーション
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sunafu
Åê¹ÆNo.14110
投稿日時: 2005-1-15 22:33
新米
居住地:
投稿: 19
使用環境:
WinXP,FlashMX,秀丸
同時進行するアニメーション
アニメーションを全部アクションスクリプトで作っています。

10個の配列の中から同時に3つのアニメーションを実行する。
実行するアニメーションは、タイマーなどある条件化で予めtrueにしておく。
最初、for inで順番に配列の値を取得した上で、
アニメーションIDに応じたアニメーションを再生していたのですが、
毎フレーム処理でfor文を使うと、うまくいかなくなってきました。
for inは使わない方がいいのでしょうか?
なにか、アドバイスをいただけると幸いです。
野中文雄
Åê¹ÆNo.14113
投稿日時: 2005-1-15 23:29
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 同時進行するアニメーション
小学生から、こんな質問を受けたとします。「ひと桁の数字3つの足し算をやっています。暗算で答えを出すと、うまくできません。どうしたらいいでしょう?」

特殊な能力でもないかぎり、回答のしようがありませんね。「うまくでき」ないというのが、答えが出せないのか、間違っているのか。間違っているのであれば、それはたとえば繰上がりとか、特定の箇所なのか。「暗算で」できないというのは、筆算ならできるのか。そもそも具体的にどういう問題を、どう計算して、どういう答えを出したのか。詳しい情報が必要になります。
引用:
sunafuさんは書きました:
10個の配列の中から同時に3つのアニメーションを実行する。

何を「trueにしておく」のですか? また、その値は、どのように使用しているのですか?
引用:
実行するアニメーションは、タイマーなどある条件化で予めtrueにしておく。

「毎フレーム処理でfor文を使」わなければ、「うまくい」ったのですか?「うまくいかな」いというのは、どういう結果になるのですか? →【うまくいきません

その「for文」というのは、具体的にどのような処理なのですか?
引用:
毎フレーム処理でfor文を使うと、うまくいかなくなってきました。
for inは使わない方がいいのでしょうか?


----------------
 

sunafu
Åê¹ÆNo.14140
投稿日時: 2005-1-16 13:17
新米
居住地:
投稿: 19
使用環境:
WinXP,FlashMX,秀丸
Re: 同時進行するアニメーション
すいません、想像するにはおおざっぱすぎましたかね。
ちょとヒントがほしかったのですが、なんのことかわからなかったみたいですね。
申し訳ないです。
この際、長くなりますが具体的に書いていきます。
作成途中なのでおかしな点もあると思いますが、
以下が、ざっくりと編集したスクリプトです。
現在、思ったとおりには、動いていません。

-------------------------------------------------------------------------------------------------------------

/*
------------------------------------------------------------------------------------------
@構造体定義
------------------------------------------------------------------------------------------
*/

// アニメション構造体: word,objectName,flagAnime,flagAnimeStop,X,Y,Alpha
animeData1 = { word:"screenMc1",obj_N:screenMc1, flag_ani:0, flag_aniStop:1, id_X:320, id_Y:220, id_A:0 };
animeData2 = { word:"screenMc2",obj_N:screenMc2, flag_ani:0, flag_aniStop:1, id_X:320, id_Y:220, id_A:0 };
animeData3 = { word:"screenMc3",obj_N:screenMc3, flag_ani:0, flag_aniStop:1, id_X:320, id_Y:220, id_A:0 };

//アニメーションID flag_ani
//no = 0;
//fadeIn = 1;
//fadeOut = 2;
//xMove =3;
//yMove =4;

/*
------------------------------------------------------------------------------------------
@配列定義
------------------------------------------------------------------------------------------
*/

// 配列
animeSetArray = [ animeData1, animeData2, animeData3 ];

/*
------------------------------------------------------------------------------------------
@フラグ管理
------------------------------------------------------------------------------------------
*/

// 初期値セットのチェック
flagSet = true;

// アニメーション再生終了のチェック
flagOne_FadeIn = 1;
flagOne_FadeOut = 1;

// イベント開始チェック
timerCheck = 1;



/*
------------------------------------------------------------------------------------------
@プリプロセッサ定義(defineもどき)
------------------------------------------------------------------------------------------
*/

// イベント発生までの時間取得
d_eventCheckTimer = 5;



/*
------------------------------------------------------------------------------------------
@1回だけ…
------------------------------------------------------------------------------------------
*/

// @ 背景セット関数
function bgSetAction(bgMc,animeData)
{
trace ("ロード_背景プロパティ指定");

// 構造体の値を代入

// IDフラグ指定
bgMc.animeId = animeData.flag_ani;

// IDフラグ指定(ストップ)
bgMc.animeIdStop = animeData.flag_aniStop;

bgMc._x = animeData.id_X;
bgMc._y = animeData.id_Y;
bgMc._alpha = animeData.id_A;
};



/*
------------------------------------------------------------------------------------------
@毎フレファンクション
------------------------------------------------------------------------------------------
*/

// 毎フレーム処理
this.onEnterframe = function()
{
// 1回のみ値のセット
commonLoadSet();

// 常駐タイマー呼び出し
secondTimerAction();

// 各種アニメーション実行
for(i in animeSetArray)
{
// タイマー処理呼び出し
eventTimerAction(secondTimer, animeSetArray[i].obj_N, animeSetArray[i]);

// アニメーション処理呼び出し
bgAnimeAction(animeSetArray[i].obj_N, animeSetArray[i]);
};

// デバッグ用 trace文 値の監視
traceAction();
};

function commonLoadSet()
{
// 初期値のセット
if( flagSet == true )
{
flagSet = false;

for(i in animeSetArray)
{
// 順番に構造体の値をセット
bgSetAction(animeSetArray[i].obj_N, animeSetArray[i]);
};
};
};



/*
------------------------------------------------------------------------------------------
@タイマー
------------------------------------------------------------------------------------------
*/
function secondTimerAction()
{
// 秒・タイマー作成
secondTimer = Math.floor(getTimer()/ 1000 );
};


function eventTimerAction(currentTimer, bgMc, animeData)
{
// イベント終了チェック
if( bgMc.animeIdStop == 1 )
{
// イベント開始チェック
if( timerCheck == 1 )
{
//スタート時間取得
startTimer = currentTimer;

// タイマーチェックオフ
timerCheck = 0;
};

eventTimer = currentTimer-startTimer;
trace ("bgMc="+bgMc);
trace ("現在のタイマー="+currentTimer);
trace ("スタートタイマー="+startTimer);
trace ("イベントタイマー="+eventTimer);

if( eventTimer >= d_eventCheckTimer )
{
// タイマーチェック再設定
timerCheck = 1;

// イベントタイマーのリセット
eventTimer = 0;

timerFlagCheckAction(bgMc, animeData);
};
};
};



function timerFlagCheckAction(bgMc, animeData)
{
// アニメーションストップを解除するフラグ
bgMc.animeIdStop = 0;

// アニメーションフラグ
// アニメーションが決まっていない場合(仮)
if(bgMc.animeId == 0)
{
bgMc.animeId = 1;
};
};



/*
------------------------------------------------------------------------------------------
@アニメーションの選択
------------------------------------------------------------------------------------------
*/

function bgAnimeAction(bgMc, animeData)
{
switch (bgMc.animeId)
{
// フェードイン処理
case 1:
fadeInAction(bgMc, 1);
break;
// フェードアウト処理
case 2:
fadeOutAction(bgMc, 1);
break;
// X移動処理
case 3:
xMoveAction(bgMc, -1);
break;
// Y移動処理
case 4:
yMoveAction(bgMc, 1);
break;
default:
trace ("0の場合、実行しない")
};
};



/*
------------------------------------------------------------------------------------------
@アニメーションの種類
------------------------------------------------------------------------------------------
*/

// 共通フェードイン処理
function fadeInAction(bgMc, cAlpha)
{
// 止め処理
if( bgMc._alpha >= 100 )
{
if( flagOne_FadeIn == 1 )
{
flagOne_FadeIn = 0;

bgMc._alpha = 100;

// アニメ終了フラグ立てる
bgMc.animeIdStop = 1;

// アニメーション開始予約
// フェードインの後はフェードアウト
bgMc.animeId = 2;

break;
};
};
bgMc._alpha += cAlpha;
};



// 共通フェードアウト処理
function fadeOutAction(bgMc, cAlpha)
{
// 止め処理
if(bgMc._alpha <= 0)
{
if( flagOne_FadeOut == 1 )
{
flagOne_FadeOut = 0;

// アニメ終了フラグ立てる
bgMc.animeIdStop = 1;

// アニメーション開始予約
// フェードアウトの後はリセット(仮)
bgMc.animeId = 0;

// オブジェクトの削除
//bgMc.removeMovieClip();

// アニメ終了フラグ立てる
break;
};
};

bgMc._alpha -= cAlpha;
};



// X移動処理
function xMoveAction(bgMc, cX)
{
// (仮)
// 止め処理
if( bgMc._x >= 500 )
{
bgMc._x = 500;

// アニメ終了フラグ立てる
};
if( bgMc._x <= 0 )
{
bgMc._x = 0;

// アニメ終了フラグ立てる
};

bgMc._x += cX;
};



// Y移動処理
function yMoveAction(bgMc, cY)
{
// 止め処理
// (作成前)

bgMc._y -= cY;
};



/*
------------------------------------------------------------------------------------------
@トレース
------------------------------------------------------------------------------------------
*/

function traceAction()
{
trace ("トレース_値の監視");

trace ("アニメーション用フラグ");
trace ("screenMc1.animeId="+screenMc1.animeId);
trace ("screenMc2.animeId="+screenMc2.animeId);
trace ("screenMc3.animeId="+screenMc3.animeId);

trace ("screenMc1.animeIdStop="+screenMc1.animeIdStop);
trace ("screenMc2.animeIdStop="+screenMc2.animeIdStop);
trace ("screenMc3.animeIdStop="+screenMc3.animeIdStop);
};



-------------------------------------------------------------------------------------------------------------
たとえば、作り方が悪いかもしれませんが、また当たり前なんですけど、
for inの中にある、if文でフラグが立ってしまう(寝てしまう)タイプは、
1回限りしか実行されず、同フレームで値が渡っていないとかで、どうしようかな??と。
フラグを管理する方法や構造のややこしさに、やや作り方に不安になってきてご質問させてもらいました。
関数で疑問に思っていたのは、毎フレーム処理で使う、for inを使うことです。


まだ、作りかけですが、どうしても僕が作りたいものは、
以下のようなアニメーション再生ルーチンです。

・時間やイベントフラグなどの条件(作ってない)が満たされるとアニメーションが再生されるもの
・座標移動、色変更、指定したアニメなど、あらゆる動的なものに対応
・3つくらいのアニメーションは同時再生可能

このようなものが作りたいとき、構造や使う関数は、果たしてこれでよいのか、
根本的に何か間違えているんじゃないのか、と、ご相談したかった次第です。

まずはイベントタイマーが満たすと、アニメーションが再生される、などの
基礎的なルーチン考えて……、現状です。未熟者なので、壊したり作ったり、試行錯誤があり、
今もちょと壊れているかも…っていう感じです。
恐縮ですがよろしくお願いします。
野中文雄
Åê¹ÆNo.14142
投稿日時: 2005-1-16 14:14
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 同時進行するアニメーション
ご質問のポイント自体が、わからなくなってきました。(1)現在スクリプトが意図どおりに動作せず、それを解決したいのですか。それとも、(2)目的のムービーを作成するためのスクリプトのデザインについて、アイデアを求められているのでしょうか。

このふたつを同時に質問されるのは、論点が錯綜しますし、回答者もお答えしづらいと思います。それに、現在動作していないのなら、(1)が先決です。もし現状のスクリプトのデザイン自体に問題があるとすれば、その解決の過程でアドバイスが得られるでしょう。

スクリプトが問題なく動作してから、さらに必要があれば、(2)についてご質問されることをお勧めします。

(1)については、まず問題の切分けと絞込みを行われるのが、解決のための第1ステップだと思われます。

参考:「トラブルの『捜査手順』
引用:
sunafuさんは書きました:
ちょとヒントがほしかったのですが、なんのことかわからなかったみたいですね。
申し訳ないです。
...[中略]...
現在、思ったとおりには、動いていません。
...[中略]...
フラグを管理する方法や構造のややこしさに、やや作り方に不安になってきてご質問させてもらいました。
関数で疑問に思っていたのは、毎フレーム処理で使う、for inを使うことです。
...[中略]...
・時間やイベントフラグなどの条件(作ってない)が満たされるとアニメーションが再生されるもの
・座標移動、色変更、指定したアニメなど、あらゆる動的なものに対応
・3つくらいのアニメーションは同時再生可能

このようなものが作りたいとき、構造や使う関数は、果たしてこれでよいのか、
根本的に何か間違えているんじゃないのか、と、ご相談したかった次第です。


----------------
 

sunafu
Åê¹ÆNo.14240
投稿日時: 2005-1-18 0:14
新米
居住地:
投稿: 19
使用環境:
WinXP,FlashMX,秀丸
Re: 同時進行するアニメーション
たびたび、ご回答どうもありがとうございます。私なりに整理します。

まず、お聞きしたいのは、毎フレーム処理におけるfor inです。
僕としては、for inを使うデザインがよいのか、という点に気にしているからです。
別の方法があれば、助言していただけると嬉しいです。

そうではなく、このまま作っていっても大丈夫そうなのであれば、
毎フレームでfor inを使って、アニメーションを同時処理する場合、
途中で同時処理でなくなっている問題に関して、解決したいと思っています。
さらに、他にスクリプトのデザインで問題があれば、修正していこうと考えています。
それではよろしくお願いいたします。
野中文雄
Åê¹ÆNo.14241
投稿日時: 2005-1-18 0:47
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 同時進行するアニメーション
毎フレームfor..inステートメントを使用すること自体に問題があるかというご質問でしたら、とくにそれはないと思われます。ただ、負荷の軽い処理とはいえませんので、使用する必要性については吟味した方がよいでしょう。

参考:「for文の基本
引用:
sunafuさんは書きました:
まず、お聞きしたいのは、毎フレーム処理におけるfor inです。
僕としては、for inを使うデザインがよいのか、という点に気にしているからです。


----------------
 

sunafu
Åê¹ÆNo.14353
投稿日時: 2005-1-21 15:24
新米
居住地:
投稿: 19
使用環境:
WinXP,FlashMX,秀丸
Re: 同時進行するアニメーション
お礼おそくなってすいません。
どうもありがとうございました。
for,,inの件、了解しました?。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops