/*--------------------  ボタングループ管理 AS2版 v1.1  kUBoh 2009/09/11  v1.1:同じ名前でaddActionした場合、同名の古いアクションを削除するように変更...2009/10/15 /*  ・使い方:   -TweenMaxにパスが通っている必要があります。  ※TweenMaxはデフォルトのボタンエフェクトを付ける為にのみ使用しています。 ■ボタンの設定方法  -1.ライブラリ内のムービークリップに、リンケージ>クラスから設定する場合: ライブラリ内のムービークリップに、リンケージ>クラスから設定する。設定パネルの「クラス」に"ButtonGroupManager"を設定。  -2.ASから設定する場合: new ButtonGroupManager( tgt:MovieClip, tgtGroupName:String [,isCopyDefaults:Boolean] );を実行 【引数】 tgt:対象のムービークリップ tgtGroupName:所属するグループ名(存在しないグループ名を指定した場合、新たにそのグループ名が作られます。) isCopyDefaults:インスタンス単体(グループに所属しない)動作時の為のボタンイベント群の初期値として、デフォルトのボタンイベント群をコピーするか(オプション)  -ボタンのヒットエリア:  上記の設定をButtonGroupManagerを適用した表示オブジェクト内にヒットエリアになる表示オブジェクトを"hitAreaBase"という名前で配置しておく。  ※存在しない場合は透明の矩形を自動で生成します。  -その他のプロパティ  group :インスタンスが所属するグループ(文字列)。未設定または指定グループが存在しない場合はインスタンス自身に設定されたボタンイベント群を実行する ■グループの追加(静的関数) addGroup ( groupName:String ,isCopyDefaults:Boolean ):Void  グループを当クラスのグループリストに追加します。 【引数】  -groupName:追加するグループ名(文字列)  -isCopyDefaults:そのグループにデフォルトのボタンイベント群をコピーするか(オプション) ■グループの削除(静的関数) removeGroup ( groupName:String ):Void  グループを当クラスのグループリストから削除します。 【引数】  -groupName:削除するグループ名(文字列) ■ボタンイベントの追加(静的関数) addAction ( type:String ,actionName:String, action:Function, groupName:String):String  指定したグループに指定したタイプのボタンイベントを登録します。 【引数】  -type:登録するボタンイベントのタイプ(文字列)   →次の6つから指定してください。"rollOver", "rollOut", "dragOut", "press", "release", "releaseOutside"  -actionName:登録する関数を識別する為の名前(文字列)   →登録&実行時には必要有りませんが、指定しないと削除時に困ります。undefined,null,""を指定するとルールに従って自動で設定されます。  -action:登録する関数本体  -groupName:登録するグループ名(文字列)   →未指定の場合や、指定したグループが存在しない場合、この関数は実行されません。 【戻り値】  登録されたボタンアクションに付けられた関数名(文字列) ■ボタンイベントの削除(静的関数) removeAction ( type:String ,actionName:String, groupName:String ):Boolean  指定したグループ&タイプのボタンイベントから指定した名前の関数を削除します。 【引数】  -type:削除する関数が登録されているボタンイベントのタイプ(文字列)   →次の6つから指定してください。"rollOver", "rollOut", "dragOut", "press", "release", "releaseOutside"  -actionName:削除する関数名(文字列)  -groupName:削除する関数が登録されているグループ(文字列) 【戻り値】  削除に成功した場合true、何らかの理由で削除出来なかった場合はfalseがかえされます。 ■インスタンス固有ボタンイベントの追加 addInstanceAction ( type:String ,actionName:String, action:Function):String  インスタンスに指定したタイプのボタンイベントを登録します。インスタンスのgroupプロパティが未設定の場合に実行されます。 【引数】  -type:登録するボタンイベントのタイプ(文字列)   →次の6つから指定してください。"rollOver", "rollOut", "dragOut", "press", "release", "releaseOutside"  -actionName:登録する関数を識別する為の名前(文字列)   →登録&実行時には必要有りませんが、指定しないと削除時に困ります。undefined,null,""を指定するとルールに従って自動で設定されます。  -action:登録する関数本体 【戻り値】  登録されたボタンアクションに付けられた関数名(文字列) ■インスタンス固有ボタンイベントの削除 removeInstanceAction ( type:String ,actionName:String ):Boolean  指定したタイプのボタンイベントから指定した名前の関数を削除します。 【引数】  -type:削除する関数が登録されているボタンイベントのタイプ(文字列)   →次の6つから指定してください。"rollOver", "rollOut", "dragOut", "press", "release", "releaseOutside"  -actionName:削除する関数名(文字列) 【戻り値】  削除に成功した場合true、何らかの理由で削除出来なかった場合はfalseがかえされます。 --------------------*/ //TweenMaxクラスインポート import gs.TweenMax; import gs.easing.*; //ボタン設定本体 class ButtonGroupManager extends MovieClip { /*--------------------  クラス共通のパラメータ --------------------*/ //グループ管理用配列 public static var groups:Array; //関数に名前を付けなかった場合に関数名につける連番 private static var counter:Number; //インスタンス単位の関数を格納する配列 private var actions:Array; //このクラスで管理しているボタンの参照リスト private static var buttonList:Array; //デフォルトグループ名(変更可) public static var DEFAULT_GROUP_NAME:String = "DEFAULT"; //デフォルトのボタンエフェクト(変更可) public static var DEFAULT_DURATION:Number = .3; //アクションタイプ名チェック用リスト private static var ACTION_TYPE_NAMES:Array = new Array("rollOver", "rollOut", "dragOut", "press", "release", "releaseOutside"); //初期化済み? private static var firstRun:Boolean = true; //デフォルトのアクション群 private static var DEFAULT_ACTION_ROLLOVER:Function; private static var DEFAULT_ACTION_ROLLOUT:Function; private static var DEFAULT_ACTION_DRAGOUT:Function; private static var DEFAULT_ACTION_PRESS:Function; private static var DEFAULT_ACTION_RELEASE:Function; private static var DEFAULT_ACTION_RELEASEOUTSIDE:Function; /*--------------------  インスタンス毎のパラメータ --------------------*/ //ヒットエリア用表示オブジェクト private var hitAreaBase:MovieClip; //ボタンが配置されている場所の参照 private var buttonRoot:MovieClip; //所属グループ名 public var group:String; /*--------------------  コンストラクタ --------------------*/ public function ButtonGroupManager(tgt:MovieClip, tgtGroupName:String, isCopyDefaults:Boolean) { trace("ボタンを設定:ButtonGroupManager()"); //初めて実行された場合だけクラスの初期値を設定する if (firstRun == true) { trace(" *クラス全体の初期化を実行"); //グループ管理用配列を初期化し、デフォルトグループを作る groups = new Array(); groups[DEFAULT_GROUP_NAME] = new Array(); //デフォルトのエフェクトを設定 DEFAULT_ACTION_ROLLOVER = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{brightness:0.3}, ease:Linear.easeNone}); }; DEFAULT_ACTION_ROLLOUT = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{}, ease:Linear.easeNone}); }; DEFAULT_ACTION_DRAGOUT = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{}, ease:Linear.easeNone}); }; DEFAULT_ACTION_PRESS = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{brightness:0}, ease:Linear.easeNone}); }; DEFAULT_ACTION_RELEASE = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{}, ease:Linear.easeNone}); }; DEFAULT_ACTION_RELEASEOUTSIDE = function ():Void { TweenMax.to(this, DEFAULT_DURATION, {colorMatrixFilter:{}, ease:Linear.easeNone}); }; //デフォルト値を配列に直接格納 groups.DEFAULT.rollOver = new Array(DEFAULT_ACTION_ROLLOVER); groups.DEFAULT.rollOut = new Array(DEFAULT_ACTION_ROLLOUT); groups.DEFAULT.dragOut = new Array(DEFAULT_ACTION_DRAGOUT); groups.DEFAULT.press = new Array(DEFAULT_ACTION_PRESS); groups.DEFAULT.release = new Array(DEFAULT_ACTION_RELEASE); groups.DEFAULT.releaseOutside = new Array(DEFAULT_ACTION_RELEASEOUTSIDE); //全ボタンリスト初期化 buttonList = new Array(); //クラス初期化済みフラグON firstRun = false; } //引数tgtがない(ライブラリから設定された)場合は、thisをbuttonRootとする。 if (tgt == undefined) { buttonRoot = this; } else { buttonRoot = tgt; } //インスタンス単位の関数を格納する入れ物actionsを初期化 actions = new Array(); for (var i:Number = 0; i < ACTION_TYPE_NAMES.length; i++) { actions[ACTION_TYPE_NAMES[i]] = new Array(); } //引数groupNameが無い場合 if (tgtGroupName == undefined || tgtGroupName == null) { /* trace(" !グループ名未設定: "+DEFAULT_GROUP_NAME+" に設定します"); tgtGroupName = DEFAULT_GROUP_NAME; */ //デフォルト値をコピーする場合 if (isCopyDefaults == true) { actions.rollOver.push(DEFAULT_ACTION_ROLLOVER); actions.rollOut.push(DEFAULT_ACTION_ROLLOUT); actions.dragOut.push(DEFAULT_ACTION_DRAGOUT); actions.press.push(DEFAULT_ACTION_PRESS); actions.release.push(DEFAULT_ACTION_RELEASE); actions.releaseOutside.push(DEFAULT_ACTION_RELEASEOUTSIDE); } } else if (groups[tgtGroupName] == undefined) { //tgtGroupNameグループが存在しなかったら作る addGroup(tgtGroupName, isCopyDefaults); } group = tgtGroupName; trace("ボタンターゲット:tgt:" + tgt + " groupName:" + group); //hitAreaBaseを設定 hitAreaBase = buttonRoot.hitAreaBase; //hitAreaBaseが見つからなかったら現在の大きさと同じ矩形を作って設定する if (buttonRoot.hitAreaBase == undefined) { //ヒットエリア生成 hitAreaBase = buttonRoot.createEmptyMovieClip("hitAreaBase", buttonRoot.getNextHighestDepth()); hitAreaBase.beginFill(0xFF0000, 0); hitAreaBase.moveTo(0, 0); hitAreaBase.lineTo(buttonRoot._width, 0); hitAreaBase.lineTo(buttonRoot._width, buttonRoot._height); hitAreaBase.lineTo(0, buttonRoot._height); hitAreaBase.lineTo(0, 0); hitAreaBase.endFill(); } //hitAreaBaseをボタンのヒットエリアとする buttonRoot.hitArea = hitAreaBase; //ボタン有効 setEnable(true); //ボタンリストに追加 buttonList.push(this); } /*--------------------  グループの追加 --------------------*/ public static function addGroup(groupName:String, isCopyDefaults:Boolean):Void { trace("グループの追加:ButtonGroupManager.addGroup() groupName:" + groupName); //指定グループすでに存在していれば if (groups[groupName] != undefined) { trace(" !エラー!指定されたグループ名はすでに存在します。"); return; } //存在してなければ作成 groups[groupName] = new Array(); //指定したグループ、アクションタイプの格納場所を初期化 if (isCopyDefaults == true) { //デフォルト値をコピーする場合 groups[groupName].rollOver = new Array(DEFAULT_ACTION_ROLLOVER); groups[groupName].rollOut = new Array(DEFAULT_ACTION_ROLLOUT); groups[groupName].dragOut = new Array(DEFAULT_ACTION_DRAGOUT); groups[groupName].press = new Array(DEFAULT_ACTION_PRESS); groups[groupName].release = new Array(DEFAULT_ACTION_RELEASE); groups[groupName].releaseOutside = new Array(DEFAULT_ACTION_RELEASEOUTSIDE); } else { groups[groupName].rollOver = new Array(); groups[groupName].rollOut = new Array(); groups[groupName].dragOut = new Array(); groups[groupName].press = new Array(); groups[groupName].release = new Array(); groups[groupName].releaseOutside = new Array(); } } /*--------------------  グループの削除 --------------------*/ public static function removeGroup(groupName:String):Void { trace("グループの削除:ButtonGroupManager.removeGroup() groupName:" + groupName); //デフォルトグループは削除させない。 if (groupName == DEFAULT_GROUP_NAME) { trace(" !エラー!デフォルトグループ " + DEFAULT_GROUP_NAME + " は削除できません"); } //指定グループが見つかったら削除 for (var index in groups) { if (index == groupName) { //delete (groups[groupName]); groups[groupName] = undefined; trace(" " + groupName + "の削除に成功しました。"); return; } } //見つからなかった trace(" " + groupName + " は見つかりませんでした。"); } /*--------------------  アクションの追加 --------------------*/ public static function addAction(type:String, actionName:String, action:Function, groupName:String):String { trace("アクションの追加:ButtonGroupManager.addAction() groupName:" + groupName + ", type:" + type); //指定グループがなければ終了 if (groups[groupName] == undefined) { trace(" !エラー!指定されたグループ名は存在しません。"); return; } //アクションタイプ名チェック var chkFlg:Boolean = false; for (var i:Number = 0; i < ACTION_TYPE_NAMES.length; i++) { if (ACTION_TYPE_NAMES[i] != type) { chkFlg = true; } } if (chkFlg != true) { trace(" !エラー!アクションタイプ名が不正です。"); return; } //指定したグループ、アクションタイプの関数群に受け取った関数を追加 if (actionName == undefined || actionName == null || actionName == "") { //関数名未設定の場合適当に名前を付ける actionName = "action_" + type + "_" + (++counter); } //関数名をプロパティ_nameに追加 action._name = actionName; for (var i:Number = 0; i < groups[groupName][type].length; i++) { if (action._name == groups[groupName][type][i]._name) { trace(" !エラー!アクション名が重複した為古いアクションは削除されます"); groups[groupName][type][i] = undefined; } } groups[groupName][type].push(action); //登録した関数名を返す return (actionName); } /*--------------------  アクションの削除 --------------------*/ public static function removeAction(type:String, actionName:String, groupName:String):Boolean { trace("アクションの削除:ButtonGroupManager.removeAction() groupName:" + groupName + ", type:" + type + ", actionName:" + actionName); for (var i:Number = 0; i < groups[groupName][type].length; i++) { if (groups[groupName][type][i]._name == actionName) { trace(" アクション " + actionName + " が見つかりました。削除します。"); groups[groupName][type].splice(i, 1); return true; } } return false; } /*--------------------  アクションの追加(インスタンス単位) --------------------*/ public function addInstanceAction(type:String, actionName:String, action:Function):String { trace("アクションの追加(インスタンス単位):addInstanceAction() type:" + type + ", actionName:" + actionName); //アクションタイプ名チェック var chkFlg:Boolean = false; for (var i:Number = 0; i < ACTION_TYPE_NAMES.length; i++) { if (ACTION_TYPE_NAMES[i] != type) { chkFlg = true; } } if (chkFlg != true) { trace(" !エラー!アクションタイプ名が不正です。"); return; } //指定したグループ、アクションタイプの関数群に受け取った関数を追加 if (actionName == undefined || actionName == null || actionName == "") { //関数名未設定の場合適当に名前を付ける actionName = "action_" + type + "_" + (++counter); } //関数名をプロパティ_nameに追加 action._name = actionName; for (var i:Number = 0; i < actions[type].length; i++) { if (action._name == actions[type][i]._name) { trace(" !エラー!アクション名が重複した為古いアクションは削除されます"); actions[type][i] = undefined; } } actions[type].push(action); //登録した関数名を返す return (actionName); } /*--------------------  アクションの削除(インスタンス単位 --------------------*/ public function removeInstanceAction(type:String, actionName:String):Boolean { trace("アクションの削除(インスタンス単位:removeInstanceAction() type:" + type + ", actionName:" + actionName); for (var i:Number = 0; i < actions[type].length; i++) { trace(actions[type][i]._name); if (actions[type][i]._name == actionName) { trace(" アクション " + actionName + " が見つかりました。削除します。"); actions[type].splice(i, 1); return true; } } return false; } /*--------------------  ボタン有効・無効切り替え(インスタンス単位) --------------------*/ public function setEnable(sw:Boolean):Void { if (sw == true) { trace("ボタン有効:ButtonGroupManager.setEnable() ボタン" + buttonRoot._name + "を有効にしました"); } else { trace("ボタン無効:ButtonGroupManager.setEnable() ボタン" + buttonRoot._name + "を無効にしました"); } //ボタンイベント内からクラスを参照する為に var thisMC:MovieClip = this; //ボタン有効化 if (sw == true) { /*--------------------  onRollOver --------------------*/ buttonRoot.onRollOver = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (typeof thisMC.group != "string" || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onRollOver; for (var i:Number = 0; i < tgtElm.rollOver.length; i++) { this.onRollOver = tgtElm.rollOver[i]; this.onRollOver(); } this.onRollOver = tmpMethod; }; /*--------------------  onRollOut --------------------*/ buttonRoot.onRollOut = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (thisMC.group == undefined || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onRollOut; for (var i:Number = 0; i < tgtElm.rollOut.length; i++) { this.onRollOut = tgtElm.rollOut[i]; this.onRollOut(); } this.onRollOut = tmpMethod; }; /*--------------------  onDragOut --------------------*/ buttonRoot.onDragOut = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (thisMC.group == undefined || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onDragOut; for (var i:Number = 0; i < tgtElm.dragOut.length; i++) { this.onDragOut = tgtElm.dragOut[i]; this.onDragOut(); } this.onDragOut = tmpMethod; }; /*--------------------  onPress --------------------*/ buttonRoot.onPress = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (thisMC.group == undefined || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onPress; for (var i:Number = 0; i < tgtElm.press.length; i++) { this.onPress = tgtElm.press[i]; this.onPress(); } this.onPress = tmpMethod; }; /*--------------------  onRelease --------------------*/ buttonRoot.onRelease = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (thisMC.group == undefined || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onRelease; for (var i:Number = 0; i < tgtElm.release.length; i++) { this.onRelease = tgtElm.release[i]; this.onRelease(); } this.onRelease = tmpMethod; }; /*--------------------  onReleaseOutside --------------------*/ buttonRoot.onReleaseOutside = function() { //対象グループを探す。無所属やグループが存在しない場合はインスタンスの関数群を参照 var tgtElm:Array; if (thisMC.group == undefined || groups[thisMC.group] == undefined) { tgtElm = thisMC.actions; } else { tgtElm = groups[thisMC.group]; } //実処理 var tmpMethod:Function = this.onReleaseOutside; for (var i:Number = 0; i < tgtElm.releaseOutside.length; i++) { this.onReleaseOutside = tgtElm.releaseOutside[i]; this.onReleaseOutside(); } this.onReleaseOutside = tmpMethod; }; } else { //ボタンイベント全削除 delete buttonRoot.onRollOver; delete buttonRoot.onRollOut; delete buttonRoot.onDragOut; delete buttonRoot.onPress; delete buttonRoot.onRelease; } } /*--------------------  ボタンリストを取得 --------------------*/ public static function getButtonList():Array { trace("登録済みボタンリストの取得:ButtonGroupManager.getButtonList()"); var tmpArray:Array = new Array(); while (buttonList.length > 0) { var tmpElm:Object = buttonList.shift(); if (tmpElm != undefined) { tmpArray.push(tmpElm); } } buttonList = tmpArray.slice(); trace(" 長さ:" + buttonList.length); return (buttonList); } }