トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     イベントハンドラを関数に??
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
野中文雄
Åê¹ÆNo.32734
投稿日時: 2007-4-3 14:19
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
基本的に、その理解で結構だと思います。

ちなみに、いつもタイプが違えば等価とされない訳ではありません。けれど、データのタイプも意識して、スクリプトを書くことは大切です。なお、タイプまで厳密に比較したいときには、厳密な等価演算子===を使います。
var n = 1;
var n_str = "1";
trace(typeof n);
trace(typeof n_str);
trace(n == n_str);
trace(n === n_str);

引用:
pirottoさんは書きました:
以上の事よりタイプが違うものは同じものと認識されないということが分かりました。どこか間違って解釈しているところはあるでしょうか?

以下のドキュメントは、もう少し込入った別の内容を扱っています。ですから、データタイプの件をまずクリアしてから検討されるようお勧めしました。

テストの要領もおわかりになってきたでしょうから、いろいろと試してみてください。
引用:
一つ目は以前リンクを貼って頂いている「forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」の内容です。この箇所に関して完全に理解している分けではないのでしっくりきていません。ここはまだまだ勉強不足だと思うのでもう一度自分で読み返し、試行錯誤してみます。また、改めて質問させて頂くかもしれませんがよろしくおねがいします。

インスタンスの重ね順は、どうなっているでしょう?その順序を変えて、結果を確認してください。また、[パブリッ種設定]の[Flash]タブで、[ダウンロードの順序]を変更して、変化を確かめてみましょう。
引用:
二つ目は、以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。これでもスクリプト自体問題はないみたいですが、なぜだか分からずしっくりきません。これは無視して大丈夫なのでしょうか?


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

ひろゆき
Åê¹ÆNo.32733
投稿日時: 2007-4-3 8:34
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: イベントハンドラを関数に??
引用:
trace(hensuu == test_string);
 hensuuが文字列、test_stringも文字列で両方ともabout5になるため同じものという事になりtrueが出力される。

両方とも"about5"になるため...
と表現する方が良さそうな気がしますが。


一旦決着がついたのであれば、マルチポスト先にも、きちんとフィードバックを行ってください。


引用:
以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。

onEnterFrameの動作


----------------
質問する際は、回答者に具体的な情報を与えてください。

pirotto
Åê¹ÆNo.32732
投稿日時: 2007-4-3 6:58
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
前回記載頂いた内容、スクリプトについて理解できるようになったと思います。確認指せて下さい。

引用:

_root.about5 = test_mc;
trace(_root["about5"]);
hensuu = "about5";
test_string = "about5";
test_object = ["about5"];
trace(hensuu == test_string);
if (hensuu == test_string) {
trace(true);
} else {
trace(false);
}
trace(hensuu == test_object);
if (hensuu == test_object) {
trace(true);
} else {
trace(false);
}

_root.about5 = test_mc;
 変数test_object にはムービークリップtest_mcを代入する。
trace(_root["about5"]);
 about5 のパスが出力される。
hensuu = "about5";
 変数hensuu に文字列about5を代入。
test_string = "about5";
 変数test_string に文字列about5を代入。
test_object = ["about5"];
 変数test_object にオブジェクトabout5を代入
 ([]を用いているため配列の作成となりタイプがobjectになる。)
trace(hensuu == test_string);
 hensuuが文字列、test_stringも文字列で両方ともabout5になるため同じものという事になりtrueが出力される。
if (hensuu == test_string) {
trace(true);
} else {
trace(false);
}
 同様にif式が成立するためtrueが出力される。
trace(hensuu == test_object);
 hensuuが文字列でtest_objectがオブジェクトの為、同じものではなく、falseが出力される。
if (hensuu == test_object) {
trace(true);
} else {
trace(false);
}
 同様にif式が成立しないためfalseが出力される。
===================
以上の事よりタイプが違うものは同じものと認識されないということが分かりました。どこか間違って解釈しているところはあるでしょうか?
そこで、forを使った元のスクリプトを直したところ無事作動左折事が出来ました。

for (i=1; i<=16; i++) {
  this["item"+i].id = i;
  this["item"+i].onEnterFrame = function() {
    if (item !== "about"+this.id) {
//trace("about"+this.i);
      this.gotoAndStop("before");
    } else {
      this.gotoAndStop("after");
    }
  } 
};

しかし2点ほどあやふやなままの箇所があるので質問続けさせて下さい。
一つ目は以前リンクを貼って頂いている「forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」の内容です。この箇所に関して完全に理解している分けではないのでしっくりきていません。ここはまだまだ勉強不足だと思うのでもう一度自分で読み返し、試行錯誤してみます。また、改めて質問させて頂くかもしれませんがよろしくおねがいします。
二つ目は、以前書かせていただいた部分なのですが"about"+this.iのを出力すると順番がばらばらになっています。これでもスクリプト自体問題はないみたいですが、なぜだか分からずしっくりきません。これは無視して大丈夫なのでしょうか?
色々書いてしまい、長くなってしまいましたがよろしくお願い致します。
野中文雄
Åê¹ÆNo.32722
投稿日時: 2007-4-1 8:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
この件から得られる教訓は、「思い込み」は排して、「事実」を確かめるのが大切だということです。
引用:
pirottoさんは書きました:
文字から想像し『』の事ではないかと思い込んでいました。

先の回答に引用した「データ型の取得」に解説されている「typeof 演算子が返す文字列:実習」の「12」と「13」はお読みになり、ご自分でも試してご覧になりましたか?
引用:
"a""book"などがstringになるという事は理解できるがobject、movieclipがどういったものをさすのかが分からないという意味でした。

前述「12」の例を使ったとします。以下のtarce()ステートメントの出力は、すべて異なるはずです。
trace(test_mc);  // 出力: インスタンスのパス
trace(test_mc._name);  // 出力: インスタンス名
trace(typeof test_mc);  // 出力: データのタイプ

「インスタンスがない」というのが、(データあるいは値が)何も存在しないことを指すのであれば、「objectと出力される」ことはないはずです。どのような場合をいわれているのでしょう。
引用:
調べた範囲でインスタンス名をさすのかとも思ったのですが配列演算子をさすという事が分からず、インスタンスがない場合にもobjectと出力されるので混乱し、意味が分からないという表現になりました。

「インスタンス名」は指しませんし、「文字列と同じものが出力される」ことはありません。
引用:
ただ、インスタンス名を指すという事であれば文字列と同じものが出力されるので、今回の使用方法に関してはどちらでも使用できるのかと思い同じものとして理解していいのかという表現になりました。

単純に文字列と、その文字列が格納された配列をtrace()ステートメントで出力した場合には、確かに同じ「文字」が「表示」されます。しかし、「値」は異なりますし、「どちらでもいい」ことにはなりません。

つぎのスクリプトも、前述「12」の例を使ってお試しください。
_root.about5 = test_mc;
trace(_root["about5"]);
hensuu = "about5";
test_string = "about5";
test_object = ["about5"];
trace(hensuu == test_string);
if (hensuu == test_string) {
	trace(true);
} else {
	trace(false);
}
trace(hensuu == test_object);
if (hensuu == test_object) {
	trace(true);
} else {
	trace(false);
}

[ムービープレビュー]時に、併せて[デバッグ]メニューで[変数のリストアップ]を行い、各値がどのように異なるかを確認されるとよいでしょう。
引用:
if (hensuu ==
の後に続く値としてstringとobjectのどちらが適切かということが分かりません。出力して同じ値になるという事はどちらでもいいというふうに思えてしまいます。どういった違いがあるのかがわかりません。よろしくお願いします。


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

pirotto
Åê¹ÆNo.32721
投稿日時: 2007-4-1 7:31
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
ひろゆきさん、野中さん回答ありがとうございます。回答いただいた件、現段階で全て理解出来ているとは言えないと思いますが自分自身問題点を再確認したく返答させて下さい。

==機種依存文字==
文字から想像し『』の事ではないかと思い込んでいました。実際googleで検索もしたのですが『』だと思い込んでいたこともあり『』がなかったため(当然ですが)掲示板やメールによって違った解釈があるのかと思い、自分の書いた文と照らし合わせずに投げ出してしまっていました。本質問内容と直接は関係ないと思いそこまで真剣に調べようとしなかったのも事実だと思います。大変失礼なことをしてしまったと思っています。申し訳ございませんでした。

=本スクリプトに関して=
typeof演算子の出力についてですが同じように検索などによって調べてはみたのですがはっきりしませんでした。
"a""book"などがstringになるという事は理解できるがobject、movieclipがどういったものをさすのかが分からないという意味でした。調べた範囲でインスタンス名をさすのかとも思ったのですが配列演算子をさすという事が分からず、インスタンスがない場合にもobjectと出力されるので混乱し、意味が分からないという表現になりました。
ただ、インスタンス名を指すという事であれば文字列と同じものが出力されるので、今回の使用方法に関してはどちらでも使用できるのかと思い同じものとして理解していいのかという表現になりました。
今回、[b+i]、["about"+this.i]が配列の作成でobjectになるという事は理解できたのですが、
if (hensuu ==
の後に続く値としてstringとobjectのどちらが適切かということが分かりません。出力して同じ値になるという事はどちらでもいいというふうに思えてしまいます。変数に代入されているのが文字列なので同じように文字列を入れないといけないという事でしょうか?よろしくお願いします。
野中文雄
Åê¹ÆNo.32720
投稿日時: 2007-4-1 3:06
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
「機種依存文字」のリンク先は、現在も有効な別の解説ページに修正しました。ただ、スレッドの投稿内容をお読みになれば、どの文字を問題にしているかはおわかりになりませんでしたか?
引用:
kabosuさんは書きました:
 ?常に画面内を動き回っているMCが3つあってそれらのMCは自分で動かせる(ドラッグ&ドロップ)
 ?30秒間何もしないと強制的に全てのMCは画面下方に落下する。
 ?落下した状態で再びマウスを動かすと再び動き出す。

引用:
野中文雄は書きました:
機種依存文字は、プラットフォームが異なると、正しく表示されません。
引用:

あるいは、Googleで「機種依存文字」を検索してみただけで、情報はいくらでも見つかります。
引用:
pirottoさんは書きました:
すみません。機種依存文字についてリンクがなくなっておりよく分かりませんでした。『』←これのことでしょうか?

「タイプの意味」にしても、typeof演算子について、調べてご覧にはなったのでしょうか?

Flash ActionScript Helper「データ型の取得
Flash ActionScript 2.0入門ノート「データ型
引用:
記載頂いたスクリプトを確認したのですがタイプの意味がよく分かりません。
string1が文字列をさすんだろうとは思うのですが、object、movieclipがどういう意味なのかが分かりません。

「同じものと理解して」いけないことを示すために、typeof演算子による結果をご紹介したつもりです。もう1度繰り返しますが、「以下の意味は、理解されたでしょうか」?
引用:
野中文雄は書きました:
以下の意味は、理解されたでしょうか?説明は、先に引用した「ドット演算子と配列アクセス演算子」に書いてあるはずです。文字列の連結がよくわからないということでしたら、併せて「ストリング演算子」をお読みください。
引用:
野中文雄は書きました:
また、「[b+i]」は配列の作成になります。想像や山勘では、正しいスクリプトは書けません。

引用:
又、trace("about5")とtrace(["about5"])は両方同じ結果になるのですが、同じものと理解していいのでしょうか?色々調べて見たのですが明確な答えを自分で出すことが出来ませんでした。よろしくお願い致します。

上述のとおり「機種依存文字」でも「typeof演算子」でも、失礼ながら「色々調べて見た」成果が見受けられません。具体的に何をどう調べられて、何がおわかりになり、何が理解できなかったのでしょうか?→【いろいろ探しましたが見つかりませんでした


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

ひろゆき
Åê¹ÆNo.32719
投稿日時: 2007-4-1 2:20
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: イベントハンドラを関数に??
引用:
pirottoさんは書きました:
すみません。機種依存文字についてリンクがなくなっておりよく分かりませんでした。『』←これのことでしょうか?

機種依存文字に関する野中さんの投稿
時間経過によるアクション」の投稿No.12334
機種依存文字

引用:
記載頂いたスクリプトを確認したのですがタイプの意味がよく分かりません。
引用:
1. 複数の会議室、または複数のコミュニティサイトに、同じ質問を投稿することは、マルチポストと呼ばれるマナー違反行為ですのでおやめ下さい。
は、お読みになっておられるのでしょうか?

マルチポストはやめましょう


引用:
とりあえず下記スクリプトを書いて確認してみたところ_root["about5"]が不適切だという事はなんとなく分かったのですが、なぜかというのがいまいちあいまいです。

そもそも、このスクリプト自体、間違っている点があると思いますが。
hensuu = "about5";
trace(typeof ["about5"]);
trace(typeof "about5");
if (hensuu == _root["about5"]) {
	trace("同じ");
} else {
	trace("違う");
}

変数 hensuu に代入している値は、何ですか?
数値ですか?文字列ですか?オブジェクトですか?ムービークリップですか?


えー。どこまで理解されているのか分かりませんが。
新規flaファイルにて、以下のことを試されるべきでしょう
_root 上に、ムービークリップ(インスタンス名: my_mc) を配置。
_root 第1フレームに
a = 1;
trace(a);
trace(typeof a);

b = "test";
trace(b);
trace(typeof b);

c = [1, 2, 3];
trace(c);
trace(typeof c);

d = my_mc;
trace(d);
trace(typeof d);
と記述。ムービープレビューにて確認。


----------------
質問する際は、回答者に具体的な情報を与えてください。

pirotto
Åê¹ÆNo.32718
投稿日時: 2007-4-1 1:58
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
すみません。機種依存文字についてリンクがなくなっておりよく分かりませんでした。『』←これのことでしょうか?

おっしゃる通り理解出来ていませんでした。
記載頂いたスクリプトを確認したのですがタイプの意味がよく分かりません。
string1が文字列をさすんだろうとは思うのですが、object、movieclipがどういう意味なのかが分かりません。
とりあえず下記スクリプトを書いて確認してみたところ_root["about5"]が不適切だという事はなんとなく分かったのですが、なぜかというのがいまいちあいまいです。

hensuu = about5;
trace(["about5"]);
trace("about5");
trace(_root["about5"]);
if (hensuu=_root["about5"]) {
trace("同じ");
} else {
trace("違う");
}]

又、trace("about5")とtrace(["about5"])は両方同じ結果になるのですが、同じものと理解していいのでしょうか?色々調べて見たのですが明確な答えを自分で出すことが出来ませんでした。よろしくお願い致します。
野中文雄
Åê¹ÆNo.32712
投稿日時: 2007-3-31 4:41
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
まず、機種依存文字は使用を控えましょう。

つぎに、先のポストでもアドバイス差上げたとおり、MovieClipはひとつで(ただし変数iを使って)正しく動作させることが先決です。一度にすべてをやろうとしているため、"about"+this.iと["about"+this.i]、および_root["about"+this.i]の違いを理解されていないように見受けられます。
// フレームアクション
var i = 1;
_root.createEmptyMovieClip("about"+this.i, 1);
trace("about"+this.i);
trace(typeof "about"+this.i);
trace("=====");
trace(["about"+this.i]);
trace(typeof (["about"+this.i]));
trace("=====");
trace(_root["about"+this.i]);
trace(typeof _root["about"+this.i]);

引用:
pirottoさんは書きました:
シーン1同タイムライン上にムービークリップ『item1』?『item6』を配置しています。
...[中略]...
	//trace(["about"+this.i]);…(1)
	if (hensuu !== _root["about"+this.i]) {//(2)


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

pirotto
Åê¹ÆNo.32711
投稿日時: 2007-3-31 3:46
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
ひろゆきさん、野中さん回答ありがとうございます。又、ご指摘ごもっともだと思います。再度、回答、リンク先のページを熟読させて頂きました。一部理解した気になっているだけのところもあるかもしれませんが大筋は理解出来たと思います。結果、以下のように書き直したのですが正しく作動しません。説明不足かと思う点を補足しますと、
シーン1同タイムライン上にムービークリップ『item1』?『item6』を配置しています。それぞれのムービークリップに『onRelease』イベントで対応する数字の文字『about1』?『about6』がグローバル変数『hensuu』に代入されるようにしています。結果、『onRelease』が実行された以外のムービークリップはそのムービークリップ内のタイムラインを『before』にもっていきたいと思っています。
引用:

_global.hensuu = false;
i = 0;
for (i=1; i<=6; i++) {
 _root["item"+i].i = i;
 _root["item"+i].onEnterFrame = function() {
  //trace(["about"+this.i]);…?

   if (hensuu !== _root["about"+this.i]) {//?
     this.gotoAndStop("before");//?
   } else {
     this.gotoAndStop("after");
   }
 };
}


自分なりに思い当たる問題点があるのですが解決方法が分かりません。?を出力すると以下のように表示されました。
引用:

about1
about4
about3
about6
about5
about2

出力される数字の順番が1⇒4⇒3⇒6⇒5⇒2なのでムービークリップの『item1』?『item6』の数字に対応しないので正しく作動しないのかと考えました。たとえば『i=2』の時?は

hensuu == about4

になってしまい?の『gotoAndStop』が対応するのは『item2』になってしまうのではないかと思うのですが…。

確認の方法が分からず憶測なのでまったく別のところで間違えているかとも思うのですが。

説明が下手で説明不足もあるかも知れませが何かアドバイス頂ければ幸いです。よろしくお願い致します。
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops