cocos2dx学习日记(三)- ActionTest(一)

      前面几天由于公司的项目各种忙,所以更新就耽搁了一下,关于cocos中的Director、Scene、Layer之间的关系,后续我会单独列一章出来和大家分享,这里继续分析cocos2dx自带的demo中的代码-ActionTest。在这里,向大家推荐三篇博客文章,想更加细致的理解action的朋友可以去看看(三篇博文转载自http://blog.csdn.net/honghaier)。

       Cocos2dx 2.0 之 Actions “三板斧”之一

       Cocosdx 2.0 之 Actions“三板斧” 之二

       Cocos2dx 2.0 之 Actions "三板斧" 之三

      上面是前辈详细的分析了,cpp中的实现代码,针对Action的实现、效果、一些函数的分析、参数的分析,这一些都十分的详尽,所以,在前辈的基础上,我就无需再花时间来整理代码中的一些函数,这些大家可以参考官方文档,边看边学,如果不理解的地方可以调试传入参数看看。

      闲话少叙,下面开始正题:

1.ActionTest MoveTo/MoveBy

      

    

 SourceCode:     


void ActionMove::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(3);

    auto s = Director::getInstance()->getWinSize();

    auto actionTo = MoveTo::create(2, Vec2(s.width-40, s.height-40));//To可以理解为移动至
    auto actionBy = MoveBy::create(2, Vec2(80,80));//By可以理解为移动多少(正负代表方向)
    auto actionByBack = actionBy->reverse();//在动作内部创建一个新的临时反向动作

    _tamara->runAction( actionTo);
    _grossini->runAction( Sequence::create(actionBy, actionByBack, nullptr));
    _kathia->runAction(MoveTo::create(1, Vec2(40,40)));
}

         通过这一个Demo,我们可以了解到MoveTo、MoveBy、reverse的使用方式。


2.ActionTest MoveTo/MoveBy 3D


    SourceCode:

          

void ActionMove3D::onEnter()
{
    ActionsDemo::onEnter();
    
    centerSprites(3);
    
    auto s = Director::getInstance()->getWinSize();
    
    _tamara->setPosition3D(Vec3(s.width-40, s.height-40, 0));//设置z轴坐标
    _kathia->setPosition3D(Vec3(40, 40, 0));//设置z轴坐标
    
    auto actionTo = MoveTo::create(2, Vec3(s.width-40, s.height-40, -100));
    auto actionBy = MoveBy::create(2, Vec3(80, 80, -100));
    auto actionByBack = actionBy->reverse();
    
    _tamara->runAction(actionTo);
    _grossini->runAction(Sequence::create(actionBy, actionByBack, nullptr));
    _kathia->runAction(MoveTo::create(1, Vec3(40, 40, -100)));
}

   与demo1对比,使用函数都没有变化,只是参数不一样。cocos2dx中的Z轴,大家可以先理解为感官上离屏幕的距离,即在之前理解的平面坐标内,再增加一个轴(维度)。从效果截图来看,远与近最直观的带来的应该是小人有一个渐变的过程。

3.ActionTest - RotateTo/RotateBy  


  SourceCode:     

void ActionRotate::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(3);

    auto actionTo = RotateTo::create( 2, 45);
    auto actionTo2 = RotateTo::create( 2, -45);
    auto actionTo0 = RotateTo::create(2 , 0);
    _tamara->runAction( Sequence::create(actionTo, actionTo0, nullptr));

    auto actionBy = RotateBy::create(2 ,  360);
    auto actionByBack = actionBy->reverse();
    _grossini->runAction( Sequence::create(actionBy, actionByBack, nullptr));

    _kathia->runAction( Sequence::create(actionTo2, actionTo0->clone(), nullptr));
}

函数原型:static RotateBy* create(float duration, float deltaAngleZ_X, float deltaAngleZ_Y); 
duration 为动作 deltaAngleZ_X x轴需要转动的角度, deltaAngleZ_Y为y轴需要转动的角度。
Ps:正负旋转角度对应的旋转效果不太好描述,需要大家自己试一试。但要注意一点,这两个函数指定的围绕哪个轴旋转指的是精灵本身的坐标轴,而非世界或者说是屏幕的坐标轴。


举个栗子:RotateTo和RotateBy都可以让精灵旋转,但它们还是有一些不同,区别就在于RotateTo是旋转到指定的角度;而RotateBy是从当前角度旋转指定的角度。举例来说,假定精灵当前的角度是x,分别给RotateTo和RotateBy指定一个角度y,那么RotateTo和RotateBy最终的效果分别如下:RotateTo:x → y RotateBy:x → (x + y)


4.ActionTest - Rotate in 3D


   函数原型:static RotateBy* create(float duration, const Vec3& deltaAngle3D);

   //duration:动作持续时间 deltaAngle3D:需要旋转的3D角度。

SourceCode:

void ActionRotateBy3D::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(3);

    auto actionBy1 = RotateBy::create(4, Vec3(360, 0, 0));
    auto actionBy2 = RotateBy::create(4, Vec3(0, 360, 0));
    auto actionBy3 = RotateBy::create(4 ,Vec3(0, 0, 360));

    _tamara->runAction( Sequence::create(actionBy1, actionBy1->reverse(), nullptr));
    _grossini->runAction( Sequence::create(actionBy2, actionBy2->reverse(), nullptr));
    _kathia->runAction( Sequence::create(actionBy3, actionBy3->reverse(), nullptr));
}

从左至右分别为:_tamara、_grossini、_kathia
             

针对RotateBy做一个总结:

      通过向RotateBy::create()传递不同种类的旋转坐标,可以实现2D旋转,带角度的3D旋转以及真正的3D旋转。函数可以设置旋转动作的持续时间,旋转角度的正负控制旋转方向。让精灵围绕X,Y,Z轴旋转,并不是指的世界或是屏幕的坐标轴,而是精灵本身的坐标轴。

bool RotateBy::initWithDuration(float duration, float deltaAngle)

bool RotateBy::initWithDuration(float duration, float deltaAngleX, float deltaAngleY)

可以合并,均使用第二个。2D旋转调用initWithDuration()时传递的deltaAngleX和deltaAngleY相同即可。


5.ActionTest - ScaleTo / ScaleBy


SourceCode:

void ActionScale::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(3);

    auto actionTo = ScaleTo::create(2.0f, 0.5f);//duration后一个参数意味着x,y同时按系数缩小/扩大
    auto actionBy = ScaleBy::create(2.0f, 1.0f, 10.0f);//分别指定x, y缩小/扩大系数
    auto actionBy2 = ScaleBy::create(2.0f, 5.0f, 1.0f);

    _grossini->runAction( actionTo);
    _tamara->runAction( Sequence::create(actionBy, actionBy->reverse(), nullptr));
    _kathia->runAction( Sequence::create(actionBy2, actionBy2->reverse(), nullptr));
}

      ScaleTo不管你原先是否对精灵进行拉伸,只是在原精灵的基础上拉伸指定倍数,ScaleBy是考虑到原来对精灵的拉伸,把原来精灵拉伸的倍数也算到拉伸动画的倍数里面去。For example: 当前精灵scale为1.2(放大1.2倍), 如果这个时候动作为Scale(1.1),这个时候精灵会先恢复原先大小,然后开始放大至1.1倍(最后结果为实际大小的1.1倍), 同样的前提下ScaleBy(1.1)则意味着在Scale(1.2)上再放大1.1,即最后的结果为1.2 x 1.1 倍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值