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

こんばんは。pmpmpm5と申します。
質問集で検索しましたが、同じ質問がヒットしなかったので
今回質問させていただきます。

FlashMXを使用しアクションスクリプトで
「日替わりでちがうテキストを読み込む」方法を探しています。

以下、実際のスクリプトです。
■ダイナミックテキスト(変数名:test)を含む
ムービークリップ(インスタンス名box)をメインフレームに配置
■メインフレームにフレームアクション
myDate = new Date();
Month = myDate.getMonth()+1;
Date = myDate.getDate();
message = "m"+ Month +"d"+Date;
■boxのクリップアクション
onClipEvent (load) {
this.loadVariables ("days.txt");
}
onClipEvent (data) {
//this.test = m12d22;
this.test = this[message];
■外部テキスト(days.txt)
m12d22=今日は2月12日です。
m2d13=今日は2月13日です。

このように組み込んだのですが、ダイナミックテキストには
「今日は〇月〇日です。」という文字列が読み込まれず
困っています。
どうか、ご指導お願いいたします。

A 回答 (1件)

まずテキストのデータ形式ですが,


ご質問のテキストデータやスクリプトを見る限り,
勝手に「改行」を「データの区切り」と決めていらっしゃいますね。
どこにもそんなルールはありませんよ。

もしそうしたいのでしたら
「改行コードがデータの区切りである」
という定義をするためのややこしいスクリプトが必要になります。

普通はそういうものは定義しません。
Flashのルール通り「&」をデータ区切りとします。
Google や Yahoo! などで何かを検索したとき,
URLアドレス欄に見える URLクエリ と同じルールです。

変数名A=値A&変数名B=値B&変数名C=値C …

これが Flash で外部テキストデータを扱うとき,
1つのファイル内に複数の変数と値を入れる基本ルールです。

しかし,
これではデータが横にひたすら長くなるので人間が読み書きしにくいです。
改行を入れれば良いのですが,
単に改行を入れだけでは「改行コード」までが 変数名 または 値 に混入してしまいます。
そこで改行コードをデータとして無視されるように改行前後に「&」を入れます。

ですから一般的には次のようなデータ形式にします。

変数名A=値A&
&変数名B=値B&
&変数名C=値C&


具体例は次のような感じにするということです。

m12d22=今日は12月22日です。&
&m12d23=今日は12月23日です。&
&m12d24=今日は12月24日です。

ややこしいと思われる場合は,
最初と最後にも「&」を入れても良いです。

&m12d22=今日は12月22日です。&
&m12d23=今日は12月23日です。&
&m12d24=今日は12月24日です。&


*********

外部テキストの文字コードに関してですが,
スクリプト中に次の1行が見当たりません。

System.useCodepage = true;

この1行をメインのフレーム1の最初辺りに入れておくと,
外部テキストが Shift-JIS として解釈されます。
入れておかない場合は,
自動的に UTF-8 として解釈されます。

これは FlashPlayer6 以上用の SWF をパブリッシュする場合の仕様変更でこうなりました。
Flash MX では FlashPlayer6 用の SWF をパブリッシュするのがデフォルト設定ですからこの点が要注意です。


*********

ターゲットパスに関してですが,これがうまく行かない第一原因です。
まず確認です。
階層などは次のようになっているのですよね。

 _root ←myDate = new… を書いた
  └box ←onClipEvent (load)… を書いた
    └ テキストフィールド変数名「test」

このようになっているのだとすると,次のの1行ではうまく行きません。

this.test = this[message];

これだと,
ムービークリップbox 内にある変数 message を参照してしまいます。
message はムービークリップにある変数ではなくて _root にあるはずです。
したがって,次のように変更する必要があります。

this.test = this[_root.message];
または
this.test = this[_parent.message];

これでうまく行くはずです。



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

以下はうまく行く行かないではなくて,好ましくない箇所の指摘です。

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

1つめ

Date = myDate.getDate();

変数 Date が Dateオブジェクト(クラス名)とかぶっています。
例えば date_num のような変数名にする方が良いです。

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

2つめ

テキストフィールドに変数名を付けるのは,Flash Player 5 までの仕様で,
Flash Player 6 以降の SWF をパブリッシュする場合は非推奨の事項になっています。

Flash Player 6 以上用の SWF をパブリッシュする場合は,
テキストフィールドに変数名は付けずに,「インスタンス名」を付けて,
その text プロパティ や htmlText プロパティに値を代入するようにします。

したがって,ご質問の場合は,
box の中にあるダイナミックテキストの変数名 test を消して,
その ダイナミックテキスト に test というようなインスタンス名を付けるようにします。

こうした場合,
ムービークリップに書いた onClipEvent (data) {} は次のように変更する必要があります。

onClipEvent (data) {
this.test.text = this[_root.message];
}


*********

ダイナミックテキスト に変数名を付けた場合は,
自動的にその変数名の値が表示されますが,
上のようにダイナミックテキストインスタンス名のみを付けた場合は,
自動的に値は表示されません。
したがって必ず
○○.text = △△
のように ActionScript で値を代入する必要があります。

ご質問の場合は,
たまたまムービークリップの中にテキストフィールドがあるから良いのですが,
テキストフィールドは_rootの直下にあるかもしれません。

その場合は onClipEvent (data) {} は使えないか,
これを強引に使う場合,わざわざムービークリップを作成しなければならなくなります。

これは変です。
変ですし使い勝手が悪いです。
そこで登場したのが LoadVarsオブジェクト です。


この LoadVars について補足します。
ご質問のスクリプトを LoadVarsオブジェクト を使って書き替えてみます。

まず,ムービークリップに書いた
onClipEvent (load) {
this.loadVariables("days.txt");
}
onClipEvent (data) {
this.test.text = this[_root.message];
}
のようなスクリプトを全て消します。
そして _root のフレームのスクリプトを次のように書き替えます。

----------------------------------------
myDate = new Date();
month_num = myDate.getMonth()+1;
date_num = myDate.getDate();
message = "m"+month_num+"d"+date_num;
//
// 外部テキストの文字コードが Shift-JIS の場合は入れる
//System.useCodepage = true;
//
// LoadVarsオブジェクトを作成
myVars = new LoadVars();
//
// myVars に外部テキストがロードされたときの動作を定義
myVars.onLoad = function(Seikou) {
// ロードに成功したら
if (Seikou) {
// box 内の test に外部テキストの変数 message の値を表示
box.test.text = myVars[message];
// ロードに失敗したら
} else {
// box 内の test に「ロード失敗」を表示
box.test.text = "ロード失敗";
}
};
//
// myVars に外部テキストを ロード
myVars.load("days.txt");

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


FlashMXではこのような感じにするのが普通です。
これだと _root にインスタンス名だけを付けたダイナミックテキストがあった場合でも,
それと無関係なムービークリップを作成せずに済みます。
また 全てのスクリプトがフレームに書けるため一目瞭然になります。
また message の参照もこの階層で良くなりますからややこしくありません。
さらに ロードエラー も拾えます。

絶対このように LoadVars を使用した方が良いというわけではありません。
適材適所ですがこのような書き方にすると楽ではないかと思いましたので補足させていただきました。
    • good
    • 0
この回答へのお礼

BlurFiltanさん、こんばんは初めまして。
この度は素早い返答と的確なアドバイスをありがとうございました。
お返事が遅くなってしまいましたが、早速アドバイス通りスクリプトを修正してみたところ、問題なくテキストを読み込むことができました。本当にありがとうございます。
足りない点がたくさんある中、わかりやすい説明をありがとうございました。LoadVarsも初めて耳にする単語でしたが、このようなスクリプトの記述の仕方もあるのですね。大変勉強になりました。
困り果てていたので本当に助かりました!ありがとうございました!

お礼日時:2008/12/24 18:12

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