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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ビルトインメソッドのカスタム化について
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
youich
Åê¹ÆNo.11664
投稿日時: 2004-10-21 13:16
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: onReleaseの受け取り・・・例えば
引用:


onRollOverで判断させるんですね.

ところで条件文の
this.hasOwnProperty("onRollOver");
これは呼ばれない気がするのでいらなくないですか?

ってかhasOwnPorperty自体はじめて知りました… m(_ _)m

hasOwnPropertyは読んで字のごとく、あるプロパティが自身のプロパティに存在するかどうかを調べるメソッドです?、
例)instanceMCというMovieClipをステージに置いておいて
MovieClip.prototype.onRelease = function() {
	trace('hasOwnPropery(onRollOver) = '+this.hasOwnProperty("onRollOver"));
};
MovieClip.prototype.onRollOver = function() {
	trace("MovieClip.prototype.onRollOver");
};

test = true;
if (test) {
	instanceMC.onRollOver = function() {
		trace(this+'.onRollOver');
	};
}

で、条件部分なんですが、Naoさんのおっしゃるように必要ないと思います(笑)

ここでhandCursorを制御しようとしてるんですが、
だいたいもしインスタンスにonRollOverが定義されていたらハンドカーソルは出るのが正解だし、
MovieClip.prototype.onRollOverは呼ばれるはずがないので条件の判断に加える必要もない、、ですね。

MovieClip.prototype.onRollOver = function() {
	if (this.onPress || this.onReleaseOutside || this.onRollOut || this.hasOwnProperty("onRollOver") || this._onRelease) {
		this.useHandCursor = true;
	} else {
		this.useHandCursor = false;
	}
};


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

+39
Åê¹ÆNo.11658
投稿日時: 2004-10-21 11:02
新米
居住地:
投稿: 14
使用環境:
XP + MX2004
Re: onReleaseの受け取り・・・例えば
退院しました。さて、
引用:

たしかにonRelease2とした方がいいとおもいますが+39さんの質問だとonReleaseのままで実装したいのでは?とおもいます.

そですね、独自の名前を割り当てる方法では今までやっているので・・。参考までに今までやってきたやり方としては以下のような感じです。(コレは最低基本のボタンパターンとして使用してます)
先に話題に上っていたマウスカーソルの問題も含めてボタンの生き死にも制御するようにしていました。
ボタンにメソッドを追加する場合は"eventPress","eventRelease"という独自関数に定義させ、それを"onRelease","onRollOver"等に絡めて実行させるようにしていました。
class baseButton extends MovieClip{
	var eventPress,eventRelease:Function;
	function baseButton(){
		this.gotoAndStop(1);
		setBt(true)
	}
	function setBt(flg){
		if(flg){
			this.gotoAndStop(1);
			this.onPress = doPress;
			this.onRelease = doRelease;
			this.onDragOut = doOut;
			
		}else{
			this.gotoAndStop(1);
			delete this.onPress;
			delete this.onRelease;
			delete this.onDragOut;
		}	
	}
	function doPress (){
		this.gotoAndStop(2);
		eventPress();
	}
	function doRelease(){
		this.gotoAndStop(1);
		eventRelease();
	}
	function doOut(){
		this.gotoAndStop(1);
	}
	
}

これの延長でボタンをDEADさせたり、復活させたりという一連のClassを作ってはいるのですが、イベントアクションを定義する際に"eventPress"等というようにワンクッション置いているのをもう少しスマートにできないものかなあと思っております。


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

nao
Åê¹ÆNo.11631
投稿日時: 2004-10-20 16:07
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: onReleaseの受け取り・・・例えば
>salvoxさん
たしかにonRelease2とした方がいいとおもいますが+39さんの質問だとonReleaseのままで実装したいのでは?とおもいます.

引用:
onReleaseイベントがコールされたのを受け取れるリスナーオブジェクトを設定できる機構か、任意のコールバック関数を外部から設定できるようにするみたいなコードを追加すると、もっと綺麗な感じになると思います。


そうですね.イベントの処理を監視するmediator役のようなのを置いておくと修正しやすかったのかなと思います.


>youichiさん

引用:
なにわともあれNaoさんがそんなにハンドカーソルが嫌いなら 改良してみます。


飛行機なみにハンドカーソルが怖いです…(?)


onRollOverで判断させるんですね.

ところで条件文の
this.hasOwnProperty("onRollOver");
これは呼ばれない気がするのでいらなくないですか?

ってかhasOwnPorperty自体はじめて知りました… m(_ _)m


----------------
nao [seto@graffiti-web.org]

youich
Åê¹ÆNo.11615
投稿日時: 2004-10-20 5:00
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: onReleaseの受け取り・・・例えば
引用:


ぉ.
なるほど.addPropertyを使うってそいういうことだったんですね.
どのMCもハンドカーソルになるのが気になりますね.

あぅー、ハンドカーソル。。。というか
関係のないMCまで"before","after"言ってるじゃぁないですか(笑)

なにわともあれNaoさんがそんなにハンドカーソルが嫌いなら  改良してみます。
bar = function (func) {
	this._onRelease = func;
};
foo = function () {
	if (this._onRelease == undefined) {
		return;
	}
	trace("before");
	this._onRelease();
	trace("after");
};
MovieClip.prototype.onRollOver = function() {
	if (this.onPress || this.onReleaseOutside || this.onRollOut || this.hasOwnProperty("onRollOver") || this._onRelease) {
		this.useHandCursor = true;
	} else {
		this.useHandCursor = false;
	}
};
MovieClip.prototype.addProperty("onRelease", foo, bar);

ついでに試したflaもアプしておきます。(あ、上のは冗談ですm(_ _)m
http://as-coders.nct.jp/yo/ff/onReleaseTest.fla.sit


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

salvox
Åê¹ÆNo.11614
投稿日時: 2004-10-20 2:32
常連
居住地: 東京都
投稿: 73
使用環境:
Windows2000
FlashMX
テキストエディター:EmEditor
Re: onReleaseの受け取り・・・例えば

MovieClip.prototype.setOnRelease = function( objFunc ){
	this.__onRelease = objFunc;
	this.onRelease   = this.func_onRelease;	
};         

MovieClip.prototype.getOnRelease = function(){
		return this.__onRelease;	
};         

MovieClip.prototype.func_onRelease = function(){
		this.__onRelease();
		/* 任意の共通処理を以下に */
		trace('onRelease is Called');	
};         

MovieClip.prototype.addProperty( 'onRelase2',MovieClip.prototype.getOnRelease,MovieClip.prototype.setOnRelease);


↑あえて自分自身で上のコードに追加するといったら、
onReleaseイベントがコールされたのを受け取れるリスナーオブジェクトを設定できる機構か、任意のコールバック関数を外部から設定できるようにするみたいなコードを追加すると、もっと綺麗な感じになると思います。


----------------
(C)SalvoxStudioStation

salvox
Åê¹ÆNo.11613
投稿日時: 2004-10-20 2:26
常連
居住地: 東京都
投稿: 73
使用環境:
Windows2000
FlashMX
テキストエディター:EmEditor
Re: onReleaseの受け取り・・・例えば
引用:
なるほど.addPropertyを使うってそいういうことだったんですね.どのMCもハンドカーソルになるのが気になりますね.


そうなんですよ。なんで、onRelease2 をgetter/setterにしてるかというと、恐らくFlashの構造上 onReleaseという変数に何か値が設定されていると、ボタンとして認識してしまう恐れがあるなと思ったので、
あえて、onRelease自体をgetter/setterにするのは避けて、onRelease2という仮想変数をgetter/setterにしているんです。

それに、onRelease自体をgetter/setterにするってのは、

MovieClip.prototype.onRelease = function(){};と設定するのとあまり変わらないような気がしまして。だったら、MovieClip.prototype.onRelease という設定の方がメモリーも節約できるので。

でも、↑をやると、全てのMCがボタンになるので、
onRelease2が妥当じゃないかという結論に至ったわけです。
(多分、もっと適切な命名のしかたがあると思うのですが)

それに、getter/setterに onReleaseを設定してしまうと、
onRelease自体が上書きされるイメージになったり、
仮想変数に実態変数を設定するのも、なんかしっくりこなかったので。


----------------
(C)SalvoxStudioStation

nao
Åê¹ÆNo.11605
投稿日時: 2004-10-19 18:52
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: onReleaseの受け取り・・・例えば
bar = function (func) {
	this._onRelease = func;
};
foo = function () {
	trace("before");
	this._onRelease();
	trace("after");
};
MovieClip.prototype.addProperty("onRelease", foo, bar);


ぉ.
なるほど.addPropertyを使うってそいういうことだったんですね.
どのMCもハンドカーソルになるのが気になりますね.


----------------
nao [seto@graffiti-web.org]

youich
Åê¹ÆNo.11596
投稿日時: 2004-10-19 12:46
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: onReleaseの受け取り・・・例えば
引用:


確かに、onLoadは、目の上のタンコブでしたけど、
Loadされた瞬間に実行されるので、フレームイベントにonReleaseを書いていると、常にundefinedになってしまいますね。

あ、まさしく(笑)
Naoさんも言っとりましたがこりゃだめですね、、onLoadは没

引用:

そこで、こ?いうのは、ど?でしょう?
この再、onReleaseでボタンイベントを設定するのは止めて、
例えば、onRelease2という getter/setterを作るってのは。
コードは以下のような感じ



なるほど、addPropertyを使うのは名案ですね。
しかし単にonReleaseをaddPropertyするというのはだめなんでしょうか?
なんか忘れてるよーな気もするけど。(^^;


bar = function (func) {
	this._onRelease = func;
};
foo = function () {
	trace("before");
	this._onRelease();
	trace("after");
};
MovieClip.prototype.addProperty("onRelease", foo, bar);



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

nao
Åê¹ÆNo.11593
投稿日時: 2004-10-19 11:15
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: ビルトインメソッドのカスタム化について
引用:
すいません、なんか急に体調崩して入院しております・・。
今外出許可貰って書き込んでいますが、復帰して落ち着いたら検証しますう。ほんとすいませんです。

あらら お大事に.m(_ _)m

ちょっと要望とは違うかもしれませんがMCを探して当て込んでいく方法です.
特定の階層のみに適応したい場合はいいかもしれませんが…
function addCustumOnRelease(target:MovieClip) {
    for (var prop in target) {
        if (target[prop] instanceof MovieClip) {
            if (target[prop].onRelease != undefined) {
                target[prop].originalOnRelease = target[prop].onRelease;
    
                target[prop].onRelease = function() {
                    this.originalOnRelease();
                    trace('custum');
                }
            }
            else {
                arguments.callee(target[prop]);
            }
        }
    }
}

addCustumOnRelease(_root);


----------------
nao [seto@graffiti-web.org]

salvox
Åê¹ÆNo.11590
投稿日時: 2004-10-19 4:34
常連
居住地: 東京都
投稿: 73
使用環境:
Windows2000
FlashMX
テキストエディター:EmEditor
自分の投稿に関して 追加
あと、先ほど、僕が書いた getter/setterのようにしておけば、
サイト全体を通してボタンイベントが共通である場合は、
_rootに空の関数オブジェクトを一個作って、

this.onRelease2 = _root.dammyRelease; ←関数オブジェ

として、空の処理を実行。
共通処理を、MovieClip.prototype.func_onReleaseに書いておいけば、恐らくメモリーも節約できるかな?(多分)


----------------
(C)SalvoxStudioStation

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

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