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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     prototypeを使ってプロパティを追加したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
balance
Åê¹ÆNo.33166
投稿日時: 2007-4-25 16:19
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
prototypeを使ってプロパティを追加したい
Fuse Kit のように、ムービークリップにプロパティを追加したいと思い、
下記のコードを書きました。


_rootにムービークリップを作成、そのムービークリップの第一フレームに記述。

MovieClip.prototype.vol = 100;

MovieClip.prototype.setVol = function(num:Number):Void {
this.vol = num;
};

MovieClip.prototype.getVol = function():Number {
return this.vol;
};

MovieClip.prototype.addProperty("vol", MovieClip.prototype.getVol , MovieClip.prototype.setVol);

this.vol = 300;

trace(this.vol)
//結果100;


新しく『vol』というプロパティは出来たようですが、
this.vol = 300;
と代入しているのに、初期値の100のままです。

この方法ではプロパティを書き換える事は出来ないのでしょうか。

宜しくお願いします。
野中文雄
Åê¹ÆNo.33172
投稿日時: 2007-4-25 19:55
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: prototypeを使ってプロパティを追加したい
getter/setterプロパティの名前と内部的なプロパティ名を同じにしたら、getter/setterメソッド内からまたgetter/setterメソッドにアクセスしてしまいます。
引用:
balanceさんは書きました:
_rootにムービークリップを作成、そのムービークリップの第一フレームに記述。
// MovieClip.prototype.vol = 100;
MovieClip.prototype._vol = 100;
MovieClip.prototype.setVol = function(num:Number):Void  {
	// this.vol = num;  // setterが呼出される
	this._vol = num;
};
MovieClip.prototype.getVol = function():Number  {
	// return this.vol;  // getterが呼出される
	return this._vol;
};
MovieClip.prototype.addProperty
("vol", MovieClip.prototype.getVol, MovieClip.prototype.setVol);
this.vol = 300;
trace(this.vol);


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

balance
Åê¹ÆNo.33175
投稿日時: 2007-4-25 23:39
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: prototypeを使ってプロパティを追加したい
野中さん

有難う御座います!

getter/setterプロパティの根本的な仕組みを理解していませんでした。
おかげで正確に理解することが出来ました。


今度はClassを使って試してみました。

flaファイルと同じ階層に置いた外部asファイルに記述

class ExtendProp extends MovieClip{
	var scale:Number = 100;
	public function set _scale( num:Number ):Void{
		this.scale = num;
		this._xscale = this.scale;
	}	
	public function get _scale():Number{
		return this.scale;
	}
}


_rootの第一フレームに記述

import ExtendProp;

this._scale = 200;
trace(this._scale);
//出力 : 200

trace(this._xscale);
//出力 : 100

setメソッドの中で_xscaleに代入しているのですが、
_xscaleの値は変わりません。


先程の質問のやりかたで、下記のように

//途中から引用
MovieClip.prototype.setVol = function(num:Number):Void  {
    this._vol = num;
    _xscale = this._vol;
};

とすると上手く動作したのですが…。

クラスで継承するやり方では違ってくるのでしょうか。

宜しくお願いします。
野中文雄
Åê¹ÆNo.33176
投稿日時: 2007-4-26 0:54
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: prototypeを使ってプロパティを追加したい
メインタイムライン_rootは、MovieClipインスタンスで、ExtendPropクラスのインスタンスではないからです。ActionScript 1.0のクラスであれば、つぎのような記述と同じです(「ActionScript 2.0と1.0の継承について」参照)。
function ExtendProp() {}
ExtendProp.prototype = new MovieClip();
ExtendProp.prototype.scale = 100;
// ...[後略]...

クラスExtendPropをMovieClipシンボルの[AS 2.0クラス]に設定すれば、そのインスタンスの継承したMovieClip._xscaleプロパティは_scaleプロパティにより変更されるようになります(「ActionScriptどこに書く? ? MXスタイルからAS2.0まで」の「5. ActionScript 2.0」の項参照)。



なお、ActionScript 2.0では、メインタイムラインのクラスを変えることはできません。
引用:
balanceさんは書きました:
今度はClassを使って試してみました。
flaファイルと同じ階層に置いた外部asファイルに記述

class ExtendProp extends MovieClip{
	var scale:Number = 100;
	public function set _scale( num:Number ):Void{
		this.scale = num;
		this._xscale = this.scale;
	}	
	public function get _scale():Number{
		return this.scale;
	}
}

_rootの第一フレームに記述
// .flaと同階層(トップレベル)にあるクラスはimport不要
// import ExtendProp;
trace(this._scale);
this._scale = 200;
trace(this._scale);
//出力 : 200

trace(this._xscale);
//出力 : 100

setメソッドの中で_xscaleに代入しているのですが、
_xscaleの値は変わりません。


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

balance
Åê¹ÆNo.33178
投稿日時: 2007-4-26 19:39
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: prototypeを使ってプロパティを追加したい
野中さん

なるほど! よくわかりました。

恥ずかしながら、 「.flaと同階層(トップレベル)にあるクラスはimport不要」
という事も知りませんでした。

こちらも勉強になりました。


何度も有難うございました!

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

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