1、游戏开发平台Cocos2D-xocos2d-X中的动作特效与动画2019/3/8xxxxxxxxxx12019/3/8xxxxxxxxxx2Cocos2D-x的基础类,包括节点类CCNode、导演类CCDirector、场景类CCScene、布景层、CCLayer和精灵类CCSprite等。这些类都是构成游戏画面的基本元素。但是游戏不仅是由静态画面构成的,更多时候,游戏是动态效果的呈现,所以动作、特效和动画是游戏区别于应用的特点,又是决定游戏质量的关键一环。因此,决定一个二维游戏引擎的好坏的重要因素是引擎对动作、特效和动画的支持程度。动作类2019/3/8xxxxxxxxxx3Cocos2D-
2、x的动作类CCAction并不是一个在屏幕中显示的对象,动作必须要依托于CCNode类及它的子类的实例才能发挥作用。C0C0S2D-x的动作包括位置移动、跳跃,甚至是对象颜色的渐变。CCAction类继承于对象类CCObject,有三个子类:有限时间动作、跟随、移动速度,其中有限时间动作分为瞬时动作(CCActionlnstant)和延时动作(CCActionlnterval)。CCAction 的主要函数2019/3/8xxxxxxxxxx42019/3/8xxxxxxxxxx5CCAction的子类CCFiniteTimeAction分为瞬时动作(CCActionlnstant)和延时动作
3、bCCActionlnterval)移动动作2019/3/8xxxxxxxxxx6Void ActionMove:onEnter()ActionsDemo:onEnter();centerSprites(3);CCSizes=CCDirector:sharedDirector()-getWinSize();CCActionlnterval*actionTo=CCMoveTo:create(2,CCPointMake(s.width-40,s.height-40);CCActionlnterval*actionBy=CCMoveBy:create(2,CCPointMake(80,80);CCA
4、ctionlnterval*actionByBack=actionBy-reverse;);_tamara-runAction(actionTo);_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);_kathia-runAction(CCMoveTo:create(1,CCPointMake(40,40);以上分别定义了CCMoveTo和CCMoveBy的实例。之前已经说过CCMoveBy是MoveTo的子类,CCMoveTo是移动到目标位置,而CCMoveB.是次目前位置的基础上移之到目标位置。创建函数crea
5、te的第一个参数是时间,第二个参数是位置对象。动作调用reverse函数会返回另外一个动作,使这个动作倒置,而精灵类实例在调用runAction函数时也会有不同,m_grossini精灵使用的就是动作序列CCSequence。CCSequence动作序列的定义由多个动作构成,create函数中以NULL参数作结尾,效果是作为参数传入的动作会颐序执行。缩放动作2019/3/8xxxxxxxxxx7Void ActionScale:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCScaleTo:
6、create(2.Of,0.5f);CCActionlnterval*actionBy=CCScaleBy:create(2.Of/l.Of,lO.Of);CCActionlnterval*actionBy2=CCScaleBy:create(2.Of,5.Of,l.Of;m_grossini-runAction(actionTo);m_tamara-runAction(CCSequence:create(actionBy,actionBy-reverse(),NULL);m_kathia-runAction(CCSequence:create(actionBy2,actionBy2-reve
7、rse(),NULL);以上分别定义了CCScaleTo和CCScaleBy的实例。之前已经说过CCScaleBy是CCScaleTo的子类,CCScaleTo是缩放到相应比例,CCScaleBy是在目前基础上变化相应的缩放比例。create函数可以使用两个参数或者三个参数。两个参数的第一个参数是时间间隔,第二个参数是缩放比例。三个参数的第一个参数是时间间隔,第二个参数是x轴缩放比例,第三个参数是y轴缩放比例。扭曲动作2019/3/8xxxxxxxxxx8Void ActionSkew:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActi
8、onlnterval*actionTo=CCSkewTo:create(2,37.2f,-37.2f);CCActionlnterval*actionToBack=CCSkewTo:create(2,0,0);CCActionlnterval*actionBy=CCSkewBy:create(2,O.Of,-90.Of);CCActionlnterval*actionBy2=CCSkewBy:create(2,45.Of,45.0f);CCActionlnterval*actionByBack=actionBy-reverse();m_tamara-runAction(CCSequence:c
9、reate(actionTo,actionToBack,NULL);M_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia-runAction(CCSequence:create(actionBy2,actionBy2-reverse(),NULL);以上分别定义了CCSkewTo和CCSkewBy是实例。之前已经说过CCSkewBy是CCSkewTo的子类。二者关系和之前类似,以By结尾的参数是相对于目前值的过程量,以To结尾的参数是绝对的参数,不管现有状态如何,直接设置为参数的这个值。三个参数的
10、第一个参数是时间间隔,第二个参数是x轴扭曲参数,第三个参数是y轴扭曲参数。旋转动作2019/3/8xxxxxxxxxx9voidActionRotate:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCRotateTo:create(2,45);CCActionlnterval*actionTo2=CCRotateTo:create(2,-45);CCActionlnterval*actionToO=CCRotateTo:create(2,0);m_tamara-runAction(CCSe
11、quence:create(actionTo,actionToO,NULL);CCActionlnterval*actionBy=CCRotateBy:create(2,360);CCActionlnterval*actionByBack=actionBy-reverse();M_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia-runAction(CCSequence:create(actionTo2,actionToO-copy()-autorelease(),NULL);以上分别定义了CCR
12、otateTo和CCRotateBy的实例。之前已经说过CCRotateBy是CCRotateTo的子类,二者关系和之前类似。两个参数的第一个参数是时间间隔,第二个参数是旋转角度,这里的角度表示采用角度制。跳转动作2019/3/8xxxxxxxxxx10voidActionJump:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCJumpTo:create(2,CCPointMake(300,300),50,4);CCActionlnterval*actionBy=CCJumpBy:crea
13、te(2,CCPointMake(300,0),50,4);CCActionlnterval*actionUp=CCJumpBy:create(2,CCPointMake(0,0),80,4);CCActionlnterval*actionByBack=actionBy-reverse();m_tamara-runAction(actionTo);m_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia-runAction(CCRepeatForever:create(actionUp);以上分别定义
14、了CCJumpTo和CCJumpBy的实例。之前已经说过CCJumpTo是CCJumpBy的子类,二者关系和之前类似。四个参数的第一个参数是时间间隔,第二个参数CCJumpTo的是目标位置的绝对坐标,CCJumpBy的是相对于目前位置的相对坐标,第三个参数为跳跃高度,第四个参数是跳跃的次数。贝塞尔曲线动作2019/3/8xxxxxxxxxx11voidActionBezier:onEnter()ActionsDemo:onEnter();CCSizes=CCDirector:sharedDirector()-getWinSize();centerSprites(3);ccBezierConfi
15、gbezier;bezier.controlPoint_l=CCPointMake(0,s.height/2);bezier.controlPoint_2=CCPointMake(300,-s.height/2);bezier.endPosition=CCPointMake(300,100);CCActionlnterval*bezierForward=CCBezierBy:create(3,bezier);CCActionlnterval*bezierBack=bezierForward-reverse();CCAction*rep=CCRepeatForever:create(CCActi
16、onlnterval*)CCSequence:create(bezierForward,bezierBack,NULL);m_tamara-setPosition(CCPointMake(80,160);ccBezierConfigbezier2;bezier2.controlPoint_1=CCPointMake(100,s.height/2);bezier2.controlPoint_2=CCPointMake(200,-s.height/2);bezier2.endPosition=CCPointMake(240,160);CCActionlnterval*bezierTol=CCBez
17、ierTo:create(2,bezier2);m_kathia-setPosition(CCPointMake(400,160);CCActionlnterval*bezierTo2=CCBezierTo:create2,bezier2);m_grossini-runAction(rep);m_tamara-runAction(bezierTo1);m_kathia-runAction(bezierTo2);2019/3/8xxxxxxxxxx12 ccBezierConfig的三个参数需要配置,前两个是控制点,最后一个是终点。其中终点在CCBezierTo和CCBezierBy两个类中的运
18、行结果不同,依然是CCBezierTo的终点是绝对位置,而CCBezierBy是相对于目前位置的相对位置。控制点的设置分别控制在路径上的高峰和低谷的位置。如果走的路径与图中方向一致,苎两个控制点的纵坐标设置为一正一负。控制点纵坐标的正负决定是向下走还是向上绝对值决定移动的幅度。而横坐标是横坐标方向的移动,该值对于CCBezierBy是相对于目前位置的相对位置,于CCBezierTo的终点是绝对位置。如果需要图中曲线旋转90度的路径,就把两个控制点的横坐标分别设置为一正一负即可,然后交换x轴和y轴的要求 CCBezierTo和CCBezierBy都是贝塞尔曲线动作。create函数没有什么区别,
19、都是两个参数,第一个参数依然是动作时间,第二个参数是贝塞尔曲线的配置系数。.贝塞尔曲线是应用于二维图形应用程序的数学曲线,每一个顶点都有两个控制点,用于控制该顶点两侧曲线的弧度淡入淡出动作2019/3/8xxxxxxxxxx13Void ActionFade:onEnter()ActionsDemo:onEnter();centerSprites(2);m_tamara-setOpacity(0);CCActionlnterval*actionl=CCFadeln:actionWithDuration(l.Of);CCActionlnterval*actionlBack=actionl-rev
20、erse();CCActionlnterval*action2=CCFadeOut:actionWithDuration(l.Of);CCActionlnterval*action2Back=action2-reverse();m_tamara-runAction(CCSequence:actions(actionl,actionlBack,NULL);m_kathia-runAction(CCSequence:actions(action2,action2Back/NULL);std:StringActionFade:subtitle()returnFadeln/FadeOut;这里需要说明
21、的是,淡入首先要将不透明度设置为0。闪烁动作2019/3/8xxxxxxxxxx14voidActionBlink:onEnter()ActionsDemo:onEnter();centerSprites(2);CCActionlnterval*actionl=CCBlink:actionWithDuration(2,10);CCActionlnterval*action2=CCBlink:actionWithDuration(2,5);m_tamara-runAction(actionl);m_kathia-runAction(action2);色值渐变动作2019/3/8xxxxxxxxx
22、x15voidActionTint:onEnter()ActionsDemo:onEnter();centerSprites(2);CCActionlnterval*actionl=CCTintTo:actionWithDuration(2,255,0,255);CCActionlnterval*action2=CCTintBy:actionWithDuration(2,-127,-255,-127);CCActionlnterval*action2Back=action2-reverse();m_tamara-runAction(actionl);m_kathia-runAction(CCS
23、equence:actions(action2,action2Back/NULL)以上分别定义了CCTintTo和CCTintBy的实例,第一个参数是动作时间,后三个参数分别是颜色的R、G、B值。CCTintTo是直接设置色值,CCTintBy是在目前值上加上相应的值。摄像机动作类2019/3/8xxxxxxxxxx16第3章介绍了摄像机类CCCamera,动作中也有一个摄像机动作类CCOrbitCamera,它是摄像机环绕屏幕中心旋转所形成的动作。voidActionOrbit:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionl
24、nterval*orbit3=CCOrbitCamera:create(2,1,0,0,180,90,0);CCFiniteTimeAction*action3=CCSequence:create(orbit3,orbit3-reverse(),NULL);m_kathia-runAction(CCRepeatForever:create(CCActionlnterval*)actionl);m_tamara-runAction(CCRepeatForever:create(CCActionlnterval*)action2);m_grossini-runAction(CCRepeatFore
25、ver:create(CCActionlnterval*)action3);CCActionlnterval*move=CCMoveBy:create(3,CCPointMake(100,-100);CCActionlnterval*move_back=move-reverse();CCFiniteTimeAction*seq=CCSequence:create(move,move_back,NULL);CCAction*rfe=CCRepeatForever:create(CCActionlnterval*)seq);m_kathia-runAction(rfe);m_tamara-runA
26、ction(CCAction*)(rfe-copy()-autorelease();m_grossini-runAction(CCAction*)(rfe-copy()-autorelease();摄像机动作类2019/3/8xxxxxxxxxx17 旋转的坐标描述采用了球坐标。球坐标采用球面半径、与X轴夹角、与Z轴夹角这几个值来描述坐标点。摄像机动作类CCOrbitCamera的创建函数create有7个参数,第一个参数是动作时间,第二、三个参数是起始的坐标值中的半径和过程中的坐标值中的半径,第四、五个参数是起始的坐标值中的与z轴夹角和过程中的坐标值中的与z轴夹角,第六、七个参数是起始的坐标
27、值中的与x轴夹角和过程中的坐标值中的与x轴夹角。注意在使用摄像机旋转时,如果正在旋转的这个节点后面还有其他节点的话,可能会出现旋转的节点只有一部分显示出来的这种情况。这时只需要关闭OpenGL的深度检测,获得导演类并调用setDepthTest设置为false即可,如下面的代码所示:CCDirector:sharedDirector()-setDepthTest(false)。基本样条动作2019/3/8xxxxxxxxxx18在游戏中,有时会希望使用一些非常规轨迹能描述的运动轨迹,希望只是“告诉”游戏对象几个离散的点,游戏对象就可以根据这些离散的点模拟出相应的路径。当然,有相应的公式模拟出这
28、条曲线,那就是基本样条。Cocos2D-x中有沿基本样条路径移动动作类CCCardinalSplineTo和其子类实现这样的功能 其中CCCardinalSplineTo和CCCardinalSplineBy的关系与之前以“To”和“By”结尾的类类似,CCCatmullRomTo和CCCatmullRomBy也是这样的。它们都是采用基本样条的公式;不同的是,CCCatmullRomTo和CCCatmullRomBy的拉力系数是0.5,而之前的CCCardinalSplineTo和CCCardinalSplineBy的拉力系数是可以自定义的。画基本样条路径2019/3/8xxxxxxxxxx1
29、9Void ActionCardinalSpline:onEnter()ActionsDemo:onEnter();this-centerSprites(2);CCSizes=CCDirector:sharedDirector()-getWinSize();CCPointArray*array=CCPointArray:create(20);array-addControlPoint(ccp(0,0);array-addControlPoint(ccp(s.width/2-30,0);array-addControlPoint(ccp(s.width/2-30,s.height-80);arr
30、ay-addControlPoint(ccp(0,s.height-80);array-addControlPoint(ccp(0,0);CCCardinalSplineBy*action=CCCardinalSplineBy:create(3,array,0);CCActionlnterval*reverse=action-reverse();CCFiniteTimeAction*seq=CCSequence:create(action,reverse,NULL);M_tamara-setPosition(ccp(50,50);M_tamara-runAction(seq);CCCardin
31、alSplineBy*action2=CCCardinalSplineBy:create(3,array,1);CCActionlnterval*reverse2=action2-reverse();CCFiniteTimeAction*seq2=CCSequence:create(action2,reverse2,NULL);m_kathia-setPosition(ccp(s.width/2,50);m_kathia-runAction(seq2);M_pArray=array;array-retain();首先定义一个点数组,把路径的点放入点数组中。创建基本样条动作时,3个参数分别是动作
32、时间、点数组、拉力系数。CCCardinalSplineTo和CCCardinalSplineBy的区别是,由于第一个是绝对的,第二个是相对的,第二个定义点数组的时候,第一个点最好设置为(0,0),否则起始点会被忽略掉。可以重写布景层的draw函数来把路径画出来。画Catmull-Rom样条路径2019/3/8xxxxxxxxxx20voidActionCatmullRom:onEnter()ActionsDemo:onEnter();this-centerSprites(2);CCSizes=CCDirector:sharedDirector()-getWinSize();m_tamara-
33、setPosition(ccp(50,50);CCPointArray*array=CCPointArray:create(20);array-addControlPoint(ccp(0,0);array-addControlPoint(ccp(80,80);array-addControlPoint(ccp(s.width-80,80);array-addControlPoint(ccp(s.width-80,s.height-80);array-addControlPoint(ccp(80,s.height-80);array-addControlPoint(ccp(80,80);arra
34、y-addControlPoint(ccp(s.width/2,s.height/2);CCCatmullRomBy*action=CCCatmullRomBy:create(3,array);CCFiniteTimeAction*reverse=action-reverse();CCFiniteTimeAction*seq=CCSequence:create(action,reverse,NULL);m_tamara-runAction(seq);CCPointArray*array2=CCPointArray:create(20);array2-addControlPoint(ccp(s.
35、width/2,30);array2-addControlPoint(ccp(s.width-80,30);array2-addControlPoint(ccp(s.width-80,s.height-80);array2-addControlPoint(ccp(s.width/2,s.height-80);array2-addControlPoint(ccp(s.width/2,30);CCCatmullRomTo*action2=CCCatmullRomTo:create(3,array2);CCFiniteTimeAction*reverse2=action2-reverse();CCF
36、initeTimeAction*seq2=CCSequence:create(action2,reverse2,NULL);m_kathia-runAction(seq2);m_pArrayl=array;m_pArrayl-retain();m_pArray2=array2;m_pArray2-retain();CCCatmullRomTo和CCCatmullRomBy的用法和之前的那组类的用法一样,只是不需要第三个拉力系数参数。它们的区别和之前的也是一样的,也可以重写布景层的draw函数来把路径画出来。缓冲动作2019/3/8xxxxxxxxxx21在实现运动中,常常需要实现一些加速度或者
37、减速度的效果。Cocos2D-x引擎为我们提供了相应的实现接口,这样就不用再用原来的公式计算方法来实现加减速度的效果。Ease系列的方法改变了运动的速度,但是并没有改变总体时间。如果整个动作持续5s,那么整个时间仍然会持续5s。这些动作可以分成三类。Inactions:action(开始的时候加速)Outactions:action(结束的时候加速)InOutactions:action(开始和结束的时候加速)CCActionEase有很多子类,根据不同的缓冲公式来模拟加减速过程。缓冲动作的具体内容如下。1)指数缓冲:分别为EaseExponentialln、EaseExponentialOu
38、t、EaseExponentiallnOut。2)赛因缓冲:分别为EaseSineIn、EaseSineOut、EaseSineInOut。3)跳跃缓冲:分别为EaseBounceln、EaseBounceOut、EaseBouncelnOut。4)弹性缓冲:分别为EaseElasticIn、EaseElasticOut、EaseElasticInOut。5)回震缓冲:分别为EaseBackln、EaseBackOut、EaseBacklnOut。以上介绍的5种缓冲,加上基本的缓冲动作,一共6种缓冲动作,其定义如代码清单4-15所示。缓冲动作2019/3/8xxxxxxxxxx22/基本缓冲动
39、作CCEaseln:create(CCActionlnterval*)(move-copy()-autorelease(),2.5f);CCEaseOut:create(CCActionlnterval*)(move-copy()-autorelease(),2.5f);CCEaselnOut:create(CCActionlnterval*)(move-copy()-autorelease(),0.65f);/指数缓冲动作CCEaseExponentialln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseExponent
40、ialOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseExponentiallnOut:create(CCActionlnterval*)(move-copy()-autorelease();/赛因缓冲动作CCEaseSineln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseSineOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseSinelnOut:create(CCAct
41、ionlnterval*)(move-copy()-autorelease();缓冲动作2019/3/8xxxxxxxxxx23/跳跃缓冲动作CCEaseBounceln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBounceOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBouncelnOut:create(CCActionlnterval*)(move-copy()-autorelease();/弹性缓冲动作CCEaseElasticIn:c
42、reate(CCActionlnterval*)(move-copy()-autorelease();CCEaseElasticOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseElasticInOut:create(CCActionlnterval*)(move-copy()-autorelease(),0.3f);/缓冲动作CCEaseBackln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBackOut:create(CCActionlnte
43、rval*)(move-copy()-autorelease();CCEaseBacklnOut:create(CCActionlnterval*)(move-copy()-autorelease();第一个参数是要缓冲的动作,其中基本缓冲动作需要第二个参数是速率,弹性缓冲动作需要第二个参数是震动的周期,默认值为0.3。组合动作2019/3/8xxxxxxxxxx24在游戏中,游戏对象有时不是执行一个动作,有时是多个动作的动作序列,有时是同时执行几个动作序列。这时候就需要使用组合动作的方式将多个动作或按序列组织,或合成在一起。1.CCSequence1.CCSequence定义一个动作序列,可
44、以使用动作的定义一个动作序列,可以使用动作的CCArrayCCArray数组数组;也可以把所有的动作作为参数传入也可以把所有的动作作为参数传入createcreate函数中,函数中,最后结尾参数使用最后结尾参数使用NULL(NULL(空值)即可空值)即可;还可以把两个有限时间动作按顺序传人还可以把两个有限时间动作按顺序传人createcreate函数中。函数中。CCFiniteTimeAction*seq2=CCSequence:create(action2#reverse2,NULL);m_kathia-runAction(seq2);2.CCSpawn2.CCSpawnCCSpawnCCS
45、pawn动作是使被合成的动作同时进行。它的定义方法和动作序列一致动作是使被合成的动作同时进行。它的定义方法和动作序列一致CCAction*action=CCSpawn:create(CCJumpBy:create(2,CCPointMake(300,0),50,4),CCRotateBy:create(2,720),NULL);m_grossini-runAction(action);组合动作2019/3/8xxxxxxxxxx253.CCRepeat3.CCRepeat和和CCRepeatForeverCCRepeatForever除了以上两个可以实现多个动作的类外,还有可以使一个动作重复播
46、放的类,那就是除了以上两个可以实现多个动作的类外,还有可以使一个动作重复播放的类,那就是CCRepeatCCRepeat和和CCRepeatForeverCCRepeatForever。二者都可以使动作重复进行,不同之处就是。二者都可以使动作重复进行,不同之处就是CCRepeatCCRepeat可以在第二个参数中定义重复次数,而可以在第二个参数中定义重复次数,而CCRepeatForeverCCRepeatForever是一直重复的。是一直重复的。CCActionInterval*rep2=CCRepeat:create(CCFiniteTimeAction*)(seq-copy()-auto
47、release(),10);m_kathia-runAction(rep2);CCAction*rep2=CCRepeatForever:create(CCActionlnterval*)(seq-copy()-autorelease();m_kathia-runAction(rep2);跟随动作2019/3/8xxxxxxxxxx26跟随动作CCFollow是一个节点跟随另外一个节点的动作。voidActionFollow:onEnter()ActionsDemo:onEnter();centerSprites(1);CCSizes=CCDirector:sharedDirector()-g
48、etWinSize();m_grossini-setPosition(CCPointMake(-200,s.height/2);CCActionlnterval*move=CCMoveBy:create(2,CCPointMake(s.width*3,0);CCActionlnterval*move_back=move-reverse();CCFiniteTimeAction*seq=CCSequence:create(move,move_back,null);CCAction*rep=CCRepeatForever:create(CCActionlnterval*)seq);m_grossi
49、ni-runAction(rep);this-runAction(CCFollow:create(m_grossinifCCRectMake(0,0,s.width*2-100,s.height);可调整动作速度2019/3/8xxxxxxxxxx27可调整速度动作CCSpeed不是一个独立的动作,可以把它理解为是对目前动作的一个“包装”,经过这个“包装”以后,就可以实现“慢动作”和“快进”的效果。使用CCSpeed来处理很方便Void SpeedTest:onEnter()EaseSpriteDemo:onEnter();CCSizes=CCDirector:sharedDirector()
50、-getWinSize();CCActionlnterval*junpl=CCJunpBy:create(4#CCPointMake(-s.width+80,0),100,4);CCActionlnterval*jump2=jumpl-reverse();CCActionlnterval*rotl=CCRotateBy:create(4,360*2);CCActionlnterval*rot2=rotl-reverse();CCFiniteTimeAction*seq3_l=CCSequence:create(jump2,jumpl,NULL);CCFiniteTimeAction*seq3_