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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     インスタンス名の取得
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
egoma
Åê¹ÆNo.3189
投稿日時: 2004-1-28 15:39
新米
居住地:
投稿: 6
使用環境:
OS Win2000
Flash MX 2004 Professional
インスタンス名の取得
作成したムービークリップ内のダイナミックテキストの値を取得したいのですが・・・取得できないでいます。

外部から取得したデータを複数のダイナミックテキストを持つムービークリップに渡し、
このムービークリップの中でそれぞれのダイナミックテキストにデータをセットしています。

さらに、このムービークリップをメインのタイムラインでduplicateMovieClip()を使って複製しています。

この複数表示されたムービークリップ上のダイナミックテキストをクリックしたときに、
そのダイナミックテキストの値をメインのアクションスクリプトで下記のように取得しようと思うのですが、

クリックしたムービークリップのインスタンス名.ダイナミックテキストインスタンス名.text

どのように、その複製したムービークリップのインスタンス名を取得したらよいのかわかりません。

また、どのようにイベントハンドラを記述すればよいのでしょうか?


具体的には
ダイナミックテキストを複数用意しそれぞれインスタンス名を「text1」「text2」「text3」と名付けました。

この三つのダイナミックテキストをひとつのムービークリップとして
「Movie1」とインスタンス名を付けてひとつのオブジェクトとして作成しました。

これをコンポーネント化して、(#initclip,#endinitclip,Object.registerClass()メソッドを利用)
このムービークリップのsetData()メソッドの中で「text1」「text2」「text3」に
データをセットしています。

メインのActionScriptでは
for文をまわして下記のように複製してムービークリップにデータを渡して表示しています。
Sample = Movie1.duplicateMovieClip( "movie"+i, 100 + i);
Sample = setData(deta[it]);

です。

よろしくお願いいたします。
森 なおき
Åê¹ÆNo.3194
投稿日時: 2004-1-28 17:21
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: インスタンス名の取得
なおきです。

とりあえずややこしいことはさておき(^^;
普通にそのムービークリップの中にtrace(this);
ってな感じで書いて、調べてみてはどうでしょう?

タイトルがインスタンス名の取得で、
中身がダイナミックの取得になってたので
ちょっと迷いましたが。


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

森 なおき
Åê¹ÆNo.3234
投稿日時: 2004-1-29 3:56
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: インスタンス名の取得
なおきです。追伸&初心者の部屋から移動です。

ちょっと時間があったので見返してみたのですが
Sample = Movie1.duplicateMovieClip( "movie"+i, 100 + i);
で、Sampleに戻り値を取得していますよね?
ここに格納される値がムービークリップへの参照になります。
ですので、例えばその中のtext1の文字列へのパスは
Sample.text1.textで良いことになります。

それとSample = setData(deta[it]);ってのはちょっと
引っかかるのですがどういう処理でしょう(^^;


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

野中文雄
Åê¹ÆNo.3239
投稿日時: 2004-1-29 7:12
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: インスタンス名の取得
まず、問題の切分けをしてください。
引用:
egomaさんは書きました:
作成したムービークリップ内のダイナミックテキストの値を取得したいのですが・・・取得できないでいます。

複製したMovieClipのインスタンス名は、MovieClip.duplicateMovieClip()メソッドの第1引数に指定しているはずですが...
引用:
クリックしたムービークリップのインスタンス名.ダイナミックテキストインスタンス名.text

どのように、その複製したムービークリップのインスタンス名を取得したらよいのかわかりません。

MovieClipインスタンスのクリックを受取るイベントハンドラは、on (release)ハンドラかMovieClip.onReleaseメソッドで指定します。

そのインスタンスのパスは、ハンドラ内のthisで参照できます。インスタンス名は、MovieClip._nameプロパティで取得します。
引用:
また、どのようにイベントハンドラを記述すればよいのでしょうか?

コンポーネントにクラス定義するには、インスタンスの生成やそのタイミングなど、オブジェクトインスタンスの扱いに関する高度な知識を必要とするはずです。上記のご質問とのチグハグさを感じます。

#「デミグラスソースはつくったのですが、ハンバーグの焼き方がわかりません」
#という感じです。そこまで本格的な料理をやるのに、なぜ焼き方がわからない?
引用:
これをコンポーネント化して、(#initclip,#endinitclip,Object.registerClass()メソッドを利用)
このムービークリップのsetData()メソッドの中で「text1」「text2」「text3」に
データをセットしています。

setData()は、ムービークリップシンボルに定義したメソッドといわれていませんでしたか? 以下のスクリプトでは、タイムライン上に関数が定義されているように見受けられます。それとも、このスクリプト自体が、ムービークリップのクラス定義に記述されているのでしょうか?

いずれにしても、第1ステートメントで取得している複製されたインスタンスのパスが、第2ステートメントで上書きされて破棄される結果になるはずです。それとも、Sample.setData(deta[it]);の誤りでしょうか?
Sample = Movie1.duplicateMovieClip( "movie"+i, 100 + i);
Sample = setData(deta[it]);


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

egoma
Åê¹ÆNo.3263
投稿日時: 2004-1-29 14:24
新米
居住地:
投稿: 6
使用環境:
OS Win2000
Flash MX 2004 Professional
Re: インスタンス名の取得
皆様
ありがとうございます。

申し訳ありません。
MovieClipインスタンスのクリックを受け取るイベントハンドラをonClipEvent(mouseDown)としていて、
クリックすると複製したMovieClipのインスタンス名を全て取得するので取れないと思ってしまいました。

なおきさんのtrace(this)で表示して調べてみればのご意見に、
やってみたけど・・と思いながら、見直してみて気づきました。

それと
Sample = setData(data[it]);
はご指摘のとおり
Sample.setData(data[it]);
の誤りです。

お恥ずかしい限りです。

on(relese){
trace(this._name);
v = this.text1.text;
}
でダイナミックテキストの値を取得できました。

引き続き質問なのですが、
いま、MovieClip上をクリックして、そのMovieClipのtext1の値を取得できましたが,

MovieClipのtext1をクリックしたらAの処理
MovieClipのtext2をクリックしたらBの処理

というようにする場合は
MovieClipのtext1をクリックしたという:MovieClipのインスタンスのtext1のインスタンスのクリックを受け取るイベントハンドラ
はどのように指定するのでしょうか?


またまた、ハンバーグの作り方をお聞きしているのかもしれませんが
よろしくお願いいたします。

皆様の素早いご回答に感謝いたします。


youich
Åê¹ÆNo.3284
投稿日時: 2004-1-29 21:14
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: インスタンス名の取得
引用:

MovieClipのtext1をクリックしたという:MovieClipのインスタンスのtext1のインスタンスのクリックを受け取るイベントハンドラ
はどのように指定するのでしょうか?

2004のtextFieldってクリックイベント起こします?
textFieldをmovieClipでくるんでそのムービークリップでイベントをひろうのが
簡単なんじゃないでしょうか?

しかしTextFiled._xmouseや_ymouseっていうのがあるから、
これをクリックの判断に使うのもできそうですね、、ちょっとぶさいくやけど(^^;

class ClickableText extends MovieClip{
    
    var text1,text2,text3:TextField;
    var dispatchTable:Array = ['methodA','methodB','methodC'];
    var fields:Array;
    
    public function ClickableText(){
        fields = [text1,text2,text3];
    }

    public function setData(arr:Array){
        for(var i:Number = 0;i<fields.length;i++){
            fields[it].text = arr[it];
        }
    }
    
    public function onMouseDown(){
        if(!this.hitTest(_root._xmouse,_root._ymouse,true)) return;
        
        var te:TextField;
        for(var i:Number=0;i<fields.length;i++){
            te = fields[it];
            if(te._xmouse>0 && te._xmouse<te.textWidth &&
                te._ymouse>0 && te._ymouse<te.textHeight){
                dispatch(i,te.text);
            }
        }
    }
    function dispatch(i:Number,s:String){
        var methodName:String = dispatchTable[it];
        this[methodName].apply(this,[s]);
    }
    function methodA(s:String){
        trace("MethodA invoke: "+s);
    }
    function methodB(s:String){
        trace("MethodB invoke: "+s);
    }
    function methodC(s:String){
        trace("MethodC invoke: "+s);
    }
}


----------------
- yo

野中文雄
Åê¹ÆNo.3287
投稿日時: 2004-1-29 23:15
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: インスタンス名の取得
MX 2004でも、TextFieldにはマウスイベントハンドラは実装されていません。

「ActionScript辞書」のTextFieldクラスで確認しましょう。>egomaさん
引用:
youichさんは書きました:
2004のtextFieldってクリックイベント起こします?

イベントを取得したければ、それが可能なシンボルで包むというのがFlashの定石ですね。
引用:
textFieldをmovieClipでくるんでそのムービークリップでイベントをひろうのが

簡単なんじゃないでしょうか?

よくわからないですが、ムービークリップシンボルの第1フレームアクションにはクラス定義してあるようですので、MovieClipアクションでスクリプトを作成してみました。
// MovieClip: TextFieldインスタンスのクリックを取得する
// MovieClipアクション
// TextFieldインスタンスtext1、text2、text3を配置
onClipEvent (load) {
	// TextFieldインスタンスの配列
	var text1:TextField, text2:TextField, text3:TextField;
	var texts_array:Array = [text1, text2, text3];
	// TextFieldインスタンスの領域
	var areas_array:Array = xSetTextArea(texts_array);
	function xSetTextArea(texts_array) {
		var areas_array:Array = new Array();
		for (var i = 0; i<texts_array.length; ++i) {
			var my_txt = texts_array[it];
			var nX = my_txt._x;
			var nY = my_txt._y;
			areas_array[it] = [nX, nY, nX+my_txt._width, nY+my_txt._height];
		}
		return areas_array;
	}
	// TextFieldインスタンスとの重なり判定
	function xHitTextTest(nX, nY) {
		for (var i = 0; i<areas_array.length; ++i) {
			var area_array = areas_array[it];
			if (area_array[0]<nX) {
				if (area_array[1]<nY) {
					if (nX<area_array[2]) {
						if (nY<area_array[3]) {
							return texts_array[it];
						}
					}
				}
			}
		}
		return false;
	}
}
on (release) {
	trace(this.xHitTextTest(_xmouse, _ymouse));  // テスト用
}


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

egoma
Åê¹ÆNo.3315
投稿日時: 2004-1-30 11:22
新米
居住地:
投稿: 6
使用環境:
OS Win2000
Flash MX 2004 Professional
Re: インスタンス名の取得
できました!!
ありがとうございます。

「ActionScript辞書」で確認しました。
マウスイベントハンドラは無いですね。

なんとなく、TextFieldをシンボル化するのかなぁと思っていたのですが、
テキストをシンボル化するのも・・と考えていました。

なるほど。
配列演算子を使うとインスタンスもオブジェクトも持てますし
x_mouse,ymouseを使って、判断するのですね。
ActionScriptの幅が広がりました。
なんだか、動かして楽しくなりました。

TextFieldをシンボル化してイベントをひろう方法もできました。

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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