Cocos-2dx学习笔记
1.create a sprite
code:
auto player=Sprite::create("player.png",rect(0,0,27,40));
player->setPosition(Point(x,y));
player->setscale(1.5); //代表显示的倍数
this->addChild(player); //讲player添加到背景
其中addChild()
函数的定义如下:
函数原型:virtual void addChild(CCNode * child, int zOrder, int tag);
addChild()有三个参数:
第三个参数还没有用过
1、要加入场景的对象的指针,(可以是CCSprite*,CCLayer*,CCNode*
等类型)
2、绘制层的顺序,默认参数值为0,表示最高优先层导入,该值越大表示该层在最后
加载(在最高一层),一般背景图层是首先加载,其他元素在加载在背景层上面。因
为背景在后面加载的话,会覆盖掉前面加载的元素,看不到想要的图层组合效果。
3、Tag标记。赋予类的某个方法中定义的局部变量(Node*
类型对象,Sprite*
对
象等)一个标记号tag,如果以后在该类的其他方法中要访问这个变量时可以通过
调用函数 getChildByTag来取回该对象,从而方便使用这个对象进行想要的操作。这
样做的好处是:定义成类的成员变量会一直占用内存资源,而局部变量的生命周期
比成员变量短,节省系统资源,而且在外面就可以通过函数getChildByTagtag号
来获取这个对象。所以在以后编写Cocos2d代码过程中,尽量使用局部变量。
还有一个点就是Rect(x,y,width,height)
是制造一个矩形包含了这个精灵。
x,y代表该精灵的坐标,后面两个不用说了。在后面的碰撞检测中我们将再次用
到Rect
。
2.get the size of the screen
code:
auto VisibleSize=Director::getInstance()->getVisibleSize();
感觉基本上每一个场景和函数中都会用到这句
3.to generate a random number
CCRANDOM_0_1()
: cocos2d中使用 ,范围是[0,1]
使用方法:
`float random = CCRANDOM_0_1() * 5; //[0,5]`
CCRANDOM_0_1() 取值范围是[0,1],可以点进去速览定义发现这是一个宏,
实际是一个new c++ 11
的rand()
函数
所以我们获得了一种可以随机产生物体的方法
int minY = target->getContentSize().height / 2;
int maxY = visibleSize.height - target->getContentSize().height / 2;
int rangeY = maxY - minY;
int actualY = (CCRANDOM_0_1() * rangeY) + minY;
target->setPosition(Point(visibleSize.width + target->getContentSize().width / 2, actualY));
this->addChild(target,0);
我们可以重复调用这段代码从而不断的随机产生精灵,注意有一点就是此
时会产生随机值为0的点,为了避免这种情况,需要在产生的数后面加min值
4.acion move
ScaleTo and ScaleBy
ScaleTo scaleto=ScaleTo::create(2.8f,0.4f,1.0f);
ScaleBy * scaleby = ScaleBy::create(2.8f, 0.4f, 1.0f);
最后需要一个精灵利用runAction
执行这些动作
sprite->runAction(scaleto/scaleby);
这两个函数的create
函数包含三个参数:第一个为动作执行时间,第二个为x轴拉伸倍数,第三个
为y轴拉伸倍数。每个数后面要加f后缀。
ScaleTo
& ScaleBy
的区别是:ScaleTo
不管你原先是否对精灵进行拉伸,
只是在原精灵的基础上拉伸指定倍数,ScaleBy
是考虑到原来对精灵的拉伸,把原来精灵拉伸的倍数
也算到拉伸动画的倍数里面去。
MoveTo and MoveBy
MoveTo继承于MoveBy,两个函数的参数都是(float duration, const Vec2& deltaPosition),
第一个参数代表动作执行的时间,第二个是一个坐标,对于MoveBy()
是以精灵当前坐标移动的,
MoveTo()
是指移动到该坐标点。
code:
auto ActionMove=MoveTo::create(duration,point(x,y));
ActionMove->runAction(ActionMove);
Sequence and Spawn
Sequence也是继承actionInteval的类,它和Spawn都可以有多个参数,都是已经定义过的action
,最后一个参数为NULL,代表参数结束。区别是Sequence()
是顺序执行这些动作,而Spawn()
是同时执行这些动作
code
“`c++
MoveBy * moveby = MoveBy::create(2.2f, Point(40, 20));
//创建一个弹跳的动作
JumpBy * jumpby = JumpBy::create(3.0f, Point(50, 1), 100, 1);
//创建一个旋转动作
RotateBy * rotateby = RotateBy::create(2.5f, 220, 10);
///创建组合动作将动作组合起来
//顺序执行
Action * action = Sequence::create(moveby, jumpby, rotateby, NULL);
//一起执行
Action * action = Spawn::create(moveby, jumpby, rotateby, NULL);
target1->runAction(action);
“`
GlobalZOrder & LocalZOder
在一开始的addChild()
函数中提到的第二个参数即ZOrder问题:首先,对于LocalZOrder
简单的说,它关联到一个scene graph,而这个东西采用中序遍历访问所有的节点,所以值大的点
后被渲染,而在addchild函数中的就是LocalZOrder.而对于GlobalZOrder不赋值时默认为0,
当精灵的GlobalZOrder的值都为0时默认采用scene graph顺序渲染。这里可以使用setGlobalZOrder
和setLocalZOrder来单独设置该精灵的ZOrder值。