ムービークリップに色をつけるときは、
ムービークリップに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を使った方法も試しましたが成功しません。いろいろな言葉で検索しましたが見つからず、お手上げ状態なので、もし、分かる方がいたらお教えください。
No.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 を付けた時とでは違う場合もあります。
いろいろ研究してみてください。
分かりやすい回答ありがとうございました。
早速、試してみたところ成功しました。
ありがとうございます。
>>LoadVars オブジェクトに限らずムービークリップやボタンでもそうですが、onLoad ・onPress などのイベントハンドラに登録する関数の中での this はイベントハンドラの持ち主のオブジェクトを指します。
上記のことは大変参考になりました。
DPEさんのように、人に教えてあげられるように、これからもスキルアップしていきたいと思います。
本当にありがとうございました。
No.1
- 回答日時:
テキストファイルに入力する内容を
&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();
is_mayさん、回答ありがとうございます。
試したところ、ターゲットを少しいじったら成功しました。
自分が想像していたスクリプトと全然違っており、とても複雑なことに驚いています。
自分はどうがんばっても、一生、is_mayさんのレベルには達しないと思うだけに、近くにいたらいろいろ教えてもらえるのにと思うばかりです。
分かりやすい回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ブラウザのサイズに合わせてオ...
-
斜めに移動
-
スクロールバーの自作の仕方
-
フォームのテキストの入力数字...
-
外部テキストのタグ
-
DirectXでのicoファイル読み込み
-
最後のフレームでジャンプするU...
-
外部テキストファイルでは文字...
-
PythonでSetWindowPosを使うに...
-
AS3.0で地面にバウンドするよう...
-
画像を一定時間ごとに切り替え...
-
SharedObjectの使い方(長文です)
-
【Flash】マスクでスポットライ...
-
レーダーチャートの描画
-
PDFからepubに変換するウェブサ...
-
upc 7915と mc7915ctは互換性有...
-
ステージの背景画像のみ拡大縮...
-
ボタンのカウント数でムービー...
-
ActionScriptをつかってテキス...
-
[Start]を押すと始まるFlas...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FLASH 8 でバケツツールで上手...
-
MCを最背面に表示したい+ムー...
-
マウスオーバーで外部ファイル...
-
onClipEvent の enterFrameとlo...
-
マウスオーバーやクリック時に...
-
ステージの大きさをフィットさ...
-
FLASHでの色変更
-
ブラウザのサイズに合わせてオ...
-
photoshopで書いた四角の枠の中...
-
変数に256文字以上のテキストを...
-
VBAで改行の入ったデータの正規...
-
python ボタンを押すと複数の関...
-
VBScriptでMsgBoxのYesNoボック...
-
別のアプリケーションのテキス...
-
テキストボックスの中身をリセ...
-
五芒星は、悪魔崇拝とどういう...
-
テキストボックスにセルの値を...
-
static関数がmapファイルに載ら...
-
VB6.0 でメニューを作りたいん...
-
【VB.NET】別Formのボタンが押...
おすすめ情報