BBGamelib.CCTouchDispatcher.touches C# (CSharp) Method

touches() private method

private touches ( HashSet touches, kCCTouch touchType ) : void
touches HashSet
touchType kCCTouch
return void
		void touches(HashSet<UITouch> touches, kCCTouch touchType)
		{
			NSUtils.Assert((int)touchType < 4, "Invalid idx value");
			
			HashSet<UITouch> mutableTouches;
			locked = true;
			
			// optimization to prevent a mutable copy when it is not necessary
			int targetedHandlersCount = targetedHandlers.Count;
			int standardHandlersCount = standardHandlers.Count;
			bool needsMutableSet = (targetedHandlersCount!=0 && standardHandlersCount!=0);
			
			mutableTouches = needsMutableSet?(new HashSet<UITouch>(touches)):touches;
			
			ccTouchHandlerHelperData helper = handlerHelperData[(int)touchType];
			//
			// process the target handlers 1st
			//
			if( targetedHandlersCount > 0 ) {
				var enumerator = touches.GetEnumerator();
				while (enumerator.MoveNext()) {
					UITouch touch = enumerator.Current;

					var targetedHandlersEnumerator = targetedHandlers.GetEnumerator();
					while (targetedHandlersEnumerator.MoveNext()) {
						CCTargetedTouchHandler handler = (CCTargetedTouchHandler)targetedHandlersEnumerator.Current;						
						bool claimed = false;
						if( touchType == kCCTouch.Began ) {
							claimed = ((CCTouchOneByOneDelegate)handler.delegate_).ccTouchBegan(touch);
							if( claimed )
								handler.claimedTouches.Add(touch);
						}
						
						// else (moved, ended, cancelled)
						else if( handler.claimedTouches.Contains(touch) ) {
							claimed = true;
							if( ((int)handler.enabledSelectors & (int)(helper.type)) != 0){
								Type thisType = handler.delegate_.GetType();
								MethodInfo theMethod = thisType.GetMethod(helper.touchSel);
								theMethod.Invoke(handler.delegate_, new object[1]{touch});
							}
							if( ((int)helper.type & ((int)kCCTouchSelectorFlag.CancelledBit | (int)kCCTouchSelectorFlag.EndedBit)) != 0)
								handler.claimedTouches.Remove(touch);
						}
						
						if( claimed && handler.swallowsTouches ) {
							if( needsMutableSet )
								mutableTouches.Remove(touch);
							break;
						}
					}
				}
			}
			
			//
			// process standard handlers 2nd
			//
			if( standardHandlersCount > 0 && mutableTouches.Count>0 ) {
				
				var enumerator = standardHandlers.GetEnumerator();
				while (enumerator.MoveNext()) {
					var handler = enumerator.Current;
					if( ((int)handler.enabledSelectors & ((int)(helper.type))) != 0){
						Type thisType = handler.delegate_.GetType();
						MethodInfo theMethod = thisType.GetMethod(helper.touchesSel);
						theMethod.Invoke(handler.delegate_, new object[1]{mutableTouches});
					}
				}
			}
			if( needsMutableSet )
				mutableTouches = null;
			
			//
			// Optimization. To prevent a [handlers copy] which is expensive
			// the add/removes/quit is done after the iterations
			//
			locked = false;
			
			//issue 1084, 1139 first add then remove
			if( toAdd ) {
				toAdd = false;
				
				var enumerator = handlersToAdd.GetEnumerator();
				while (enumerator.MoveNext()) {
					var handler = enumerator.Current;
					if( handler is CCTargetedTouchHandler )
						forceAddHandler((CCTouchHandler)handler, targetedHandlers);
					else
						forceAddHandler((CCTouchHandler)handler, standardHandlers);
				}
				handlersToAdd.Clear();
			}
			
			if( toRemove ) {
				toRemove = false;

				
				var enumerator = handlersToRemove.GetEnumerator();
				while (enumerator.MoveNext()) {
					var aDelegate = enumerator.Current;
					forceRemoveDelegate(aDelegate);
				}
				handlersToRemove.Clear();
			}
			
			if( toQuit ) {
				toQuit = false;
				forceRemoveAllDelegates();
			}
		}
		public void touchesBegan(HashSet<UITouch> aTouches)