【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】

ムービークリップに色をつけるときは、

ムービークリップにimg1と名前を付けて

image = new Color(this.img1);
image.setRGB(0xff0000);

で成功します。

それを外部テキストファイルを使い色変更しようと考えましたが、うまくいかない為に質問させていただきました。


==============================

・ムービークリップ名をimg1
・テキストファイルread.txtに『&color1=0xff0000&』
とする

以下、asフレームです。

myLoadVars = new LoadVars();

myLoadVars.onLoad = function(Success) {

if (Success) {

image = new Color(this.img1);
image.setRGB(color1);
}
};

myLoadVars.load("read.txt");

stop();

==============================


loadVariablesを使った方法も試しましたが成功しません。いろいろな言葉で検索しましたが見つからず、お手上げ状態なので、もし、分かる方がいたらお教えください。

A 回答 (2件)

一番の原因はターゲットパスの誤りです。




LoadVars オブジェクトに限らずムービークリップやボタンでもそうですが、onLoad ・onPress などのイベントハンドラに登録する関数の中での this はイベントハンドラの持ち主のオブジェクトを指します。
今回の件で言いますと、myLoadVars.onLoad = function の中での this とは myLoadVars のことです。

ご提示のスクリプトにある

 > image = new Color(this.img1);

この this.img1 は” myLoadVars が持っている img1 ”という意味になり、色を変えるムービークリップを正確に指定することができません。


関数の中で this を省略した場合は、”関数が定義されているタイムライン”を指します。

 > image.setRGB(color1);

この color1 は、例えばこのスクリプトをメインのタイムラインに書いた場合、普通は” _root が持っている color1 ”と解釈されます。

しかし、LoadVars クラスで外部から変数を読み込んだ時、読み込んだ変数は”読み込みを担当した LoadVars オブジェクトのもの”になっています。今回の件ですと、color1 は _root ではなく、読み込みの担当者である myLoadVars オブジェクトのものです。

ここで、先の this の話を思い出していただきたいのですが。
onLoad などのイベントハンドラに登録する関数の中での this は、イベントハンドラの持ち主を指します。
従って

 image.setRGB( this.color1 );

というようにすると、myLoadVars で読み込んだ変数 color1 を setRGB のパラメータとして使えるようになります。

**************************

もう1点は、強いて言うなれば setRGB に渡しているパラメータの型の問題です。


setRGB のパラメータは正式には、RGB値を”数値”で渡さなければなりません。
しかし、外部から読み込んだ変数の値は、数値を書いたつもりであっても”文字列”として解釈されます。

もっとも、この辺は ActionScript の少々ズボラなところで、実は文字列のまま渡しても、内部で変換して上手く処理してくれるようです。
しかし、厳密に言うなら、数値を要求するメソッドには数値に変換してから渡すべきだと思います。


文字列を数値に変換する、Number という関数があります。
Number 関数は 0x で始まる文字列は 16 進数に変換してくれますから、テキストファイルには 0x を付けて記述しておいた方が簡単です。
なお、0x ではなくただの 0 で始まる文字列は8進数と見なされるのでご注意ください。

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

まとめますと、大体、次のようなスクリプトになります。
ステージにムービークリップのインスタンス” img1 ”があるとします。
テキストファイル” read.txt ”の内容は

 &color1=0xff0000&

とします。 & は複数の変数を記述する場合に区切りとして使われるだけなので、読み込む変数が1つしかないのなら付けなくても構いません。
このスクリプトは、メインのタイムラインのフレームに設定してください。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)



 //カラーデータを読み込むオブジェクトを作成
 myLoadVars = new LoadVars();

 //読み込み終了時の処理
 myLoadVars.onLoad = function( Success )
 {
  var image;


  if( Success )
  {
   //ムービークリップの色を読み込んだ色に変更する
   image = new Color( img1 );
   image.setRGB( Number( this.color1 ) );
  }
 };

 //カラーデータの読み込み
 myLoadVars.load( "read.txt" );


 //タイムラインを止めておく
 stop();

**************************

this は自分自身を指す表現ですが、使う場所によって”自分自身”を誰と解釈するかが変わるというクセモノです。
タイムラインで

 image = new Color( this.img1 );

と書いた時には上手くいくのに、同じ記述を myLoadVars.onLoad = function の中に持っていくと正常に動作しなくなるのも、使う場所の違いで this の指す対象が変わってしまうためです。

this を付けても付けなくても同じ場合もあれば、省略した時と this を付けた時とでは違う場合もあります。
いろいろ研究してみてください。
    • good
    • 0
この回答へのお礼

分かりやすい回答ありがとうございました。

早速、試してみたところ成功しました。

ありがとうございます。

>>LoadVars オブジェクトに限らずムービークリップやボタンでもそうですが、onLoad ・onPress などのイベントハンドラに登録する関数の中での this はイベントハンドラの持ち主のオブジェクトを指します。

上記のことは大変参考になりました。

DPEさんのように、人に教えてあげられるように、これからもスキルアップしていきたいと思います。

本当にありがとうございました。

お礼日時:2007/05/09 00:57

テキストファイルに入力する内容を



&color1=ff0000&

にし、(先頭の”0x”を外す)以下のように書き換えれば色が変わるはずです。

myLoadVars = new LoadVars();
myLoadVars.onLoad = function(Success) {
if (Success) {
xSetColor(this.color1,this.img1);//第一引数:6ケタのRGB値、第二引数:ターゲット。後者は調節する必要があるかもしれません。
}
};
myLoadVars.load("read.txt");
function xSetColor (sNum:String, sTarget:MovieClip) {
var sNum:String;
var sTarget:MovieClip;
var _l1 = {r:null, g:null, b:null};
_l1.r = parseInt (sNum.substr (0, 2), 16);
_l1.g = parseInt (sNum.substr (2, 2), 16);
_l1.b = parseInt (sNum.substr (4, 2), 16);
var sCol:Color = new Color (sTarget);
sCol.setRGB (_l1.r * 0x10000 + _l1.g * 0x100 + _l1.b);
}
stop();
    • good
    • 0
この回答へのお礼

is_mayさん、回答ありがとうございます。

試したところ、ターゲットを少しいじったら成功しました。

自分が想像していたスクリプトと全然違っており、とても複雑なことに驚いています。

自分はどうがんばっても、一生、is_mayさんのレベルには達しないと思うだけに、近くにいたらいろいろ教えてもらえるのにと思うばかりです。

分かりやすい回答ありがとうございました。

お礼日時:2007/05/09 01:10

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