• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:actionscriptでfor文が正常に動かない)

actionscriptでfor文が正常に動かない

このQ&Aのポイント
  • actionscript2.0で、ボタンを押したら各MCの現在表示しているフレーム番号をMCの番号順に調べ、リネームするスクリプトがうまく動作しない問題が発生しています。
  • 現在表示しているフレーム番号を順に調べるforループと、全てのMCをチェックするforループが正常に動作しているようですが、リネームステップでの動作が不正確であり、20や21までしかリネームできない問題が発生しています。
  • スクリプトの記述が不適切な可能性があるため、適切な改変方法を教えていただきたいです。

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

前回 No.6436822 と同じ並べ替えの仕様で、名前の通し番号だけムービークリップの並び順に変更する、とのことでよろしいでしょうか? _name プロパティを直接書き換えてしまうと、様々な誤動作の原因になります。 ですから、これは触らずに、配列変数を用意してリネーム後の名前を記録してはいかがでしょう。 No.6436822 でご紹介したスクリプトの初期設定の部分に (↓ 各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //リネーム後の管理番号を記録する配列変数  //フィールド名  // clip:MCの参照(Photo0~番号順)  // rename_no:リネーム後の番号  //記録位置はインスタンス名の番号の順  var list:Array = new Array(); ↑ このスクリプトを追加し、並べ替えを行う Clip_Align 関数を次のように変更してみてください。 字数の都合上、位置を決める処理を省略させていただきました。 //***  //整列とリネームを行う関数  function Clip_Align():Void  {   var px:Number , num:Number;   var i:Number , j:Number;   var ref:MovieClip;   //表示フレームを順に調べ、表示しているMCがあれば横に並べる   for( i = 5 , num = 0 ; i >= 1 ; i-- )   {    //全てのMCをチェック    for( j = 0 , px = 0 ; j <= 23 ; j++ )    {     //操作するMCの参照を作成     ref = clip_addr[ "Photo" + j ];     //該当するMCがあった場合、横に並べていく     if( ref._currentframe == i )     {      /*ここに、位置を決める処理を書く*/      //リストにリネーム後の管理番号を参照と一緒に記録      list[ j ] = { clip : ref , rename_no : num };      //次のためにpxとnumを更新      px++;      num++;     }    }   }   //デバッグ   trace( "-----" );   for( i = 0 ; i < type_max ; i++ )   {    trace( "元:" + list[ i ].clip._name + " リネーム後:" + "Photo" + list[ i ].rename_no );   }  } //*** プレビューで確認すると、元の名前とリネーム後の名前が出力されます。 配列変数にはリネーム後の番号だけが入っています。名前はこの番号に "Photo" を追加して作成してください。 trace 文で分かりにくい場合は、ムービークリップに名前を出力するテキストフィールドを作り、そちらにそれぞれの名前を出力すると確認すると分かりやすくなります。 ActionScript の配列変数では、同じ要素の中に仕切り(フィールドといいます)を作って複数の情報を管理することができます。 今回は clip と rename_no という2つの仕切りを作り、clip にムービークリップの参照を、rename_no にリネーム後の番号を記録しています。 リネーム後の番号を持っているムービークリップを判別できるので、何かありましたら利用してみてください。 ムービークリップの並び順に通し番号を振り直すカラクリは、num という変数で取るカウントです。 この変数をまず、外側 i のループの最初で 0 に初期化しておきます。 内側 j のループで、並べるムービークリップが見つかるたびにこの値を記録し、次のために更新します。 上の段に並べるものから探しますから、つまり、先に見つかったものから順に番号が割り当てられます。 j は元のインスタンス名の番号を表します。 従って、配列変数の j 番目に記録すると、元のインスタンス名の並び順で参照とリネーム後の番号を一緒に管理することができます。 なお、  list.sortOn( "rename_no" , Array.NUMERIC ); で、リネーム後の順番に注目して並べ替えることもできます。 何かに使えそうでしたら利用してみてください。

bzblood
質問者

お礼

お礼が遅くなってしまったのですが、ご教授誠にありがとうございます…! まさにこれが私のやりたいことでしたので、嬉しすぎて涙が出そうです…!! 最後に並べ替えのアドバイスまで頂き、本当に勉強になりました。ありがとうございました!

関連するQ&A