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

自分ではどうやっても解決できなかったのでどうかご教授ください。
面倒な作りになっているので大変申し訳ないのですが、少ない数だと機能したものの、数を増やしたことで上手く動かなくなってしまいまして…
ご面倒だとは思いますが、どうか教えていただきたいです。

actionscript2.0で、Photo0~23のMCがあり、各MCの中には5フレームを作っています。
Photo0~23をクリックすることでnextFrameで1ずつフレームが進むよう設定していています。
問題はここからなのですが、ボタンを押したら各MCの今現在表示しているフレームごとにリネームをしようと考えています。
例)()内表示されているフレーム数
Photo0(5),Photo1(3),Photo2(3),Photo3(1),Photo4(4),Photo5(2)

Photo0(5),Photo4(4),Photo1(3),Photo2(3),Photo5(2),Photo3(1)
(フレームの表示番号が多い順番に並べ替える(調べる))
↓リネーム
Photo0(元Photo0),Photo1(元P4),Photo2(元P3),Photo3(元P2),Photo4(元P5),Photo5(元3)

現在表示しているフレーム番号をMCの番号順(Photo0~23)順に調べるスクリプトは下記で出来ています。
しかし、いざリネームをさせると20や21までしかリネームできずに困っています。

var clip_addr:MovieClip = _root;

Change_b.onPress= function(){
_global.px = 0;
Clip_Align();
}

function Clip_Align():Void {
var i:Number, j:Number, px:Number;
var ref:MovieClip;

//表示フレームを順に調べる
for (i=5; i>=1; i--) {
//全てのMCをチェック
for (j=0, px=0; j<=23; j++) {
//走査するMCの参照を作成
ref = clip_addr["Photo"+j];

//該当するMCがあった場合、順にリネームする
if (ref._currentframe == i) {
ref._name= "Photo"+_global.px;
//5から1の順に出てくるかを調べる/正常(しかし↓で21しか出ていない場合は21個しか出てこない)
trace(i)
//ちゃんとリネームされているか調べる/ここで毎回20や21などバラバラな数字が…
trace(ref)
//次のためにpxを更新
_global.px++;
}
}
}
}

ここからずっと進めずに立ち往生してしまっている状態で、困っています…
どこをどう直せば希望の動作をしてくれるのか、
もしくは、記述しているスクリプトがそもそもこれでは出来ないようでしたら、どう改変したらいいのか教えていただきたいです。

何卒よろしくお願いいたします。

A 回答 (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 );

で、リネーム後の順番に注目して並べ替えることもできます。
何かに使えそうでしたら利用してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/01/29 16:59

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