⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 overlapmonitor.as

📁 jquery插件
💻 AS
字号:
/** * Copyright (c) 2007 Moses Gunesch *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */package org.goasap.managers {	import flash.utils.Dictionary;		import org.goasap.interfaces.IManageable;	import org.goasap.interfaces.IManager;		/**	 * Calls <code>releaseHandling()</code> on currently-active items when 	 * property-handling overlap is detected (like two tweens trying to set 	 * the same sprite's x property), as new items are added to GoEngine. 	 * 	 * <p>To activate this manager call the following line one time:</p>	 * <pre>GoEngine.addManager( new OverlapMonitor() );</pre>	 * 	 * {In the game of Go, a superko is a rule that prevents a potentially	 *  infinite competition - ko - over the same space.}	 *  	 * @see org.goasap.interfaces.IManager IManager	 * @see org.goasap.interfaces.IManageable IManageable	 * @see org.goasap.GoEngine GoEngine	 *  	 * @author Moses Gunesch	 */	public class OverlapMonitor implements IManager	{		/**		 * A set of Dictionaries by target object. Targets are indexed 		 * because they are the primary point of overlap to check first.		 */		protected var handlers : Dictionary = new Dictionary(false);				/**		 * Tracks subdictionary lengths.		 */		protected var counts : Dictionary = new Dictionary(false);				/**		 * Sets an IManageable as reserving its target/property combinations.		 * 		 * @param handler		IManageable to reserve		 */		public function reserve(handler:IManageable):void		{			// =======================================================================================			// Step-by-step: Items are 'reserved' or stored in a Dictionary.			// When a new item says it's handling the same target as a stored item, the stored item			// is asked whether the new item's properties conflict. If so, the old item is 'released' 			// from its duties. (Tip: 'handlers' here are GoItems like tweens, not functions.)			// =======================================================================================									var targs:Array = handler.getActiveTargets();			var props:Array = handler.getActiveProperties();			if (!targs || !props || targs.length==0 || props.length==0)				return;			for each (var targ:Object in targs)			{				if (handlers[ targ ]==null) {					// (I switched to using sub-dictionaries w/ counters, since it may be a hair faster than Array.					//  Strong keys are fine here since GoEngine stores and will release() all active items.)					handlers[ targ ] = new Dictionary(false);					handlers[ targ ][ handler ] = true;					counts[ targ ] = 1;					continue;				}								var targ_handlers: Dictionary = (handlers[ targ ] as Dictionary); // as in, 'active tweens handling a same Sprite'				if (targ_handlers[ handler ]) continue; // safety (handler already reserved)								// keep before isHandling() tests				targ_handlers[ handler ] = true;				counts[ targ ] ++;								for (var other:Object in targ_handlers) {					if (other!=handler)						if ((other as IManageable).isHandling(props)) { // Ask each existing handler to report overlap.							(other as IManageable).releaseHandling();	// Items should stop themselves on this call.							// GoEngine will then call release() back on this class which will clear the item out.					}				}			}		}				/**		 * Releases an IManageable from being monitored. Does not call releaseHandling() on instances,		 * since this method is called after an instance has already removed itself from the engine.		 * 		 * @param handler	The IManageable to remove from internal lists.		 */		public function release(handler:IManageable):void		{			var targs:Array = handler.getActiveTargets();			for each (var targ:Object in targs) {				if (handlers[ targ ] && handlers[ targ ][ handler ]!=null) {					delete handlers[ targ ][ handler ];					counts[ targ ] --; // don't alter this syntax. (Flex doesn't like --counts[targ])					if ( counts[ targ ] == 0 ) {						delete handlers[ targ ];						delete counts[ targ ];					}				}			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -