CCScaleTo与CCScaleBy比较

来源:互联网 发布:vs2013写c语言步骤 编辑:程序博客网 时间:2024/05/18 03:41

http://my.oschina.net/sel/blog/177024

Cocos2d-x中提供了CCScaleToCCScaleBy两个拉伸动作,虽然两个都是拉伸动作,但是功能上还是有差别的,下面解释一下他们的区别。

CCScaleTocreate函数:

?
1
2
3
4
5
6
7
8
9
staticCCScaleTo* CCScaleTo::create(floatduration , floatsx , floatsy);
 
    /*
     * duration是动作执行持续时间,单位为秒;
       
     * sx是X方向的拉伸值(注意,是拉伸值!);
 
     * sy是Y方向的拉伸值;
     */


 对于一般精灵创建时,拉伸值是1.0f,所以如果sx的值为0.5f时,精灵完成动作后,水平方向的拉伸值就会变为0.5f;如果sx的值为2.0f时,精灵完成动作后,水平方向拉伸值就会变为2.0f

如果精灵原来的拉伸值为2.0f时,对于sx的值为0.5f时,精灵完成动作后,水平方向的拉伸值就会变为0.5f;如果sx的值为2.0f时,精灵完成动作后,水平方向拉伸值就会变为2.0f

总的来说,CCScaleTo动作实现的其实就是Sprite::setScale函数的内容,只不过它是一个动作,而且还可以从X,Y两个方向上设置拉伸值而已。

CCScaleBycreate函数:

?
1
2
3
4
5
6
7
8
9
<span></span> Static CCScaleBy* CCScaleBy::create(floatduration , floatsx , floatsy);
 
    /*
     * duration是动作执行持续时间
 
     * sx是X方向的拉伸倍数(注意,现在是倍数!);
 
     * sy是Y方向的拉伸倍数;
     */


对于倍数的话,想必大家也就很容易明白。

如果原来精灵的拉伸值是2.0f,对于sx的值为0.5f的情况,那么完成动作后,水平拉伸值变为1.0f;对于sx的值为2.0f的情况,那么完成动作后,水平拉甚至变为4.0f

总的来说就是,CCScaleBy是将精灵原来的拉伸值乘上相应的倍数。

 

对于纯文字的说明,想必大家可能不太明白,而且也会觉得很烦躁,毕竟我也是实现派,总喜欢用实例来说明和自己动手实践,所以我们还是通过下面的例子来说明吧。

创建一个名为ScaleActionCocos2d-x项目后,我们修改HelloWorldScene.cpp里面init()函数的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
boolMyHelloWorldScene::init(){
    boolbRet=false;
    do
    {
        CC_BREAK_IF(!CCLayer::init());
         
 
           /*
        *  创建第一个精灵,并将拉伸值设为2.0f
        */
        CCSprite* sprite1=CCSprite::create("fly.png");
        sprite1->setPosition(ccp(100,200));
        sprite1->setScale(2.0f);
        this->addChild(sprite1);
 
           /*
            *  创建第二个精灵,拉伸值同样设为2.0f
        */
        CCSprite*sprite2=CCSprite::create("fly.png");
        sprite2->setPosition(ccp(400,200));
        sprite2->setScale(2.0f);
        this->addChild(sprite2);
 
 
        bRet=true;
         
    }while(0);
 
    returnbRet;
}

这时候我们可以先看一下运行效果:

然后我们修改上面的代码,加入两个动作:


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
boolMyHelloWorldScene::init(){
    boolbRet=false;
    do
    {
        CC_BREAK_IF(!CCLayer::init());
         
 
           /*
        *  创建第一个精灵,并将拉伸值设为2.0f
        */
        CCSprite* sprite1=CCSprite::create("fly.png");
        sprite1->setPosition(ccp(200,200));
        sprite1->setScale(2.0f);
        this->addChild(sprite1);
 
           /*
            *  创建第二个精灵,拉伸值同样设为2.0f
        */
        CCSprite*sprite2=CCSprite::create("fly.png");
        sprite2->setPosition(ccp(600,200));
        sprite2->setScale(2.0f);
        this->addChild(sprite2);
 
        /*
         * 创建CCScaleTo动作
 
         * 动作持续时间设为3秒
 
         * X方向拉伸值变为1.5
 
         * Y方向拉伸值变为1.5
         */
        CCScaleTo*scaleTo=CCScaleTo::create(3.0f,1.5f,1.5f);
 
        /*
         * 创建CCScaleBy动作
 
         * 动作持续时间为3秒
 
         * X方向拉伸为原来的1.5倍
 
         * Y方向拉伸为原来的1.5倍
         */
        CCScaleBy*scaleBy=CCScaleBy::create(3.0f,1.5f,1.5f);
 
        sprite1->runAction(scaleTo);
        sprite2->runAction(scaleBy);
        bRet=true;
         
    }while(0);
 
    returnbRet;
}
对应的运行效果:

由运行效果大家就可以看得出CCScaleTo将精灵的拉伸值由原来的2.0f变为1.5f,所以大小就等于原来的四分之三了;而CCScaleBy是将2.0f乘上1.5倍,所以大小就变为原来的1.5倍了。

本文就到此为止了,对于Coco2d-x,我也是个初学者,所以希望大家能够一起交流,共同进步。谢谢。


0 0
原创粉丝点击