一、精灵的移动
1.moveTo
moveTo的解释很简单,意思就是把精灵移动到指定的位置,这个“到”子很重要,下面的MoveBy和这个有区分。
<span style="white-space:pre"> </span>Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* xiaoRuo = Sprite::create("sprite.png"); //创建一个图片精灵
xiaoRuo->setPosition(Point(50, visibleSize.height / 2)); //设置图片精灵的初始位置
this->addChild(xiaoRuo); //将精灵加入到场景中
MoveTo* moveTo = MoveTo::create(0.9f, Point(250, 150)); //创建一个MoveTo动作对象
/*MoveTo::create函数中第一个参数的作用是精灵移动到指定位置所花费的时间,单位为秒
第二个参数为指定精灵要移动的位置*/
xiaoRuo->runAction(moveTo); //执行动作
2.MoveBy
这个MoveBy的移动是在精灵所在位置的基础上移动的,比如说我们指定的第二个参数为Point(250,150),则精灵会向x方向移动250的距离,向y方向移动150的距离。如果换成MoveTo则精灵会移动到(250,150)所在的位置。 Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* xiaoRuo = Sprite::create("sprite.png"); //创建一个图片精灵
xiaoRuo->setPosition(Point(50, visibleSize.height / 2)); //设置图片精灵的初始位置
this->addChild(xiaoRuo); //将精灵加入到场景中
MoveBy* moveBy = MoveBy::create(0.9f, Point(250, 150)); //创建一个MoveTo动作对象
/*MoveTo::create函数中第一个参数的作用是精灵移动到指定位置所花费的时间
第二个参数为指定精灵要移动的位置*/
xiaoRuo->runAction(moveBy); //执行动作
3.ScaleTo
ScaleTo的意思就是拉伸当前精灵到指定的值(x方向拉伸,y方向拉伸)
Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* xiaoRuo = Sprite::create("sprite.png"); //创建一个图片精灵
xiaoRuo->setPosition(Point(visibleSize.width, visibleSize.height / 2)); //设置图片精灵的初始位置
this->addChild(xiaoRuo); //将精灵加入到场景中
ScaleTo* scaleTo = ScaleTo::create(2.8f, 0.4f, 1.0f); //创建一个ScaleTo对象
/*ScaleTo::create函数的第一个参数为完成这一动作持续的时间,单位为秒
第二个参数为X方向的拉伸值
第三个参数为Y方向的拉伸值*/
xiaoRuo->runAction(scaleTo); //执行动作
4.ScaleBy
Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* xiaoRuo = Sprite::create("sprite.png"); //创建一个图片精灵
xiaoRuo->setPosition(Point(visibleSize.width, visibleSize.height / 2)); //设置图片精灵的初始位置
this->addChild(xiaoRuo); //将精灵加入到场景中
ScaleBy* scaleBy = ScaleBy::create(2.8f, 0.4f, 1.0f); //创建一个ScaleTo对象
/*ScaleTo::create函数的第一个参数为完成这一动作持续的时间,单位为秒
第二个参数为X方向的拉伸值
第三个参数为Y方向的拉伸值*/
xiaoRuo->runAction(scaleBy); //执行动作
5.Blink
Blink可以使精灵闪烁,并且可以指定闪烁次数。 Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* xiaoRuo = Sprite::create("sprite.png"); //创建一个图片精灵
xiaoRuo->setPosition(Point(visibleSize.width, visibleSize.height / 2)); //设置图片精灵的初始位置
this->addChild(xiaoRuo); //将精灵加入到场景中
Blink* blink = Blink::create(3.0f, 3); //创建一个Blink动作对象
/*Blink::create函数的第一个参数为动作持续的时间,单位为秒
第二个参数为在规定的时间内闪烁的次数*/
xiaoRuo->runAction(blink); //执行动作
6.BezierTo和BezierBy
BezierTo和BezierBy能够让精灵按照贝塞尔曲线移动。
贝塞尔的结构体如下所示
贝兹曲线的描述结构体如下:
/** @typedef bezier configuration structure
*/
typedef struct _ccBezierConfig {
//! end position of the bezier
CCPoint endPosition;
//! Bezier control point 1
CCPoint controlPoint_1;
//! Bezier control point 2
CCPoint controlPoint_2;
} ccBezierConfig;
当使用BezierTo的时候,ccBezierConfig的点都是绝对坐标点,当使用BezierBy的时候,ccBezierConfig的点是相对坐标点。
Sprite* sprite = Sprite::create("sprite.png"); //创建一个精灵
sprite->setPosition(Point(50, 180)); //指定精灵的初始位置
this->addChild(sprite, 1, 1); //将精灵插入到场景中
/*addChild函数的参数有三个:
第一个就是精灵的指针
第二个就是绘制层的顺序,默认参数值为0,表示最高优先层导入,该值越大表示该层在最后加载(在最高一层)
第三个参数为Tag标记,如果以后在该类的其他方法中要访问这个变量时可以通过调用函数getChildByTag来取回该对象,
然后可以对该对象进行操作,这样做的好处是降低系统资源的占用*/
ccBezierConfig bezier; //创建贝塞尔曲线的设置
bezier.controlPoint_1 = Point(100, 0); //波谷偏向值
bezier.controlPoint_2 = Point(200, 250); //波峰偏向值
bezier.endPosition = Point(300, 50); //动作终点
BezierTo* bezierTo = BezierTo::create(4.0f, bezier); //创建一个BezierTo对象
/*BezierTo::create第一个参数为动作完成所需的时间单位为秒
第二个参数为已经创建好的贝塞尔曲线的设置*/
sprite->runAction(bezierTo); //执行动作
如果把上述代码中的BezierTo换成BezierBy效果就不一样了,这是因为BezierBy是在精灵当前位置的基础上进行移动的。
7.RepeatForever
这个函数可以让精灵一直重复一个动作。
Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* sprite = Sprite::create("sprite.png"); //创建一个精灵
sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2)); //设置精灵的初始位置
this->addChild(sprite); //将精灵加入到场景中
JumpBy* jumpBy = JumpBy::create(3.0f, Point(50, 1), 100, 1); // 创建一个JumpBy动作对象
/*JumpBy::create函数的第一个参数为完成动作所需的时间,单位为秒
第二个参数为目标位置(目标位置是相对的,是按照精灵原来的位置作为基础的)
第三个参数为跳跃的高度
第四个参数为在规定的时间内跳跃的次数*/
RepeatForever* repeatForeverAction = RepeatForever::create(jumpBy); //创建一个永久动作的对象(参数为动作的指针)
sprite->runAction(repeatForeverAction); //执行动作
8.Sequence和Spawn
Spawn也是一个动作,只是这个动作是有其他动作合成的一个动作,也就是说所有动作一起播放。
Sequence也是一个动作,这是一个把之前动作合在一起的动作,只不过它是一个动作一个动作有序播放的。
Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕的尺寸
Sprite* sprite = Sprite::create("sprite.png"); //创建一个精灵对象
sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2)); //设置精灵对象的初始位置
this->addChild(sprite); //将精灵对象插入到场景中
MoveBy* moveBy = MoveBy::create(2.2f, Point(40, 20)); //创建一个移动对象
/*MoveBy::create函数的第一个参数为完成移动动作所需要的时间,单位为秒
第二个参数为目标位置(这里的位置是相对于初始位置来说的)*/
JumpBy* jumpBy = JumpBy::create(3.0f, Point(50, 1), 100, 5); //创建一个跳跃动作
/*JumpBy::create函数的第一个参数为完成这一个跳跃动作所需要的时间,单位为秒
第二个参数为跳跃的目标位置(这里的位置是相对于初始位置来说的)
第三个参数为跳跃的高度
第四个参数为在规定的时间内跳跃的次数*/
Action* actions = Spawn::create(moveBy, jumpBy, NULL); //创建组合动作对象,将所有动作连起来
sprite->runAction(actions); //执行动作
Action是所有动作的父类,Spawn也是一个动作,只不过这个动作是由好几个动作组成的,最后一个参数为NULL,是因为Spawn的create函数参数为可变参数,需要用NULL值表示结束。当然了Action也可以用Spawn来取代。
如果想让动作一个接一个的播放就把Spawn换成Sequence就可以了,因为其他都一样,下面就不贴代码了。
9.RotateBy和RotateTo
产生旋转效果。
Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸
Sprite* sprite = Sprite::create("sprite.png"); //创建一个精灵
sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2)); //设置精灵的初始位置
this->addChild(sprite); //将精灵加入到场景中
RotateBy* rotateBy = RotateBy::create(2.5f, 220, 10); //创建一个旋转对象
/*RotateBy::create函数的第一个参数为完成这一动作所需要的时间,单位为秒
第二和第三个参数分别为精灵在x和y方向上喜欢转的角度
(这里的角度为相对角度,是在原来精灵的基础上旋转的)*/
sprite->runAction(rotateBy); //执行动作
这里要区分一下RotateBy和RotateTo的区别。