观XX项目感0
没做过c++项目,一上来看个大项目,还真不知怎么看,有种无从下手的感觉。那就像看书一样虽然,有些看不懂,先一个个的看一遍,再反过头来看时,一定会有收获。
1) 头文件中都使用了一些预处理设施:如果预处理器变量未定义,那么跟在其后的所有指示都被处理,知道出现#endif.
1 #ifndef XXX_XXX_H
2 #define XXX_XXX_H
3 ...
4 #endif
头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。
2) #include <> 和 #include "": 如果头文件名括在<>里,那么认为该头文件是标准头文件。编译器将会在预定义的位置查找该头文件。(可以设置查找路径环境变量或者命令行选项来修改);""用于非系统头文件,查找通常开始于源文件所在的路径。
3) 项目中用到的外部库有boost库(most boost libraries are header_only),jsoncpp也没有把它编译成lib而是直接把源代码都放到工程下面;使用的游戏引擎是cocos2d-x。
继续提醒一下自己,不要快速看完后,脑子里什么也没有空白,那样自己感觉过的都不充实。用心、认真。 这篇文章先专注看一下项目中用到的而我还不知道的一些字符串拼接和引擎使用的方法。
4) 关于sprintf
1 char bullet_name[15] = "";
2 sprintf(bullet_name,"bullet_%d.png",1);
我认为下面这种方法更c++,不过上面那种写法更简洁;
1 strstream ss;
2 string s;
3 ss << 1;
4 ss >> s;
5 s = "bullet_" + s + ".png";
5) 关于引擎中的锚点
1 const CCPoint CCPointZero = CCPointMake(0,0);
2 switch(i)
3 {
4 case 0:
5 sprite->setAnchorPoint( CCPointZero );
6 break;
7 case 1:
8 sprite->setAnchorPoint( ccp(0.5f, 0.5f) );
9 break;
10 case 2:
11 sprite->setAnchorPoint( ccp(1,1) );
12 break;
13 }
对应的效果:(0,0)在左sprite下角;(0.5,0.5)在sprite中心点;(1.0,1.0)在sprite右上角。
如果设置(0.5,1.0)则:(图上所画的绿点,就是sprite->setPosition的地方)
在XX项目中,为什么子弹的锚点要设置在(0.5,1.0)上呢?
如果设置在(0.5,0.5)那么子弹一开始就会露出一半,如果这时,控制它隐藏将增加程序的复杂度,位置-子弹的半个身位。
6) const成员函数 bullet类中 bool IsOutOfRange() const;
有时容易忘记const是限定的是this呢还是return的bool呢;查一下书肯定知道是限定的this。由于this是指向const对象的指针,const成员函数不能修改调用该函数的对象。那什么时候把return的bool限定为const,由于返回值一般都为右值,很少最为左值,所以限定为const没有意义。(左值:左值可以出现在赋值语句的左边或右边;右值只能出现在赋值语句的右边)
刚才还以为不能限制返回值为const因为它很少用作左值。 但是返回值是const类型难道就没有其他的好处吗,当它是右值时如果你不想让返回值(本身而不是其复制品)被修改则应该限定为const类型;const string SlipAnimationName(const char* name)
7) cocos2d-x action By To的区别;moveBy moveTo
先看一下by的英文解释:通过、经过;to的英文解释:到、向;第一次看引擎时确实,没看出两者的区别,今天看demo发现moveBy使用时用了reverse,moveTo没用,是不是moveBy的reverse是他特有的?看了看文档,果然moveTo没有reverse方法。
moveTo就是移动到某点,moveBy就是经过某点再原路返回。
1 CCActionInterval* actionTo = CCMoveTo::actionWithDuration(2, CCPointMake(s.width-40, s.height-40));
2 CCActionInterval* actionBy = CCMoveBy::actionWithDuration(2, CCPointMake(80,80));
3 CCActionInterval* actionByBack = actionBy->reverse();
4
5 m_tamara->runAction( actionTo);
6 m_grossini->runAction( CCSequence::actions(actionBy, actionByBack, NULL));
同理其它action
2011/12/07今天在项目中,又看了一下MoveTo和MoveBy,我以前理解错了一些!CCMoveBy::actionWithDuration(2, CCPointMake(80,80));这里的ccp(80,80)不是像ActionTo中的一样(屏幕上的目标坐标点);这里是偏移量(80,80) ? 这里不是点吗? 对,它对于CCMoveBy是相对于CCNode原先的坐标点横坐标向右偏移80个像素,纵坐标也偏移80个像素。
1 CCActionInterval* actionTo = CCMoveTo::actionWithDuration(2, CCPointMake(s.width-40, s.height-40));
2 CCActionInterval* actionBy = CCMoveBy::actionWithDuration(2, CCPointMake(80,80));
3 CCActionInterval* actionByBack = actionBy->reverse();
4
5 m_tamara->runAction( actionTo);
6 m_grossini->runAction( CCSequence::actions(actionBy, actionByBack, NULL));
7 // m_grossini->runAction(actionBy);
8 m_kathia->runAction(CCMoveTo::actionWithDuration(1, CCPointMake(40,40)));
综上: CCMoveTO CCMoveBy
actionWithDuration中的ccp 移动到的坐标点 相对于CCNode现在的坐标点的偏移量
有无reverse 无(空方法) 有(可以轻松的做往返动作)
看来不亲自试试,光看很难掌握事物的全貌;虽然上面我也贴代码了,和现在贴的其实是一样的,但是就没去修改下试试,仅仅是看了看!今天修改游戏程序代码金币的动作时突然发现了To和By先前没意识到的区别。