加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d:——第七节:动作

发布时间:2020-12-14 21:34:38 所属栏目:百科 来源:网络整理
导读:简介: cocos2d中为了让游戏画面动起来,有两种方法,一是直接修改属性,例如位置,大小,旋转,等。另外一种就是使用动作。 cocos2d提供了丰富的动作类,这些动作类分为瞬时动作,持续动作,复合动作和速度变化等。 Action是动作类的基类,所有的动作都派生

简介:

cocos2d中为了让游戏画面动起来,有两种方法,一是直接修改属性,例如位置,大小,旋转,等。另外一种就是使用动作。
cocos2d提供了丰富的动作类,这些动作类分为瞬时动作,持续动作,复合动作和速度变化等。
Action是动作类的基类,所有的动作都派生这个类,它创建的一个对象代表一个动作,动作用于Node,因为,任何一个动作都需要由Node对象来执行。

一个简单示例:

bool ActionScene::init()
{
    if (!Layer::init()) {
        return false;
    }
    //获取屏幕的大小的尺寸
    size = Director::getInstance()->getVisibleSize();
    //获取一个监听者
    auto listener = EventListenerTouchOneByOne::create();
    //注册监听的回调函数
    listener->onTouchBegan = CC_CALLBACK_2(ActionScene::onTouchBegan,this);
    //注册监听器到当前节点
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
    
    auto bg = Sprite::create("bg.jpg");
    bg->setPosition(size.width/2,size.height/2);
    auto sx = size.width/bg->getContentSize().width;
    auto sy = size.height/bg->getContentSize().height;
    bg->setScale(sx,sy);
    
    ico = Sprite::create("ico.jpg");
    ico->setPosition(size.width/2,size.height/2);
    
    
    this->addChild(bg);
    this->addChild(ico);
    
    return true;
}
//这是点击动作的回调方法,最终的效果是,点一下屏幕,就开始移动
bool ActionScene::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event)
{
    //创建一个移动的动作,第一个参数是duration,就是时间,这里为1s,第二个参数是一个点,要移动到的点
    //这里的意思是在1s内移动到坐标为(100,200)
    auto move = MoveTo::create(1,Point(100,200));
    //开始执行动作
    ico->runAction(move);
    return false;
}


瞬时动作:

是指立刻就能完成的动作,是FiniteTimeAction中动作持续时间为0的特例,就是说,这个动作会在下一帧立刻完成,如设置位置,设定缩放等。这些动作本来可以通过为属性赋值来完成,但封装成动作以后,可以与其它动作一起组合成复杂的动作。
详情,可以看代码:

//
void ActionScene::testPlace()
{
    //该动作可以将节点移动到一个指定的点,瞬间完成
    auto place = Place::create(Point(100,100));
    //开始执行动作
    ico->runAction(place);
}
void ActionScene::testFlip()
{
    //创建一个沿X轴镜面反转的动作
    auto flipX = FlipX::create(true);
    //创建一个沿Y轴镜面反转的动作
    auto fileY = FlipY::create(true);
    
    ico->runAction(fileY);
    
}
void ActionScene::testShowHide()
{
    //创建一个显示的动作
    auto show = Show::create();
    //创建一个隐藏的动作
    auto hide = Hide::create();
    
    //已经在头文件里声明了一个变量,用于判断,达到点一下隐藏,再点一下出现的效果
    if(count%2==0){
        ico->runAction(show);
    }else{
        ico->runAction(hide);
    }
    count++;
}

持续性动作:

是在持续的一段时间里逐渐完成的动作,如精灵从一个占连续地移动到另一个点,与瞬时动作相比,持续性动作的种类更加丰富,由于这些动作将持续一段时间,一般都有一个用于控制时间的时间参数duration。

to与by:
每一种持续性动作都分两种,分别具有To和By后缀,to动作描述了节点值的绝对变化,例如moveTo将对象移动到一个指定的位置,by的动作,刚是一个相对变化,moveBy将对象移动一段相对位移。

分类:
位置变化动作
属性变化动作
视觉特效动作
控制动作

位置变化动作:

直线运动:

//测试moveBy动作的方法
void ActionScene::testMoveBy(){
    //创建一个moveBy动作,第一个参数是移动时间,第二个参数是要移动到的相对位置
    auto moveby = MoveBy::create(5,100));
    ico->runAction(moveby);
}
//测试moveTo动作的方法
void ActionScene::testMoveTo(){
    //创建一个moveTo动作,第一个参数是移动时间,第二个参数是要移动到的点
    auto moveto = MoveTo::create(5,100));
    ico->runAction(moveto);
}

按一定的轨迹跳跃到指定的位置:

//测试jumpBy的方法
void ActionScene::testJumpTo(){
    //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃到的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数
    auto jumpto = JumpTo::create(5,100),30,3);
    ico->runAction(jumpto);
}
//测试jumpTo的方法
void ActionScene::testJumpBy(){
    //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数
    auto jumpby = JumpBy::create(5,3);
    ico->runAction(jumpby);
}

贝赛尔曲线移动:

void ActionScene::testBezierBy(){
    //先创建一个ccBezierConfig结构体
    ccBezierConfig bezier;
    //设置控制点1
    bezier.controlPoint_1 = Point(20,150);
    //设置控制点2
    bezier.controlPoint_2 = Point(200,30);
    //设置终点
    bezier.endPosition = Point(160,30);
    //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体
    auto bezierBy = BezierBy::create(5,bezier);
    ico->runAction(bezierBy);
}
void ActionScene::testBezierTo(){
    //先创建一个ccBezierConfig结构体
    ccBezierConfig bezier;
    //设置控制点1
    bezier.controlPoint_1 = Point(20,30);
    //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体
    auto bezierTo = BezierTo::create(5,bezier);
    ico->runAction(bezierTo);
}


属性变化动作:

改变大小:

//测试ScaleBy的方法
void ActionScene::testScaleBy(){
    //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半
    //第二个参数,如果大于1,就表示放大
    //构造方法有多个,参数不一样,有的是设置x,y,z轴的缩放倍数
    auto scaleBy = ScaleBy::create(3,0.5);
    ico->runAction(scaleBy);
}
//测试ScaleTo的方法
void ActionScene::testScaleTo(){
    //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半大小
    //构造方法有多个,参数不一样,有的是设置x,z轴的缩放倍数
    auto scaleTo = ScaleTo::create(3,0.5);
    ico->runAction(scaleTo);
}

旋转:

//测试rotateTo的方法
void ActionScene::testRotateTo(){
    //创建一个rotateTo动作,第一个参数是时间,第二个参数是旋转角度
    //这里是使用节点在5秒内旋转180度
    //也有其它参数的构造方法,比如设置x,y轴等
    auto rotateTo = RotateTo::create(5,180);
    ico->runAction(rotateTo);
}
//测试rotateBy的方法
void ActionScene::testRoteteBy(){
    //创建一个rotateTo动作,第一个参数是时间,第二个参数是旋转角度
    //这里是使用节点在5秒内旋转180度
    //也有其它参数的构造方法,比如设置x,y轴等
    auto rotateBy = RotateBy::create(5,180);
    ico->runAction(rotateBy);
}

淡入淡出的效果:

//测试fadeIn的方法
void ActionScene::testFadeIn(){
    //淡入,参数表示时间,这里是5秒
    auto fadeIn = FadeIn::create(5);
    ico->runAction(fadeIn);
}
//测试fadeOut的方法
void ActionScene::testFadeOut(){
    //淡出,参数表示时间
    auto fadeOut = FadeOut::create(5);
    ico->runAction(fadeOut);
}


色调的变化:

//测试色调tintBy的方法
void ActionScene::testTintBy(){
    //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值
    auto tintBy = TintBy::create(3,100,100);
    ico->runAction(tintBy);
}
//测试色调tintTo的方法
void ActionScene::testTintTo(){
    //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值
    auto tintTo = TintTo::create(3,100);
    ico->runAction(tintTo);
}

视觉特效动作:

闪烁动作:
//测试闪烁动作的方法
void ActionScene::testBlink(){
    //创建一个闪烁的动作,第一个参数是闪烁的时间,第二个参数是闪烁次数
    //这里是,在5秒内闪烁10次
    auto blink = Blink::create(5,10);
    ico->runAction(blink);
}

动画:

//测试动画效果
void ActionScene::testAnimation(){
    //先把动画图片存储进精灵帧缓存
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
    //声明一个精灵侦的向量集合
    Vector<SpriteFrame*> frames;
    //一个for循环,取出图片里面包含的精灵帧
    for (int i=1; i<=14; i++) {
        //取出一帧的名字,后面是一个图片名字表达式
        __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",i);
        //利用帧的名字,从缓存中取出这一帧的指针
        SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_name->getCString());
        //把这一帧压进精灵帧的集合
        frames.pushBack(frame);
    }
    //根据精灵帧建立一个动画,第一个参数是精灵帧的集合,第二个参数是帧与帧之间的延迟时间
    Animation* anim = Animation::createWithSpriteFrames(frames,1.0f/24.0f);
    //运行动画
    ico->runAction(Animate::create(anim));
}

控制动作与顺序执行动作:

这是一类特殊的动作,用于对一些动作进行精确地控制,利用这一类动作,可以实现一些非常实用的功能 ,因为它们是十分有用的,这类动作包括DealyTime,Repeat和RepeatForever等。DelayTime可以将动作延迟一定的时间执行,Repeat可以重复一定的次数,RepeatForever可以使一个动作不断重复下去,下面是代码:


void ActionScene::testControlAction(){
    //创建一个moveBy动作
    auto moveBy = MoveBy::create(2,20));
    //这也是一个动作,这表示moveBy动作返回执行
    auto r = moveBy->reverse();
    //这是一个延迟时间,参数的延迟的时间
    auto delayTime = DelayTime::create(3);
    
    //一个动作的集合,参数可以添加多个动作,最后以NULL结束
    //它会顺序执行这些动作,先执行第一个,然后第二个……
    auto sequence = Sequence::create(moveBy,r,delayTime,NULL);
    //创建一个重复,第一个参数是动作集合,第二个参数是重复次数
    auto repeat = Repeat::create(sequence,2);
    //创建一个永久重复,只需要添加动作就可以了
    auto repeatForever = RepeatForever::create(sequence);
    
    //执行动作
    ico->runAction(repeat);
}

并列执行一些动作:

void ActionScene::testSpawnAction(){
    //创建一个moveBy动作
    auto moveBy = MoveBy::create(2,20));
    
    
    //先把动画图片存储进精灵帧缓存
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
    //声明一个精灵侦的向量集合
    Vector<SpriteFrame*> frames;
    //一个for循环,取出图片里面包含的精灵帧
    for (int i=1; i<=14; i++) {
        //取出一帧的名字,后面是一个图片名字表达式
        __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",1.0f/24.0f);
    
    
    //一个动作的集合,参数可以添加多个动作,最后以NULL结束
    //它会并列执行这些动作,所有的动作,同时执行
    auto spawn = Spawn::create(moveBy,Animate::create(anim),NULL);
    
    //执行动作,这里,它会一边播放动画,一边移动
    ico->runAction(spawn);
}

动作的速度控制:

1:speed
可能 线性地改变动作的速度,可以成倍在实现快放或者慢放。

2:ActionEase
它是一些效果的封装。它包括了15个动作,可以概括为5类,如下图所示:


代码如下:

//测试速度的方法
void ActionScene::testSpeed(){
    //创建一个move动作,时间是5秒
    auto moveTo = MoveTo::create(5,100));
    //创建一个速度控制,第一个参数是一个动作,第二个参数是速度的倍数,这里把动作提高到5倍
    auto speed = Speed::create(moveTo,5);
    
    
    
    //创建其它速度控制的方法是一样的,这里一并写下来
    
    auto easeIn = EaseIn::create(moveTo,5);
    
    
    //动行动作
    ico->runAction(speed);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读