高校三年生の合唱祭で何を歌いましたか?

フレーム間移動時に変数を保存しておく方法

Windows-XP、Flash8 で作業しています。

フレーム#1に下記の算式を作ってあります

a - b = c   h - i → j
d - e = f    k - l → m
c + f = g        n

この内 a b d e は「テキスト入力・変数名はそれぞれ a b d e 」に設定して、c f g h i j k l m n は「ダイナミックテキスト・変数名はそれぞれ「c f g …… n」と設定しました。
a~gで計算した結果をh~nに代入して「計算の控え」とします。

同じくフレーム#2には下記の算式を作りました。

a1 - b1 = c1   h1 - i1 → j1
d1 - e1 = f1    k1 - l1 → m1
c1 + f1 = g1         n1

a1~e1は「テキスト入力・変数名はそれぞれ a b d e 」、g1~n1は全て「ダイナミックテキスト・変数名はg1 h1 …n1」と設定します。そして、a1~g1で計算した結果は、フレーム#1のh~nでの各項目と「足し算」をして、フレーム#2のh1~n1に「累計額」として表示させます。

即ち、各フレームで「a~g」の計算をして、フレームが増えてゆく毎に前フレームの「a~g」欄を累積加算して「h~n」欄に累計を表示してゆくデータを作っています。

■フレームのスクリプトに、

a = b = d = e = "";

function Keisan() {
var a_num,b_num,d_num,e_num;

a_num = a = (a == "") ? 0 : getNumber(a);
b_num = b = (b == "") ? 0 : getNumber(b);
d_num = d = (d == "") ? 0 : getNumber(d);
e_num = e = (e == "") ? 0 : getNumber(e);

c = c_num = a_num - b_num;
f = f_num = d_num - e_num;
g = c_num + f_num;

return g;
}

function getNumber(val){
if(val.indexOf("<") > -1){
val = val.toUpperCase();
val = val.substring(val.indexOf('">',val.indexOf('KERNING')) + 2,val.lastIndexOf('</FONT'));
}

return Math.abs(val);
}

■それぞれの「=」にボタンスクリプトとして、
on(Release){
Keisan();
}

を書き込み、「a b d e」「a1 b1 d1 e1」が空欄時であっても「Nan」の出現を防ぐ処理をいたしました。

ところが、「フレーム#1 → フレーム#2」で「フレーム#2」のデータ作成後、「フレーム#1」に戻ると「フレーム#1」でのデータの内「a b d e」が消去されてしまいます。
フレームスクリプトでの「a = b = d = e = "";」が理由と思われますが、「フレーム#1」に戻った時でも「a b d e」のデータを残す必要があります。

【フレーム間移動時に変数を保存しておく方法】での処理が必要のようですが、その処理方法がわかりません。ご教授頂ければと思います。

A 回答 (1件)

> 「a = b = d = e = "";」が理由と思われますが、



ということでしたら,

a = b = d = e = "";

この部分↑を次のように↓変更すれば良いと思います。

//もし変数 stat_flag の値が未定義であれば
if (stat_flag == undefined) {
//変数 a,b,c,d の値を空白文字にして
a = b = d = e = "";
//変数 stat_flag の値を true にする
start_flag = true;
}


Flash Player 7 以上用 SWF をパブリッシュする場合
値を代入していない変数の値は「undefined」 になります。

※Flash Player 6 以下でも基本的には 「undefined」 ですが
 あえて計算などをしようとすると
 自動的に 0 または ""(空白文字列) として扱われます。



--- ちなみに ------------------

テキストフィールド の変数名は
Flash Player 4 用の SWF や Flash Lite 1.x 用の SWF をパブリッシュするときのみに使う機能(すごく古い機能)で,
それより後のバージョン用 SWF をパブリッシュする場合は 非推奨 になっています。
(簡単に言えば,通常はテキストフィールド に変数名を付けてはいけません。)

Flash Player 6 以上用の SWF をパブリッシュするときは
テキストフィールド には変数名を付けず,インスタンス名を付けて
テキストフィールド インスタンス.text でその値にアクセスするようにします。

・例1
//変数a_num に テキストフィールド a の値を代入
var a_num = Number(a.text);

・例2
//テキストフィールド a に変数a_num の値を表示
a.text = a_num;


※ Flash 8 のヘルプで
「変数名 ダイナミックテキスト」などと検索すると
上記に関する事項がたくさん出てきます。


※ ActionScript 3.0 などでは
var my_txt:TextField = new TextField();
のように
テキストフィールドに変数を当てて使うことが良くありますが
これは全く意味が違います。

ActionScript 3.0 などでの変数は
テキストフィールドインスタンスを参照する変数であって
テキストフィールド内に示された値の入れ物ではありません。

ActionScript 1.0(通常) でも 2.0 でも 3.0 でも
「テキストフィールド」は「インスタンス」として扱うべきものです。
その「テキストフィールドインスタンス」の「text」プロパティが
テキストフィールドに表示されている文字列プロパティです。
「フレーム間移動時に変数を保存しておく方法」の回答画像1
    • good
    • 0
この回答へのお礼

ご連絡とお礼が遅れまして大変失礼いたしました。

>if (stat_flag == undefined) {

以下を追加したスクリプトでフレーム間の移動に伴うデータの抹消が解消されました。
実際のデータ画面では、「フレーム間移動」を行うデータが複数ありましたので、当初「stat_flag」一本で処理をしていて混乱いたしました。データ各一つに対して「stat_flag」に「stat_flag01」「stat_flag02」「…」としましたら、全部に対応してくれました。(実はここに至までに時間が必要だったのですが、)

ご親切な解説共々大変有難うございました。利用させていただきます。

お礼日時:2010/10/15 18:23

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


おすすめ情報