No.10 初期状態の作成
03 OnLoad動作 〜 ステータスの取得 〜
 
製作者ステータス情報の読込  「Line 625〜639」



 各レイヤーの状態を記録する「 DisplayNormalState 」は、文字列としてひとつの変数上に複数のデータを記録する手法を取っています。 製作者側の利便性を確保するための策ですが、このため、データを読み込むには、解析ルーチンを通してデータを読み込む必要性があります。

  var zIndexCookieCheck = true 
           DisplayCookieCheck = true;

  var UserState = new Array(); 
  var systemcount = 0;
  for (count = 0 ; count < DisplayNormalState.length ; count ++){
    if (DisplayNormalState.charAt(count) == "."){
      for (count2 =count ;count2 < count+100 ; count2 ++){
        if (DisplayNormalState.charAt(count2) == "="){
          UserState[parseInt(DisplayNormalState.substr( count+1 , 10)
           ,10)] =parseInt(DisplayNormalState.substr( count2+1 , 10) ,10)
          break;
        }
      }
    }
  }

 解析ルーチンの図式化したのが下図になります。



 最初に、データの区切り記号である識別子「.」の読込を行うわけですが、データの何処に存在するか分からない為、「 for 」を用いてひとつひとつ検査をしていくことになります。


    if (DisplayNormalState.charAt(count) == "."){

 ステータス格納変数「 DisplayNormalState 」の「count」番目のデータが「.」であるかどうかを識別する判定式は上図のように、
 DisplayNormalState.charAt(count) == "."
 となります。「 charAt 」は、指定した文字列の指定番目の文字を返すためのメソッドで、上図式を用いることで、「 for 」でまわされる「 count 」番目のデータを全て検出することが可能になります。 尚、「 count 」は、
 for (count = 0 ; count < DisplayNormalState.length ; count ++){
 length プロパティを用いることで、「 DisplayNormalState 」の文字の長さ分を検出するようにしています。


    for (count2 =count ;count2 < count+100 ; count2 ++){

 この式は、「.」が検出された後に発動するループ文ですが、ここで次は「=」を検出する必要があるため、100先までの文字列を検出するように設計されています。 この100という数は任意の数をこちらが勝手に指定しただけ(本当は、DisplayNormalState.length - count としたほうが良いかもしれないんですけれどね)で深い意味はありませんが、例えば、ピリオドのあと、すぐに数値を挿入していない場合の可能性を想定しているため、こういった記述になっています。


  UserState[parseInt(DisplayNormalState.substr( count+1 , 10),10)] =
                parseInt(DisplayNormalState.substr( count2+1 , 10) ,10)

 さて、実際にデータを記録するルーチンですが、ここでは、 UserState[]配列に、ステータス情報を書き込む処理を行っています。配列の番号がレイヤーの配列番号に相当しますので、1次元配列でまかなえますね。
 データの格納位置、すなわち格納配列の番号ですが、これは「.」の検出された次の文字列を数字に変換することで行います。 最初の[ for ]のループは「 count 」変数が回っていますので、
 parseInt(DisplayNormalState.substr( count+1 , 10),10)
 とすることで、配列番号を記録することが可能になります。 同様にステータスは、
 parseInt(DisplayNormalState.substr( count2+1 , 10) ,10)
 とすることで代入可能です。

レイヤー表示状態の決定  「Line 656〜684」



 レイヤーの表示状態を決定するには、2つのデータの照合が必要です。 すなわち、
 1:製作者のステータス情報
 2:Cookieのステータス情報

 です。 製作者側のステータスは、「Line 625〜639」で、「UserState[] 」配列へ格納されていますので、あとは Cookie との照合となります。


    //クッキーを読み込む
    ReadCookie(Count,2)
    var ZZ2 = rCz;
    var DD2 = rCd;

 クッキー情報の読込には「ReadCookie()」ファンクションを用いますが、これは別章で説明しますのでここでは割愛します。

 ファンクションで呼び出された情報は、ローカル変数「ZZ2」と「DD2」へ代入されます。ZZ2はzIndexの情報を、DD2へは表示状態の値が代入されます。 Cookieに情報が書き込まれていなかった場合は「−1」が代入されることになります。


  if (DisplayCookieCheck){
    if ( D_State >= 2){
      DisplayData[Count] = D_State - 2;
    } else {
      DisplayData[Count] = DD2;
    }
  } else {
    if (D_State >= 2){
      DisplayData[Count] = D_State - 2;
    } else {
      DisplayData[Count] = D_State;
    }
  }

 レイヤーの表示状態のステータスは
   0=非表示
   1=表示
 となっています。 Cookie には必ずこの値が記録されています(もしくはFALSE にあたる -1)が、製作者ステータスにはこの他の情報も含まれているのでコンバートをする必要があります。 製作者のステータスは、
   0= Cookieが 「 FALSE 」 であった場合に 非表示
   1= Cookieが 「 FALSE 」 であった場合に表示
   2= Cookieの情報に関わりなく 非表示
   3= Cookieの情報に関わりなく 表示
 の4パターンですので、クッキーが存在する場合とそうでない場合で判定を行わなくてはなりません。


    if ( D_State >= 2){
      DisplayData[Count] = D_State - 2;
    } else {
      DisplayData[Count] = DD2;
    }

 上図は、Cookieが存在していた場合の処理ですが、 製作者ステータスが「2」以上である場合、Cookieに関わり無く設定を行わないとならないので、
  DisplayData[Count] = D_State - 2;
 としています。 −2することで、「 0=非表示 / 1=表示 」の実ステータスに添った数値を代入しています。


    if ( D_State >= 2){
      DisplayData[Count] = D_State - 2;
    } else {
      DisplayData[Count] = D_State;
    }

 上図は、Cookieが存在していない場合の処理ですが、基本的なルーチンは同じで、Cookieよ優先する、ユーザーステータスが「2」以下であった場合に、Cookieから得た「D_State」を代入するようになっています。(この部分のスクリプトは簡略化できますね、ちょっと無駄な処理が多いような気がします)

zIndex情報の代入  「Line 686〜699」



 レイヤーの重なり情報であるzIndexは、レイヤーの枚数と当然ながら密接な関係にあります。 このため、レイヤーの枚数を変更したり配列番号を製作者が変更してしまった場合、Cookie上の値との整合性が取れなくなる場合も考えられます。このため、zIndexの情報は、レイヤー枚数が一致した場合にのみCookieの情報を適応させ、それ以外の場合は基準値であるレイヤーの配列番号を用いることにしています。
 具体的には、[ for ]で2回行われるループにおいて、1回目でzIndexのデータを照合し、2回目で数値を代入するという手法をとることになります。



「line 696〜698」


  if ( ( parseInt(getCookie("LAYNUM")) != LayerCount )  ){
    zIndexCookieCheck = false;
  }

 上図スクリプトは、zIndexの整合性をチェックするもので、 Cookie内に格納されている以前の状態のレイヤーの枚数をチェックして、その枚数が合致していなかった場合に、「 FALSE 」を返すように組まれています。
 判定条件の「 LayerCount 」は、現時点でのスクリプト上にあるレイヤーの枚数が、「 parseInt(getCookie("LAYNUM")) 」には、Cookie上に格納されているレイヤーの枚数が記録されています。

「line 687〜692」


  if (zIndexCookieCheck){
    ReadCookie(Count,1)
    zIndexData[Count] =  rCz;
  } else {
    zIndexData[Count] = Count;
  }

 上図は、[ for ]で2回目のループで動作するスクリプトです。判定式の「zIndexCookieCheck」は、最初のチェックで整合性が取れてイ場合は「true」となっているので、
 1:TRUEの場合は、Cookieの情報を書き込む
 2:FALSEの場合は、配列の番号を代入する
 の分岐を行うことが可能になります。



ページの最上段へ移動します