一波未平,一波又起,这不,下午继续开发进度的时候,又遇到了新的问题:
// ************************************************************************************
一。CCSprite 明明设置了rotation属性之后才加入CCNode,但是就时开不出来有任何的角度偏转!!!
找了个把小时,才惊奇的发现:原来CCSprite的 rotation 设置的是 “顺时针” 的 “角度值”!!
悲催外加震撼,不过好在还是解决了这个问题,这个让人匪夷所思的问题!!值得一提的是:
box2d里面的 b2Body 的 angle 设置的是 “逆时针” 的 “弧度值”!!这就是为什么这个问题拖我这么久的根本原因啊~
想象 1。57如果表示的是弧度值,那么东西就转动了90度,但是。。。。
如果这个1。57表示的仅仅是角度值,你说1个东西转动了1。57的角度,你光凭肉眼能不能发现?!
答案是不能,总之,我就是没法现(当然也是有原因的,物体在屏幕中很小,那么点儿角度偏转根本就没区别)~
结论:
box2d:逆时针 + 弧度值 + angle
cocos2d:顺时针 + 角度值 + rotation
另外,cocos2d框架提供了很方便的角度和弧度相互转换的宏
CC_DEGREES_TO_RADIANS(): 这个可以用来将角度转换成弧度~
CC_RADIANS_TO_DEGREES(): 这个可以用来将弧度转换成角度~
二。GameScene dealloc的时候报出错误!!!导致在退出游戏后再进入游戏的时候出错,不过之后第二次进入可以成功!
先上代码,之后再慢慢做分析:
这个是 GameScene 的 dealloc 方法
// on "dealloc" you need to release all your retained objects - (void) dealloc { // 1.if the object extends CCNode, you needn't care how to free the heap space(dynamic allocated memmery-space) // 2.if the object is contained by objective-c_baseclass_framework, free heapspace by "[*** dealloc];" // 3.if the object comes from box2d(writing in C++), free heapspace by "delete ****;" delete _world; _world = NULL; NSLog(@"delete _world successfully!!"); delete _m_debugDraw; _m_debugDraw = NULL; NSLog(@"delete _m_debugDraw successfully!!"); // below is the second case! since the CCSpriteBatchNode extends CCNode, // there is no need to dealloc it! so, below is no neccessary! // [_testBatch dealloc]; // [_eleBallBatch dealloc]; // [_eleBoxBatch dealloc]; // below is the third case! [_spriteContainer dealloc]; NSLog(@"dealloc _spriteContainer successfully!!"); [_eleBallContainer dealloc]; NSLog(@"dealloc _eleBallContainer successfully!!"); [_shapes dealloc]; NSLog(@"dealloc _shapes successfully!!"); // don't forget to call "super dealloc" [super dealloc]; NSLog(@"dealloc super successfully!!"); }
-(void) dealloc { NSLog(@"enter ToolBar's dealloc method"); // [_shapes dealloc]; NSLog(@"enter ToolBar's dealloc method2"); [super dealloc]; NSLog(@"will leave ToolBar's dealloc method"); }
(凡继承自CCNode的类都不用显式的去调用 dealloc 方法,Scene 级别的对象会在dealloc的时候自动调用继承自CCNode对象的 dealloc方法)
ToolBar 是 GameScene的一个成员变量,如上所述,因为其继承自 CCNode 类,所以没有在 GameScene的 dealloc方法中调用其 dealloc 方法~
接下来我会贴出控制台打印出的报错信息,你会发现我说的都是对的,因为虽然我没有显式地去掉用 ToolBar的dealloc 方法,但该方法中的
CCLog()确实输出了一些不可磨灭的东西!真理万岁~
下面是控制台的报错输出(当然我只是检重要的东西贴一下)
2011-08-13 21:26:44.066 SuperBalance1.1[6652:307] cocos2d: Frame interval: 1 2011-08-13 21:26:44.096 SuperBalance1.1[6652:307] cocos2d: surface size: 320x480 2011-08-13 21:26:45.850 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:46.168 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:46.456 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:46.726 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:46.998 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:47.225 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:47.494 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:47.814 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:48.143 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:48.428 SuperBalance1.1[6652:307] ccTouchesEnded 2011-08-13 21:26:50.470 SuperBalance1.1[6652:307] delete _world successfully!! 2011-08-13 21:26:50.480 SuperBalance1.1[6652:307] delete _m_debugDraw successfully!! 2011-08-13 21:26:50.491 SuperBalance1.1[6652:307] dealloc _spriteContainer successfully!! 2011-08-13 21:26:50.502 SuperBalance1.1[6652:307] dealloc _eleBallContainer successfully!! 2011-08-13 21:26:50.513 SuperBalance1.1[6652:307] dealloc _shapes successfully!! 2011-08-13 21:26:50.523 SuperBalance1.1[6652:307] enter ToolBar's dealloc method Program received signal: “EXC_BAD_ACCESS”. (gdb)
为什么会出问题了,_shapes 是一个 NSMutabeArray 类型的数据,我在init方法中对其做了初始化,那我肯定要在该对象不再
被用到的时候将这个_shapes对象也给 dealloc 掉!这是天经地义的啊,但是为什么会报错呢?
经过我的良久沉思,终于发现了其中的问题,因为 _shapes 同时也是 GameScene 中的一个成员变量,
换句话说,我是在 GameScene 的某个方法中在堆内存上分配出该对象的,之后,我又通过调用 ToolBar 的 setShapes 方法,
将GameScene 中的_shapes成员变量赋予到 Toolbar 对象的成员变量。。。
其间并没有新的堆内存的分配,所以说,GameScene 和 ToolBar 中的 _shapes 成员变量指向的都是同一块儿堆内存。。。
这就导致了以上问题的出现!!!
其实某次查看报错结果的时候我也偶然发现爆出过这样一则信息:
真的是可遇而不可求,这个报错信息怎么搞也整不出来了,不过大意是这样的:
************** 您所要求dealloc的对象根本就未曾被初始化...EXC_BAD_ACCESS!! **************
哎~貌似XCode 就知道 EXC_BAD_ACCESS,现在我看到这个就烦了,每次都是这个错误,搞地人脑袋云里雾里的~
不过很奇怪的是,为什么竟然只会报出一次,后面却又看不见了,很诡异!!
总之,问题能够得到圆满地解决还是很好的!!