Cocos2d-x游戏开发实战精解
上QQ阅读APP看书,第一时间看更新

5.1 让精灵进行简单的动作

在真实的世界中,每一个复杂的运动都是由许多个简单的运动组合而成的,因此要实现复杂的运动效果,首先要知道简单的运动是怎样进行的。尤其是在游戏中,许多时候只需要进行一些简单的运动就可以达到很高的可玩性。比如经典的俄罗斯方块就仅仅依靠“方块”的水平和竖直的移动以及翻转来达到游戏的目的。本节将通过例子来展示在Cocos2d-x中实现简单运动的方法。

项目ChapterFive01中展示了若干在Cocos2d-x中使精灵进行简单运动的方法,其中关键部分如范例5-1所示。

【范例5-1】在Cocos2d-x使精灵进行简单运动。

01 Sprite* m_sprite[5];            //创建5个精灵类对象
02      for (int i = 0; i < 5; i++)  //通过循环的方式将5个精灵加入到场景中去
03      {
04              m_sprite[i] = Sprite::create("sprite.png");
05              m_sprite[i]->setScale(0.3);          //设置精灵显示的大小
06              m_sprite[i]->setPosition(105 * (i + 1), 80);                 
                                                                //设置精灵初始坐标,如图5-1所示
07              addChild(m_sprite[i]);                          //将精灵加入到场景中去
08      }
09      //第一个精灵,由坐标(105,80)运动到坐标(200,300)处
10      auto* moveto = MoveTo::create(1.2f,Vec2(200,300));      
        //目的坐标(200,300),运动持续时间1.2秒
11      m_sprite[0]->runAction(moveto);              //执行动作
12      //第二个精灵,由坐标(210,80)运动到坐标(310,280)处
13      auto* moveby = MoveBy::create(1.2f, Vec2(100, 200));    
        //从坐标(210,80)运动到(310,280)处,相对位移为(100,200)
14      m_sprite[1]->runAction(moveby);
15      //第三个精灵分别在x,y两个方向进行缩放
16      auto* scaleby = ScaleBy::create(1.2f, 2.0f, 0.5f);              
        //横向放大至当前的两倍,纵向缩小为当前的0.5倍
17      m_sprite[2]->runAction(scaleby);
18      //第四个精灵,在原地闪烁
19      auto* blink = Blink::create(1.2f, 4);   //闪烁1.2秒,共4次
20      m_sprite[3]->runAction(blink);
21      //第五个精灵沿贝塞尔曲线运动
22      ccBezierConfig bezier;                                  //精灵沿贝塞尔曲线运动的参数
23      bezier.controlPoint_1 = Vec2(-100,0);                   //第一个拐点坐标
24      bezier.controlPoint_1 = Vec2(100, 80);                  //第二个拐点坐标
25      bezier.endPosition = Vec2(0,160);                       //终点
26      auto* bezierby = BezierBy::create(2.0f, bezier);        //运动时间为2秒
27      m_sprite[4]->runAction(bezierby);

运行程序后,5个精灵显示在如图5-1所示的位置,然后沿着如图5-2所示的曲线进行相应的运动,直至最后。

图5-1 最初5个精灵整齐地排列

图5-2 经过运动5个精灵的位置形状发生变化

从范例中可以看出,在Cocos2d-x中使精灵实现简单的动作非常简单,就是先通过不同的类创建一个动作对象,然后再使精灵调用runAction方法就能够实现了。最关键的就在于有哪些动作类。

运行本节范例可以看出,这些动作都是有一个过程的,也就是说这些动作都是要经过一定的时间来完成的,比如从坐标(0,0)移动到(100,100)不会是一下子瞬移过去而是有一个运动的过程。因此这类动作又叫做延时动作,这些延时动作有一个共同的基类是IntervalAction,表5-1中列出了创建延时动作所使用的类及它们的说明。

表5-1 创建延时动作所使用的类

提示:通过表5-1可以看出,在Cocos2d-x中延时动作类命名的一个规律,那就是以to结尾的大多表示由当前状态直接转换到目标状态,而以by结尾的则表示由当前状态转换为当前状态的值再加上一个增量所代表的状态。比如ScaleTo代表的是放大到原图的N倍,而ScaleBy则代表放大图像到当前图像的N倍。如范例的第16行,如果改为使用ScaleTo则会发现,即使纵向的方法倍数为0.5是小于1的,但是由于在第05行先将精灵都缩小到了0.3倍,因此最后看到的效果其纵向的尺寸也还是增加了的,如图5-3所示。

图5-3 在动作中by与to的区别

在实际使用时,这些动作的使用也许不止是其字面表示的那样,比如ScaleTo虽然字面表示缩放,但是其实可以通过保持纵向不变而将其横向缩小到0再还原实现一种类似翻牌的效果。而色调变化则可以用来起到渲染亮度的作用,这些内容在接下来都会慢慢涉及到。