protected virtual BlockData ParsePropTypeBlock(CCNode node, CCNode parent, CCBReader reader) { string selectorName = reader.ReadCachedString(); var selectorTarget = (CCBTargetType) reader.ReadInt(false); if (selectorTarget != CCBTargetType.None) { object target = null; if (!reader.IsJSControlled()) { if (selectorTarget == CCBTargetType.DocumentRoot) { target = reader.AnimationManager.RootNode; } else if (selectorTarget == CCBTargetType.Owner) { target = reader.Owner; /* Scripting specific code because selector function is common for all callbacks. * So if we had 1 target and 1 selector function, the context (callback function name) * would get lost. Hence the need for a new target for each callback. */ if (reader._hasScriptingOwner) { var proxy = (ICCBScriptOwnerProtocol) reader.Owner; if (proxy != null) { target = proxy.CreateNew() as object; } } } if (target != null) { if (selectorName.Length > 0) { Action<object> selMenuHandler = null; var targetAsCCBSelectorResolver = target as ICCBSelectorResolver; if (targetAsCCBSelectorResolver != null) { selMenuHandler = targetAsCCBSelectorResolver.OnResolveCCBCCMenuItemSelector(target, selectorName); } if (selMenuHandler == null) { ICCBSelectorResolver ccbSelectorResolver = reader.SelectorResolver; if (ccbSelectorResolver != null) { selMenuHandler = ccbSelectorResolver.OnResolveCCBCCMenuItemSelector(target, selectorName); } } if (selMenuHandler == null) { CCLog.Log("Skipping selector '{0}' since no CCBSelectorResolver is present.", selectorName); } else { var blockData = new BlockData(); blockData.mSELMenuHandler = selMenuHandler; blockData.mTarget = target; return blockData; } } else { CCLog.Log("Unexpected empty selector."); } } else { CCLog.Log("Unexpected NULL target for selector."); } } else { if (selectorTarget == CCBTargetType.DocumentRoot) { reader.AddDocumentCallbackNode(node); reader.AddDocumentCallbackName(selectorName); } else { reader.AddOwnerCallbackNode(node); reader.AddOwnerCallbackName(selectorName); } } } return null; }
protected virtual BlockCCControlData ParsePropTypeBlockCcControl(CCNode node, CCNode parent, CCBReader reader) { string selectorName = reader.ReadCachedString(); var selectorTarget = (CCBTargetType) reader.ReadInt(false); var controlEvents = (CCControlEvent) reader.ReadInt(false); if (selectorTarget != CCBTargetType.None) { if (!reader.IsJSControlled()) { object target = null; if (selectorTarget == CCBTargetType.DocumentRoot) { target = reader.AnimationManager.RootNode; } else if (selectorTarget == CCBTargetType.Owner) { target = reader.Owner; } if (target != null) { if (selectorName.Length > 0) { Action<object, CCControlEvent> selCCControlHandler = null; var targetAsCCBSelectorResolver = target as ICCBSelectorResolver; if (targetAsCCBSelectorResolver != null) { selCCControlHandler = targetAsCCBSelectorResolver.OnResolveCCBCCControlSelector(target, selectorName); } if (selCCControlHandler == null) { ICCBSelectorResolver ccbSelectorResolver = reader.SelectorResolver; if (ccbSelectorResolver != null) { selCCControlHandler = ccbSelectorResolver.OnResolveCCBCCControlSelector(target, selectorName); } } if (selCCControlHandler == null) { CCLog.Log("Skipping selector '{0}' since no CCBSelectorResolver is present.", selectorName); } else { var blockCCControlData = new BlockCCControlData(); blockCCControlData.mSELCCControlHandler = selCCControlHandler; blockCCControlData.mTarget = target; blockCCControlData.mControlEvents = controlEvents; return blockCCControlData; } } else { CCLog.Log("Unexpected empty selector."); } } else { CCLog.Log("Unexpected NULL target for selector."); } } else { if (selectorTarget == CCBTargetType.DocumentRoot) { reader.AddDocumentCallbackNode(node); reader.AddDocumentCallbackName(selectorName); } else { reader.AddOwnerCallbackNode(node); reader.AddOwnerCallbackName(selectorName); } } } return null; }
public virtual void ParseProperties(CCNode node, CCNode parent, CCBReader reader) { int numRegularProps = reader.ReadInt(false); int numExturaProps = reader.ReadInt(false); int propertyCount = numRegularProps + numExturaProps; for (int i = 0; i < propertyCount; i++) { bool isExtraProp = (i >= numRegularProps); int type = reader.ReadInt(false); string propertyName = reader.ReadCachedString(); // Check if the property can be set for this platform bool setProp = false; var platform = (PlatformType) reader.ReadByte(); if (platform == PlatformType.All) { setProp = true; } #if __CC_PLATFORM_IOS if(platform == kCCBPlatform.kCCBPlatformIOS) { setProp = true; } #elif __CC_PLATFORM_MAC if(platform == kCCBPlatform.kCCBPlatformMac) { setProp = true; } #endif // Forward properties for sub ccb files if (node is CCBFile) { var ccbNode = (CCBFile) node; if (ccbNode.FileNode != null && isExtraProp) { node = ccbNode.FileNode; // Skip properties that doesn't have a value to override var extraPropsNames = (List<string>) node.UserObject; bool bFound = false; foreach (var pObj in extraPropsNames) { if (pObj == propertyName) { bFound = true; break; } } setProp &= bFound; } } else if (isExtraProp && node == reader.AnimationManager.RootNode) { var extraPropsNames = (List<string>) node.UserObject; if (extraPropsNames == null) { extraPropsNames = new List<string>(); node.UserObject = extraPropsNames; } extraPropsNames.Add(propertyName); } switch ((CCBPropertyType) type) { case CCBPropertyType.Position: { CCPoint position = ParsePropTypePosition(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypePosition(node, parent, propertyName, position, reader); } break; } case CCBPropertyType.Point: { CCPoint point = ParsePropTypePoint(node, parent, reader); if (setProp) { OnHandlePropTypePoint(node, parent, propertyName, point, reader); } break; } case CCBPropertyType.PointLock: { CCPoint pointLock = ParsePropTypePointLock(node, parent, reader); if (setProp) { OnHandlePropTypePointLock(node, parent, propertyName, pointLock, reader); } break; } case CCBPropertyType.Size: { CCSize size = ParsePropTypeSize(node, parent, reader); if (setProp) { OnHandlePropTypeSize(node, parent, propertyName, size, reader); } break; } case CCBPropertyType.ScaleLock: { float[] scaleLock = ParsePropTypeScaleLock(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeScaleLock(node, parent, propertyName, scaleLock, reader); } break; } case CCBPropertyType.Float: { float f = ParsePropTypeFloat(node, parent, reader); if (setProp) { OnHandlePropTypeFloat(node, parent, propertyName, f, reader); } break; } case CCBPropertyType.FloatXY: { var xy = ParsePropTypeFloatXY(node, parent, reader); if (setProp) { OnHandlePropTypeFloatXY(node, parent, propertyName, xy, reader); } break; } case CCBPropertyType.Degrees: { float degrees = ParsePropTypeDegrees(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeDegrees(node, parent, propertyName, degrees, reader); } break; } case CCBPropertyType.FloatScale: { float floatScale = ParsePropTypeFloatScale(node, parent, reader); if (setProp) { OnHandlePropTypeFloatScale(node, parent, propertyName, floatScale, reader); } break; } case CCBPropertyType.Integer: { int integer = ParsePropTypeInteger(node, parent, reader); if (setProp) { OnHandlePropTypeInteger(node, parent, propertyName, integer, reader); } break; } case CCBPropertyType.IntegerLabeled: { int integerLabeled = ParsePropTypeIntegerLabeled(node, parent, reader); if (setProp) { OnHandlePropTypeIntegerLabeled(node, parent, propertyName, integerLabeled, reader); } break; } case CCBPropertyType.FloatVar: { float[] floatVar = ParsePropTypeFloatVar(node, parent, reader); if (setProp) { OnHandlePropTypeFloatVar(node, parent, propertyName, floatVar, reader); } break; } case CCBPropertyType.Check: { bool check = ParsePropTypeCheck(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeCheck(node, parent, propertyName, check, reader); } break; } case CCBPropertyType.SpriteFrame: { CCSpriteFrame ccSpriteFrame = ParsePropTypeSpriteFrame(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeSpriteFrame(node, parent, propertyName, ccSpriteFrame, reader); } break; } case CCBPropertyType.Animation: { CCAnimation ccAnimation = ParsePropTypeAnimation(node, parent, reader); if (setProp) { OnHandlePropTypeAnimation(node, parent, propertyName, ccAnimation, reader); } break; } case CCBPropertyType.Texture: { CCTexture2D ccTexture2D = ParsePropTypeTexture(node, parent, reader); if (setProp) { OnHandlePropTypeTexture(node, parent, propertyName, ccTexture2D, reader); } break; } case CCBPropertyType.Byte: { byte b = ParsePropTypeByte(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeByte(node, parent, propertyName, b, reader); } break; } case CCBPropertyType.Color3: { CCColor3B color3B = ParsePropTypeColor3(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeColor3(node, parent, propertyName, color3B, reader); } break; } case CCBPropertyType.Color4FVar: { CCColor4F[] color4FVar = ParsePropTypeColor4FVar(node, parent, reader); if (setProp) { OnHandlePropTypeColor4FVar(node, parent, propertyName, color4FVar, reader); } break; } case CCBPropertyType.Flip: { bool[] flip = ParsePropTypeFlip(node, parent, reader); if (setProp) { OnHandlePropTypeFlip(node, parent, propertyName, flip, reader); } break; } case CCBPropertyType.Blendmode: { CCBlendFunc blendFunc = ParsePropTypeBlendFunc(node, parent, reader); if (setProp) { OnHandlePropTypeBlendFunc(node, parent, propertyName, blendFunc, reader); } break; } case CCBPropertyType.FntFile: { string fntFile = ParsePropTypeFntFile(node, parent, reader); if (setProp) { OnHandlePropTypeFntFile(node, parent, propertyName, fntFile, reader); } break; } case CCBPropertyType.FontTTF: { string fontTTF = ParsePropTypeFontTTF(node, parent, reader); if (setProp) { OnHandlePropTypeFontTTF(node, parent, propertyName, fontTTF, reader); } break; } case CCBPropertyType.String: { string s = ParsePropTypeString(node, parent, reader); if (setProp) { OnHandlePropTypeString(node, parent, propertyName, s, reader); } break; } case CCBPropertyType.Text: { string text = ParsePropTypeText(node, parent, reader); if (setProp) { OnHandlePropTypeText(node, parent, propertyName, text, reader); } break; } case CCBPropertyType.Block: { BlockData blockData = ParsePropTypeBlock(node, parent, reader); if (setProp) { OnHandlePropTypeBlock(node, parent, propertyName, blockData, reader); } break; } case CCBPropertyType.BlockCCControl: { BlockCCControlData blockCCControlData = ParsePropTypeBlockCcControl(node, parent, reader); if (setProp && blockCCControlData != null) { OnHandlePropTypeBlockCcControl(node, parent, propertyName, blockCCControlData, reader); } break; } case CCBPropertyType.CCBFile: { CCNode ccbFileNode = ParsePropTypeCcbFile(node, parent, reader); if (setProp) { OnHandlePropTypeCCBFile(node, parent, propertyName, ccbFileNode, reader); } break; } default: //ASSERT_FAIL_UNEXPECTED_PROPERTYTYPE(type); break; } } }
protected virtual CCBlendFunc ParsePropTypeBlendFunc(CCNode node, CCNode parent, CCBReader reader) { int source = reader.ReadInt(false); int destination = reader.ReadInt(false); CCBlendFunc blendFunc; blendFunc.Source = source; blendFunc.Destination = destination; return blendFunc; }
protected virtual float ParsePropTypeFloatScale(CCNode node, CCNode parent, CCBReader reader) { float f = reader.ReadFloat(); int type = reader.ReadInt(false); if ((CCBScaleType) type == CCBScaleType.MultiplyResolution) { f *= CCBReader.ResolutionScale; } return f; }
protected virtual int ParsePropTypeIntegerLabeled(CCNode node, CCNode parent, CCBReader reader) { return reader.ReadInt(true); }
protected virtual CCSize ParsePropTypeSize(CCNode node, CCNode parent, CCBReader reader) { float width = reader.ReadFloat(); float height = reader.ReadFloat(); int type = reader.ReadInt(false); CCSize containerSize = reader.AnimationManager.GetContainerSize(parent); switch ((SizeType) type) { case SizeType.Absolute: { /* Nothing. */ break; } case SizeType.RelativeContainer: { width = containerSize.Width - width; height = containerSize.Height - height; break; } case SizeType.Percent: { width = (int) (containerSize.Width * width / 100.0f); height = (int) (containerSize.Height * height / 100.0f); break; } case SizeType.HorizontalPercent: { width = (int) (containerSize.Width * width / 100.0f); break; } case SizeType.VerticalPercent: { height = (int) (containerSize.Height * height / 100.0f); break; } case SizeType.MultiplyResolution: { float resolutionScale = CCBReader.ResolutionScale; width *= resolutionScale; height *= resolutionScale; break; } default: { CCLog.Log("Unknown CCB type."); } break; } return new CCSize(width, height); }
protected virtual float[] ParsePropTypeScaleLock(CCNode node, CCNode parent, CCBReader reader, string propertyName) { float x = reader.ReadFloat(); float y = reader.ReadFloat(); var type = (CCBScaleType) reader.ReadInt(false); CCBHelper.SetRelativeScale(node, x, y, type, propertyName); if (reader.AnimatedProperties.Contains(propertyName)) { var baseValue = new List<CCBValue> { new CCBValue(x), new CCBValue(y), new CCBValue((int) type) }; reader.AnimationManager.SetBaseValue(baseValue, node, propertyName); } if (type == CCBScaleType.MultiplyResolution) { x *= CCBReader.ResolutionScale; y *= CCBReader.ResolutionScale; } var scaleLock = new float[2]; scaleLock[0] = x; scaleLock[1] = y; return scaleLock; }
protected virtual CCPoint ParsePropTypePosition(CCNode node, CCNode parent, CCBReader reader, string propertyName) { float x = reader.ReadFloat(); float y = reader.ReadFloat(); var type = (CCBPositionType) reader.ReadInt(false); CCSize containerSize = reader.AnimationManager.GetContainerSize(parent); CCPoint pt = CCBHelper.GetAbsolutePosition(new CCPoint(x, y), type, containerSize, propertyName); node.Position = CCBHelper.GetAbsolutePosition(pt, type, containerSize, propertyName); if (reader.AnimatedProperties.Contains(propertyName)) { var baseValue = new List<CCBValue> { new CCBValue(x), new CCBValue(y), new CCBValue((int) type) }; reader.AnimationManager.SetBaseValue(baseValue, node, propertyName); } return pt; }
protected virtual int ParsePropTypeIntegerLabeled(CCNode node, CCNode parent, CCBReader reader) { return(reader.ReadInt(true)); }
public virtual void ParseProperties(CCNode node, CCNode parent, CCBReader reader) { int numRegularProps = reader.ReadInt(false); int numExturaProps = reader.ReadInt(false); int propertyCount = numRegularProps + numExturaProps; for (int i = 0; i < propertyCount; i++) { bool isExtraProp = (i >= numRegularProps); int type = reader.ReadInt(false); string propertyName = reader.ReadCachedString(); // Check if the property can be set for this platform bool setProp = false; var platform = (CCBPlatform)reader.ReadByte(); if (platform == CCBPlatform.All) { setProp = true; } #if __CC_PLATFORM_IOS if (platform == kCCBPlatform.kCCBPlatformIOS) { setProp = true; } #elif __CC_PLATFORM_MAC if (platform == kCCBPlatform.kCCBPlatformMac) { setProp = true; } #endif // Forward properties for sub ccb files if (node is CCBFile) { var ccbNode = (CCBFile)node; if (ccbNode.FileNode != null && isExtraProp) { node = ccbNode.FileNode; // Skip properties that doesn't have a value to override var extraPropsNames = (List <string>)node.UserObject; setProp &= extraPropsNames.Contains(propertyName); } } else if (isExtraProp && node == reader.AnimationManager.RootNode) { var extraPropsNames = (List <string>)node.UserObject; if (extraPropsNames == null) { extraPropsNames = new List <string>(); node.UserObject = extraPropsNames; } extraPropsNames.Add(propertyName); } switch ((CCBPropType)type) { case CCBPropType.Position: { CCPoint position = ParsePropTypePosition(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypePosition(node, parent, propertyName, position, reader); } break; } case CCBPropType.Point: { CCPoint point = ParsePropTypePoint(node, parent, reader); if (setProp) { OnHandlePropTypePoint(node, parent, propertyName, point, reader); } break; } case CCBPropType.PointLock: { CCPoint pointLock = ParsePropTypePointLock(node, parent, reader); if (setProp) { OnHandlePropTypePointLock(node, parent, propertyName, pointLock, reader); } break; } case CCBPropType.Size: { CCSize size = ParsePropTypeSize(node, parent, reader); if (setProp) { OnHandlePropTypeSize(node, parent, propertyName, size, reader); } break; } case CCBPropType.ScaleLock: { float[] scaleLock = ParsePropTypeScaleLock(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeScaleLock(node, parent, propertyName, scaleLock, reader); } break; } case CCBPropType.Float: { float f = ParsePropTypeFloat(node, parent, reader); if (setProp) { OnHandlePropTypeFloat(node, parent, propertyName, f, reader); } break; } case CCBPropType.Degrees: { float degrees = ParsePropTypeDegrees(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeDegrees(node, parent, propertyName, degrees, reader); } break; } case CCBPropType.FloatScale: { float floatScale = ParsePropTypeFloatScale(node, parent, reader); if (setProp) { OnHandlePropTypeFloatScale(node, parent, propertyName, floatScale, reader); } break; } case CCBPropType.Integer: { int integer = ParsePropTypeInteger(node, parent, reader); if (setProp) { OnHandlePropTypeInteger(node, parent, propertyName, integer, reader); } break; } case CCBPropType.IntegerLabeled: { int integerLabeled = ParsePropTypeIntegerLabeled(node, parent, reader); if (setProp) { OnHandlePropTypeIntegerLabeled(node, parent, propertyName, integerLabeled, reader); } break; } case CCBPropType.FloatVar: { float[] floatVar = ParsePropTypeFloatVar(node, parent, reader); if (setProp) { OnHandlePropTypeFloatVar(node, parent, propertyName, floatVar, reader); } break; } case CCBPropType.Check: { bool check = ParsePropTypeCheck(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeCheck(node, parent, propertyName, check, reader); } break; } case CCBPropType.SpriteFrame: { CCSpriteFrame ccSpriteFrame = ParsePropTypeSpriteFrame(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeSpriteFrame(node, parent, propertyName, ccSpriteFrame, reader); } break; } case CCBPropType.Animation: { CCAnimation ccAnimation = ParsePropTypeAnimation(node, parent, reader); if (setProp) { OnHandlePropTypeAnimation(node, parent, propertyName, ccAnimation, reader); } break; } case CCBPropType.Texture: { CCTexture2D ccTexture2D = ParsePropTypeTexture(node, parent, reader); if (setProp) { OnHandlePropTypeTexture(node, parent, propertyName, ccTexture2D, reader); } break; } case CCBPropType.Byte: { byte b = ParsePropTypeByte(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeByte(node, parent, propertyName, b, reader); } break; } case CCBPropType.Color3: { CCColor3B color3B = ParsePropTypeColor3(node, parent, reader, propertyName); if (setProp) { OnHandlePropTypeColor3(node, parent, propertyName, color3B, reader); } break; } case CCBPropType.Color4FVar: { CCColor4F[] color4FVar = ParsePropTypeColor4FVar(node, parent, reader); if (setProp) { OnHandlePropTypeColor4FVar(node, parent, propertyName, color4FVar, reader); } break; } case CCBPropType.Flip: { bool[] flip = ParsePropTypeFlip(node, parent, reader); if (setProp) { OnHandlePropTypeFlip(node, parent, propertyName, flip, reader); } break; } case CCBPropType.Blendmode: { CCBlendFunc blendFunc = ParsePropTypeBlendFunc(node, parent, reader); if (setProp) { OnHandlePropTypeBlendFunc(node, parent, propertyName, blendFunc, reader); } break; } case CCBPropType.FntFile: { string fntFile = ParsePropTypeFntFile(node, parent, reader); if (setProp) { OnHandlePropTypeFntFile(node, parent, propertyName, fntFile, reader); } break; } case CCBPropType.FontTTF: { string fontTTF = ParsePropTypeFontTTF(node, parent, reader); if (setProp) { OnHandlePropTypeFontTTF(node, parent, propertyName, fontTTF, reader); } break; } case CCBPropType.String: { string s = ParsePropTypeString(node, parent, reader); if (setProp) { OnHandlePropTypeString(node, parent, propertyName, s, reader); } break; } case CCBPropType.Text: { string text = ParsePropTypeText(node, parent, reader); if (setProp) { OnHandlePropTypeText(node, parent, propertyName, text, reader); } break; } case CCBPropType.Block: { BlockData blockData = ParsePropTypeBlock(node, parent, reader); if (setProp) { OnHandlePropTypeBlock(node, parent, propertyName, blockData, reader); } break; } case CCBPropType.BlockCCControl: { BlockCCControlData blockCCControlData = ParsePropTypeBlockCcControl(node, parent, reader); if (setProp && blockCCControlData != null) { OnHandlePropTypeBlockCcControl(node, parent, propertyName, blockCCControlData, reader); } break; } case CCBPropType.CCBFile: { CCNode ccbFileNode = ParsePropTypeCcbFile(node, parent, reader); if (setProp) { OnHandlePropTypeCCBFile(node, parent, propertyName, ccbFileNode, reader); } break; } default: //ASSERT_FAIL_UNEXPECTED_PROPERTYTYPE(type); break; } } }
protected virtual BlockCCControlData ParsePropTypeBlockCcControl(CCNode node, CCNode parent, CCBReader reader) { string selectorName = reader.ReadCachedString(); var selectorTarget = (CCBTargetType)reader.ReadInt(false); var controlEvents = (CCControlEvent)reader.ReadInt(false); if (selectorTarget != CCBTargetType.None) { object target = null; if (selectorTarget == CCBTargetType.DocumentRoot) { target = reader.AnimationManager.RootNode; } else if (selectorTarget == CCBTargetType.Owner) { target = reader.Owner; } if (target != null) { if (selectorName.Length > 0) { SEL_CCControlHandler selCCControlHandler = null; var targetAsCCBSelectorResolver = target as CCBSelectorResolver; if (targetAsCCBSelectorResolver != null) { selCCControlHandler = targetAsCCBSelectorResolver.OnResolveCCBCCControlSelector(target, selectorName); } if (selCCControlHandler == null) { CCBSelectorResolver ccbSelectorResolver = reader.SelectorResolver; if (ccbSelectorResolver != null) { selCCControlHandler = ccbSelectorResolver.OnResolveCCBCCControlSelector(target, selectorName); } } if (selCCControlHandler == null) { CCLog.Log("Skipping selector '{0}' since no CCBSelectorResolver is present.", selectorName); } else { var blockCCControlData = new BlockCCControlData(); blockCCControlData.mSELCCControlHandler = selCCControlHandler; blockCCControlData.mTarget = target; blockCCControlData.mControlEvents = controlEvents; return(blockCCControlData); } } else { CCLog.Log("Unexpected empty selector."); } } else { CCLog.Log("Unexpected NULL target for selector."); } } return(null); }
protected virtual BlockData ParsePropTypeBlock(CCNode node, CCNode parent, CCBReader reader) { string selectorName = reader.ReadCachedString(); var selectorTarget = (CCBTargetType)reader.ReadInt(false); if (selectorTarget != CCBTargetType.None) { object target = null; if (selectorTarget == CCBTargetType.DocumentRoot) { target = reader.AnimationManager.RootNode; } else if (selectorTarget == CCBTargetType.Owner) { target = reader.Owner; /* Scripting specific code because selector function is common for all callbacks. * So if we had 1 target and 1 selector function, the context (callback function name) * would get lost. Hence the need for a new target for each callback. */ if (reader.hasScriptingOwner) { var proxy = (CCBScriptOwnerProtocol)reader.Owner; if (proxy != null) { target = proxy.CreateNew() as object; } } } if (target != null) { if (selectorName.Length > 0) { SEL_MenuHandler selMenuHandler = null; var targetAsCCBSelectorResolver = target as CCBSelectorResolver; if (targetAsCCBSelectorResolver != null) { selMenuHandler = targetAsCCBSelectorResolver.OnResolveCCBCCMenuItemSelector(target, selectorName); } if (selMenuHandler == null) { CCBSelectorResolver ccbSelectorResolver = reader.SelectorResolver; if (ccbSelectorResolver != null) { selMenuHandler = ccbSelectorResolver.OnResolveCCBCCMenuItemSelector(target, selectorName); } } if (selMenuHandler == null) { CCLog.Log("Skipping selector '%s' since no CCBSelectorResolver is present.", selectorName); } else { var blockData = new BlockData(); blockData.mSELMenuHandler = selMenuHandler; blockData.mTarget = target; return(blockData); } } else { CCLog.Log("Unexpected empty selector."); } } else { CCLog.Log("Unexpected NULL target for selector."); } } return(null); }