ただ見上げるより この手を伸ばしてみたくなるだけ (ポコアポコ/カヒーナムジカ)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 先日書いた「意図しないタイミングでのセーブ」、どうやら原因はリファレンスの割当にあったようです。
 リファレンスとか書いても意味が分からないかと思いますが。
 ActionScriptは(他でもそうかも)、例えばあるムービークリップに他のムービークリップを結びつけることができます。
   dice = randomClip;
 とか言うスクリプトを書いておけば。
 diceに対して位置を変更するコマンドとか、透明にして見えなくするコマンドとかを指示すると、それがrandomClipに対しても適用されます。
 randomClipの内容がランダムに変わる場合、内容が何になるにしろ、diceに対してコマンドを書いておけばどれにも適用されます。スクリプトが簡単に書けると言う訳です。
 これを参照(リファレンス)と言う訳です。

 しかしムービークリップの場合はそれで良いのですが、これがナンバー(数字)やストリングス(文字列)の場合、ちょっと意味合いが変わってきます。
 
   diceNumber = randomResult;
 と書くと、randomResultの値をdiceNumberにコピーする、という意味になります。
 参照と違って、diceNumberに何かコマンドを出しても、randomResultは変化しません(確か)。

 今まで左側を変化させた場合の説明をしてきましたが、右側が変化した場合でも同様です。
 リファレンスになる場合(ムービークリップなど)、右側のパラメーターに変化が起きると、即左側に反映されます。
 しかしただの値のコピーの場合、右側が変化しても左側はそのままです。右側の変化を反映させたい場合、再度「diceNumber = randomReslut;」を実行してコピーさせなくてはなりません。
 どちらも同じくイコールで結ぶだけなのでややこしいですね(実際スクリプト初心者には分かり難いみたい)。

 何がリファレンスになって、何がコピーになるのかは、型によって決まっています。ムービークリップならばリファレンス、数値や文字列ならぱコピー。
 では、配列の場合は?

 私はてっきり配列もデーターをコピーするだけだと思っていたのですが。
 実は参照になってしまう様なのです。
 Flashでデーターをセーブする場合も、上記のように等号で式を作るのですが、
   mySaveObject.data.pc1Paramater = this.pc1Paramater;
 私は値を配列ごとコピーしているだけのつもりだったのですが、ここで参照が成立してしまっていたのですね。
 このため、アニメーション中にpc1Paramaterが変化した時に、その変化が逐一セーブされてしまっていたのです。
 もちろん、配列でないデーターはページの開始時点、アニメの開始前の状態がセーブされています。
 ページを再現するスクリプトの一部は頭の状態を作ろうとし、別の部分はアニメが終了した後の状態を作ろうとし…それじゃあ、上手く再現されない訳です(苦笑)。


 このリファレンスの解除の仕方が、いまいち良く分かっていません。
 仕方ないので、リファレンスになってしまうのを前提として、他の方法で迂回することにしました。
 まあ、この問題を解決したら、その付近に違う問題が2つばかり埋まっていることが明らかになりましたけれども(苦笑)。
 仕方がないので、今は関係するスクリプトをだいぶ書きなおす作業をしています。
 でも、おかげでスクリプトはすっきりしそうです。最初からこのスクリプトを思いつけていたらなぁ…。


追記を閉じる▲
   diceNumber = randomResult;
 と書くと、randomResultの値をdiceNumberにコピーする、という意味になります。
 参照と違って、diceNumberに何かコマンドを出しても、randomResultは変化しません(確か)。

 今まで左側を変化させた場合の説明をしてきましたが、右側が変化した場合でも同様です。
 リファレンスになる場合(ムービークリップなど)、右側のパラメーターに変化が起きると、即左側に反映されます。
 しかしただの値のコピーの場合、右側が変化しても左側はそのままです。右側の変化を反映させたい場合、再度「diceNumber = randomReslut;」を実行してコピーさせなくてはなりません。
 どちらも同じくイコールで結ぶだけなのでややこしいですね(実際スクリプト初心者には分かり難いみたい)。

 何がリファレンスになって、何がコピーになるのかは、型によって決まっています。ムービークリップならばリファレンス、数値や文字列ならぱコピー。
 では、配列の場合は?

 私はてっきり配列もデーターをコピーするだけだと思っていたのですが。
 実は参照になってしまう様なのです。
 Flashでデーターをセーブする場合も、上記のように等号で式を作るのですが、
   mySaveObject.data.pc1Paramater = this.pc1Paramater;
 私は値を配列ごとコピーしているだけのつもりだったのですが、ここで参照が成立してしまっていたのですね。
 このため、アニメーション中にpc1Paramaterが変化した時に、その変化が逐一セーブされてしまっていたのです。
 もちろん、配列でないデーターはページの開始時点、アニメの開始前の状態がセーブされています。
 ページを再現するスクリプトの一部は頭の状態を作ろうとし、別の部分はアニメが終了した後の状態を作ろうとし…それじゃあ、上手く再現されない訳です(苦笑)。


 このリファレンスの解除の仕方が、いまいち良く分かっていません。
 仕方ないので、リファレンスになってしまうのを前提として、他の方法で迂回することにしました。
 まあ、この問題を解決したら、その付近に違う問題が2つばかり埋まっていることが明らかになりましたけれども(苦笑)。
 仕方がないので、今は関係するスクリプトをだいぶ書きなおす作業をしています。
 でも、おかげでスクリプトはすっきりしそうです。最初からこのスクリプトを思いつけていたらなぁ…。

【2009/06/27 02:47】 | 天地未だ形れざるとき
トラックバック(0) |
コメント
この記事へのコメント
コメントを投稿
URL:

Pass:
秘密: 管理者にだけ表示を許可
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。