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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     createObject で作成したオブジェクトに対する _alpha の設定
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
taka1206
Åê¹ÆNo.28724
投稿日時: 2006-9-14 21:16
半人前
居住地:
投稿: 32
使用環境:
OS:Windows2000 SP4
FLASH 8 Pro
createObject で作成したオブジェクトに対する _alpha の設定
以下の状況で、ボタンに対する _alpha の設定ができません。

1. button コンポーネントをステージに配置して削除する。
2. シェイプを描画してそれをボタンにシンボル変換し、org_btn という識別子でリンケージを設定する。
3. 以下のスクリプトをフレーム1に記述して実行する。

import mx.controls.Button;
 
// 前半部分
_root.createObject("org_btn", "aaa", 200);
_root["aaa"]._x = 100;
_root["aaa"]._y = 250;
_root["aaa"]._alpha = 80;
_root["aaa"].onRollOver = function(){
		trace("aaa" + _root["aaa"]._alpha);
	if ( _root["aaa"]._alpha == 0 ){
		_root["aaa"]._alpha = 100;
	}else{
		_root["aaa"]._alpha = 0;
	}
}
 
// 後半部分
for( var i:Number = 0; i<= 1;i++){
	_root.createObject("org_btn", "aaa" + i, i);
	_root["aaa" + i]._x = 150 * i;
	_root["aaa" + i]._y = 100;
	_root["aaa" + i]._alpha = 50;
	_root["aaa" + i].onRollOver = function(){
		trace("aaa" + _root["aaa" + i]._alpha);
		if ( _root["aaa" + i]._alpha == 0 ){
			_root["aaa" + i]._alpha = 100;
		}else{
			_root["aaa" + i]._alpha = 0;
		}
	}
}
 

そうすると、前半部分で作成したオブジェクトは rollover時に _alpha の設定が変わるのですが、
後半部分で作成したオブジェクトは _alpha の設定が変わりません。
(trace で _alphaを表示すると undefined となってしまいます)

この原因についてご教示いただけないでしょうか?
野中文雄
Åê¹ÆNo.28726
投稿日時: 2006-9-14 21:40
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: createObject で作成したオブジェクトに対する _alpha の設定
forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」をお読みください。
引用:
taka1206さんは書きました:
以下の状況で、ボタンに対する _alpha の設定ができません。

1. button コンポーネントをステージに配置して削除する。
2. シェイプを描画してそれをボタンにシンボル変換し、org_btn という識別子でリンケージを設定する。
3. 以下のスクリプトをフレーム1に記述して実行する。
...[中略]...
for( var i:Number = 0; i<= 1;i++){
	_root.createObject("org_btn", "aaa" + i, i);
	_root["aaa" + i]._x = 150 * i;
	_root["aaa" + i]._y = 100;
	_root["aaa" + i]._alpha = 50;
	_root["aaa" + i].onRollOver = function(){
		trace("aaa" + _root["aaa" + i]._alpha);
		trace([this, i, _root["aaa"+i]]);
		if ( _root["aaa" + i]._alpha == 0 ){
			_root["aaa" + i]._alpha = 100;
		}else{
			_root["aaa" + i]._alpha = 0;
		}
	}
}


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

ひろゆき
Åê¹ÆNo.28732
投稿日時: 2006-9-15 2:28
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: createObject で作成したオブジェクトに対する _alpha の設定
createObject の返り値this を活用すると、
こんな感じにもできると思います。
import mx.controls.Button;
 
var aaa:Button = this.createObject("org_btn", "aaa", 200);
aaa._x = 100;
aaa._y = 250;
aaa._alpha = 80;
aaa.onRollOver = function():Void {
	if (this._alpha == 0) {
		this._alpha = 100;
	}else{
		this._alpha = 0;
	}
}

for(var i:Number = 0; i <= 1; i++) {
	var _btn:Button = this.createObject("org_btn", "aaa"+i, i);
	_btn._x = 150*i;
	_btn._y = 100;
	_btn._alpha = 50;
	_btn.onRollOver = function():Void {
		if (this._alpha == 0) {
			this._alpha = 100;
		}else{
			this._alpha = 0;
		}
	}
}


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

taka1206
Åê¹ÆNo.28737
投稿日時: 2006-9-15 10:42
半人前
居住地:
投稿: 32
使用環境:
OS:Windows2000 SP4
FLASH 8 Pro
Re: createObject で作成したオブジェクトに対する _alpha の設定
野中さん、ひろゆきさん
早速のご回答ありがとうございます。

お二人に提示してただいた方法、両方とも希望通りの動きをすることを確認できました。

イベントハンドラで設定した関数は、1フレーム実行時に展開されるのかと思っていましたが、
イベントが起こった時点でそのファンクションが実行され、その時点での変数を参照するのですね。

野中さんの書かれているサイトも読ませていただき、
大変丁寧な説明で、よく理解できました。

ありがとうございます!

今後ともよろしくお願いいたします。
野中文雄
Åê¹ÆNo.28742
投稿日時: 2006-9-15 13:39
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: createObject で作成したオブジェクトに対する _alpha の設定
末節の話題になりますけど。UIObject.createObject()メソッドの戻り値は、MovieClipデータ型ですね。ただ、タイムラインに記述すると、ターゲットをthisでなく型指定したインスタンスにしても、型チェックが利かないようです。
// フレームアクション
import mx.core.UIObject;
import mx.controls.Button;
var _mc:MovieClip = this.createEmptyMovieClip("holder_mc", 1);
var _btn:Array = _mc.createObject("Button", "_btn", 1);  // エラーなし

クラス定義した場合には、型チェックが機能しますので、キャストするかMovieClip型で指定する必要があるでしょう。
// ActionScript 2.0クラス定義ファイル: TestCreateObject.as
import mx.core.UIObject;
class TestCreateObject extends UIObject {
	var _btn:mx.controls.Button;
	// var _mc:MovieClip;
	function TestCreateObject() {
		_btn = mx.controls.Button(this.createObject("Button", "my_btn", 1));
		// _mc = this.createObject("Button", "my_btn", 1);
	}
}

引用:
ひろゆきさんは書きました:
createObject の返り値this を活用すると、
こんな感じにもできると思います。
import mx.controls.Button;
 
var aaa:Button = this.createObject("org_btn", "aaa", 200);

あと、ご質問は解決したようですので、素朴な疑問ですけど。

Buttonコンポーネントのリンケージ識別子は、何か特別なことをやっていないかぎり、"Button"のはずですね。それとも、mx.controls.Buttonクラスを継承して、そのクラスをMovieClipシンボルに設定したのでしょうか。

「ボタンにシンボル変換し」とあるのは、まさか「ボタンシンボル」を作成して、それをダイナミックに配置しているというのではありませんよね(やってみたら、できるにはできましたが)。


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

taka1206
Åê¹ÆNo.28746
投稿日時: 2006-9-15 17:20
半人前
居住地:
投稿: 32
使用環境:
OS:Windows2000 SP4
FLASH 8 Pro
Re: createObject で作成したオブジェクトに対する _alpha の設定
引用:

野中文雄さんは書きました:
あと、ご質問は解決したようですので、素朴な疑問ですけど。

Buttonコンポーネントのリンケージ識別子は、何か特別なことをやっていないかぎり、"Button"のはずですね。それとも、mx.controls.Buttonクラスを継承して、そのクラスをMovieClipシンボルに設定したのでしょうか。

「ボタンにシンボル変換し」とあるのは、まさか「ボタンシンボル」を作成して、それをダイナミックに配置しているというのではありませんよね(やってみたら、できるにはできましたが)。


そのまさかの方法でやっております。

リンケージ識別子について、あまり理解できていないのかもしれませんが、
リンケージ識別子は、作成したオブジェクトを参照するための名前だけの意味かと思っています。

もし、お時間があればで構わないのですが、参考になるサイトがあれば教えていただけますでしょうか。
野中文雄
Åê¹ÆNo.28964
投稿日時: 2006-9-27 15:51
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: createObject で作成したオブジェクトに対する _alpha の設定
action scriptでボタンシンボルにアクセスできますか?」の投稿で、忘れていたことを思い出しました。

UIObject.createObject()メソッドは、内部的にMovieClip.attachMovie()メソッドを呼んでおり、その戻り値もMovieClipです。したがって、Buttonインスタンスに対して正規にサポートされる動作かどうかは、かなり疑問が残ると思います。
引用:
taka1206さんは書きました:
そのまさかの方法でやっております。

リンケージ識別子について、あまり理解できていないのかもしれませんが、
リンケージ識別子は、作成したオブジェクトを参照するための名前だけの意味かと思っています。


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

taka1206
Åê¹ÆNo.28987
投稿日時: 2006-9-28 12:52
半人前
居住地:
投稿: 32
使用環境:
OS:Windows2000 SP4
FLASH 8 Pro
Re: createObject で作成したオブジェクトに対する _alpha の設定
なるほどー。
ご回答いただきありがとうございます。

この時に質問させていただいたアプリケーションは、
思ったように動作しないなどいろいろ問題があり、現状では、
createObjectでMCインスタンスを生成するように変更しています。

そのいろいろな問題は、ここに原因があったのかもしれませんね。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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