CocosBuilder里面,有很多个Inspector开头的文件,配套一套xib,h以及m文件。他们都是从共同的基类InspectorValue派生出来。如果要给节点增加新的属性,属性的类型又已经有了合适的Inspector可以表现,那么只需要在节点的CCBPProperties.plist文件中,加上属性类型,名称等相关信息,就能够直接在编辑器里使用了,无需关心其余的存取细节等,只需要对Cocos2dx里的OnHandlePropTypeXXX进行相应处理。如果没有合适的Inspector,则需要自己增加,并要在以下地方进行修改:
- CCBReaderInternal的(void) setProp:(NSString*)name ofType:(NSString*)type toValue:(id)serializedValue forNode:(CCNode*)node parentSize:(CGSize)parentSize
- CCBWriterInternal的(NSMutableDictionary*) dictionaryFromCCObject:(CCNode *)node
- CCBXCocos2diPhoneWriter的setupPropTypes/(void) writeProperty:(id) prop type:(NSString*)type name:(NSString*)name platform:(NSString*)platform/(void) cacheStringsForNode:(NSDictionary*) node
- Cocos2dx方面的CCBReader.h里的枚举,以及CCNodeLoader的ParseProperties/ParsePropTypeXXX
修改的地方都仿照别的类似inspector来写就好,之前似懂非懂的把一个普通属性弄成array了,导致存出来是array,读却是按非array来读,怎么都不对。
对Mac应用编程属于半知不解的状态,仿照Cocosbuilder里面的InspectorText,弄了个差不多的InspectorScript,里面主要就是一个标明属性名称的text label,和一个输入脚本的text view。
遇到的第一个问题是,属性名称这个属性,是在基类InspectorValue里的,怎么能绑定到我自己的InspectorScript的头文件里呢,人家根本没有这一行。想了想就转过弯了,直接去InspectorValue的头文件里绑定就好了嘛,一试果然正解。
遇到的第二个问题就没那么幸运了,我的text view里面,敲进去的内容,没法在第一时间被感知,所以编辑完成之后,一定要切换到别的控件才能被存下来。当时赶时间就先凑合提交了,最近有空才又看回这个问题。开始觉得应该是个属性勾选上就好了,对比了一遍没发现不同;又以为是要实现delegate,照着加了没用;不科学的想,难道因为人家用的带属性string我直接用的value,改过来还是不可以。最后要放弃的时候,又点了一遍,才发现是在xib的右数第二个,bindings inspector这一栏,把binding的那个项目的向下小箭头点开,里面有诸多属性,其中就有Continuously Updates Value这一栏,果然就是个勾选的属性呀!