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

パスワード:


パスワード紛失

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

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
pirotto
Åê¹ÆNo.32691
投稿日時: 2007-3-30 8:51
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
イベントハンドラを関数に??
以下のようなイベントハンドラを使った命令があります。

this.item1.onEnterFrame = function() {
 if (item !== "about1") {
  this.gotoAndStop("before");
 } else {
  this.gotoAndStop("after");
 }
};

この命令文の1行目『item1』と2行目『about1』となっているところが、『item2』『item3』…、『about2』『about3』…、という風に数字だけ変わる命令文が14個あります。関数を使ってなんとか1つの命令文に出来ないものかと思うのですが。考えうる範囲で以下のように書いてみたのですが、自動フォーマットの時点でエラーになってしまうのでまったくお手上げ状態です。どう直せばいいのでしょうか?それとも全く書き方が間違っているんでしょうか?よろしくお願い致します。

function sentaku(a, b) {
 i = 0;
 for (i=1; i<=14; i++) {
  _root[a+i].on (enterFrame){
   if(item !== [b+i]) {
    this.gotoAndStop("before");
   } else {
    this.gotoAndStop("after");
   }
  }
 }
}

sentaku("item","about")

単純なものしか書いた事がないのでパスなど細かい間違いも多いかもしれませんがよろしくお願い致します。
野中文雄
Åê¹ÆNo.32692
投稿日時: 2007-3-30 9:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
残念ながら、「全く書き方が間違って」います。

「私はアメリカに行きたいです」を、英語で"I America to go want"と書いたようなものです。「自動フォーマットの時点でエラー」になるのは、文法的に間違っているからです。

「on (enterFrame)」というのは、リファレンスのどこに掲載されていましたか? また、「[b+i]」は配列の作成になります。想像や山勘では、正しいスクリプトは書けません。

取りあえず、以下をご参照ください。

コードをシンプルに
forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する
ドット演算子と配列アクセス演算子
引用:
pirottoさんは書きました:
考えうる範囲で以下のように書いてみたのですが、自動フォーマットの時点でエラーになってしまうのでまったくお手上げ状態です。どう直せばいいのでしょうか?それとも全く書き方が間違っているんでしょうか?よろしくお願い致します。
function sentaku(a, b) {
	i = 0;
	for (i=1; i<=6; i++) {
		_root[a+i].on (enterFrame){
			if(item !== [b+i]) {
				this.gotoAndStop("before");
			} else {
				this.gotoAndStop("after");
			}
		}
	}
}

sentaku("item","about")


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

pirotto
Åê¹ÆNo.32693
投稿日時: 2007-3-30 11:25
新米
居住地:
投稿: 8
使用環境:
WinXP,Flash8Professonal
Re: イベントハンドラを関数に??
質問者です。野中さん返信ありがとうございます。自分の無知を痛感しました;
・・・で教えて頂いた引用を参考にもう一度作り直してみました。フォーマットエラーは出なくなったのですがやはり動きません。

i = 0;
for (i=1; i<=14; i++) {
this["item"+i].onEnterFrame = function() {
if (hensuu !== ["about"+i]) {
this.gotoAndStop("before");
} else {
this.gotoAndStop("after");
}
};
}

補足:
4行目if文の後ろの()内にある『hensuu』はグローバル変数です。

『before』『after』はムービークリップ『item1』…『item14』の1フレーム、2フレームにつけたラベルです。

この文はシーン1のフレームに書きました。『item1』…『item14』はムービークリップで同一フレーム、別レイヤーに置いています。

シーン1に置かれた色々なムービークリップのonReleaseイベントによってグローバル変数に『about1』…『about14』を代入しそれによって『item』ムービークリップのフレームを移動させたいと考えています。

forを使わずに分けて14個書くと全て動くのですが…。for文にすると相対パスが変わったりするんでしょうか??
それと気になるのは4行目forを使ってない文だと
if (hensuu !== "about1") {
という文なんですが"about1"は["about"+i]でいいのか不安です。
よろしくお願いします。
ひろゆき
Åê¹ÆNo.32695
投稿日時: 2007-3-30 11:55
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: イベントハンドラを関数に??
14個で試そうとすると、訳が分からなくなるように思います。
まず、2個くらいで試してみては?

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

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

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

ムービープレビューで何と出力されるでしょう?


また、リンク先の記事については、流し読みをするだけでなく、
何度も読み返す必要があると思いますが。


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

野中文雄
Åê¹ÆNo.32696
投稿日時: 2007-3-30 13:05
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラを関数に??
以下の意味は、理解されたでしょうか?説明は、先に引用した「ドット演算子と配列アクセス演算子」に書いてあるはずです。文字列の連結がよくわからないということでしたら、併せて「ストリング演算子」をお読みください。
引用:
野中文雄は書きました:
また、「[b+i]」は配列の作成になります。想像や山勘では、正しいスクリプトは書けません。

アクセル・ブレーキ・クラッチの機能を「理解」せず、単に操作の順番だけ「見よう見まね」でドライブして、たまたま車が走ったとしても、それは運転できたことにはなりません。それどころか、危険でさえあります。
引用:
pirottoさんは書きました:
それと気になるのは4行目forを使ってない文だと
if (hensuu !== "about1") {
という文なんですが"about1"は["about"+i]でいいのか不安です。
よろしくお願いします。

確実に理解するためには、問題を単純化すべきです。
var i = 1;
var hensuu = "about1";
// for (i=1; i<=14; i++) {
this["item"+i].onEnterFrame = function() {
	// if (hensuu !== ["about"+i]) {
	trace(hensuu == ["about"+i]);
	trace([hensuu, typeof hensuu]);
	trace([["about"+i], typeof (["about"+i])]);
	delete this.onEnterFrame;
	// ...[後略]...
};

まずこの点がおわかりになってから、ひろゆきさんの回答や私が引用した他のふたつのリンク先の内容を、再度よく読まれるとよいでしょう。


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

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』になってしまうのではないかと思うのですが…。

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

説明が下手で説明不足もあるかも知れませが何かアドバイス頂ければ幸いです。よろしくお願い致します。
野中文雄
Åê¹Æ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.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.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);
と記述。ムービープレビューにて確認。


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

野中文雄
Åê¹Æ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演算子」でも、失礼ながら「色々調べて見た」成果が見受けられません。具体的に何をどう調べられて、何がおわかりになり、何が理解できなかったのでしょうか?→【いろいろ探しましたが見つかりませんでした


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

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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