在游戏开发中,动作效果是提升游戏体验的重要元素之一,Cocos2d-JS 作为一款强大的游戏开发引擎,提供了丰富多样的动作(Action)功能,让开发者能够轻松地为游戏角色、场景等元素添加各种生动的动画效果。
基本动作
1、移动类动作:
MoveTo:使节点在指定的时间(duration
)内移动到指定的位置(position
)。
var action = cc.moveTo(2, cc.p(100, 100)); this.node.runAction(action);
这将使当前节点在 2 秒内移动到坐标为 (100, 100) 的位置。
MoveBy:让节点在指定时间内按照给定的偏移量(deltaPosition
)进行移动。
var action = cc.moveBy(3, cc.p(50, 50)); this.node.runAction(action);
意味着节点会在 3 秒内沿 x 轴正方向移动 50 个单位,沿 y 轴正方向也移动 50 个单位。
2、旋转类动作:
RotateTo:在规定的时间(duration
)内将节点旋转到指定的角度(angle
),角度以度为单位,示例代码如下:
var action = cc.rotateTo(4, 90); this.node.runAction(action);
此代码会让节点在 4 秒内旋转到 90 度。
RotateBy:使节点在给定的时间(duration
)内旋转一定的角度(deltaAngle
),同样是以度为单位。
var action = cc.rotateBy(5, 45); this.node.runAction(action);
即节点将在 5 秒内旋转 45 度。
3、缩放类动作:
ScaleTo:在指定的时间内将节点缩放到指定的尺寸(scale
)。
var action = cc.scaleTo(3, 2); this.node.runAction(action);
这会使节点在 3 秒内放大到原来的 2 倍。
ScaleBy:让节点在给定的时间按照一定的比例(deltaScale
)进行缩放。
var action = cc.scaleBy(4, 1.5); this.node.runAction(action);
表示节点会在 4 秒内放大 1.5 倍。
组合动作
1、顺序执行动作(Sequence):将多个动作按照先后顺序依次执行,先让节点移动一段距离,然后旋转一定角度,再缩放一定比例,可以这样实现:
var moveAction = cc.moveTo(2, cc.p(200, 200)); var rotateAction = cc.rotateTo(3, 45); var scaleAction = cc.scaleTo(4, 1.5); var sequenceAction = cc.sequence([moveAction, rotateAction, scaleAction]); this.node.runAction(sequenceAction);
2、并行执行动作(Spawn):使多个动作同时开始执行,同时让节点移动和旋转:
var moveAction = cc.moveTo(5, cc.p(300, 300)); var rotateAction = cc.rotateBy(5, 90); var spawnAction = cc.spawn([moveAction, rotateAction]); this.node.runAction(spawnAction);
3、重复动作(Repeat & RepeatForever):
Repeat:指定一个动作和一个重复次数,让该动作重复执行指定的次数,让节点闪烁 3 次:
var blinkAction = cc.fadeOut(1).reverse(); // 创建一个淡入淡出的动作,代表一次闪烁 var repeatAction = cc.repeat(blinkAction, 3); this.node.runAction(repeatAction);
RepeatForever:无限重复执行某个动作,让节点不停地旋转:
var rotateAction = cc.rotateBy(2, 360); var repeatForeverAction = cc.repeatForever(rotateAction); this.node.runAction(repeatForeverAction);
延迟动作
1、DelayTime:在指定的时间(delay
)内暂停节点的动作执行,让节点在开始下一个动作前暂停 3 秒:
var delayAction = cc.delayTime(3); this.node.runAction(delayAction);
2、Sequence 结合 DelayTime:可以在一组动作序列中使用DelayTime
来实现动作之间的间隔,先移动,暂停,再旋转:
var moveAction = cc.moveTo(2, cc.p(100, 100)); var delayAction = cc.delayTime(2); var rotateAction = cc.rotateTo(3, 45); var sequenceAction = cc.sequence([moveAction, delayAction, rotateAction]); this.node.runAction(sequenceAction);
动作的克隆与倒转
1、Clone:可以克隆一个已有的动作,以便在不同的节点上重复使用或进行修改。
var originalAction = cc.moveTo(2, cc.p(200, 200)); var clonedAction = originalAction.clone(); this.node.runAction(clonedAction);
2、Reverse:将一个动作的顺序倒转过来执行,有一个由缩放和移动组成的动作序列,通过Reverse
可以让节点先移动再缩放:
var originalAction = cc.sequence([cc.scaleTo(2, 2), cc.moveTo(3, cc.p(300, 300))]); var reversedAction = originalAction.reverse(); this.node.runAction(reversedAction);
动作的停止与暂停
1、StopAction:用于停止节点上正在执行的所有动作。
this.node.stopAllActions();
2、PauseAction:暂停节点上所有动作的执行,可以通过后续的操作恢复动作执行,不过需要注意的是,Cocos2d-JS 本身并没有直接提供PauseAction
这个 API,通常需要开发者自己记录动作的状态并手动管理暂停和恢复的逻辑。
动作的回调函数
1、CallFunc:在动作执行完毕后调用一个特定的函数,当一个移动动作完成后执行一个自定义的函数:
var callBackFunction = function(){ console.log("Move action completed!"); }; var moveAction = cc.moveTo(2, cc.p(100, 100)); var callFuncAction = cc.callFunc(callBackFunction, this); var sequenceAction = cc.sequence([moveAction, callFuncAction]); this.node.runAction(sequenceAction);
2、CallFuncN:类似于CallFunc
,但可以传递参数给回调函数。
var callBackFunction = function(param){ console.log("Move action completed with parameter: " + param); }; var moveAction = cc.moveTo(2, cc.p(100, 100)); var callFuncNAction = cc.callFuncN(callBackFunction, this, "TestParameter"); var sequenceAction = cc.sequence([moveAction, callFuncNAction]); this.node.runAction(sequenceAction);
应用场景举例
1、游戏角色的移动攻击:当玩家点击敌人时,让角色先快速冲向敌人(使用MoveTo
),接近敌人后发动攻击动作(可以是一个简单的动画效果),然后返回原位(再次使用MoveTo
),可以使用Sequence
将这些动作组合起来,并且可以通过Repeat
让角色能够多次攻击敌人。
var moveToEnemy = cc.moveTo(1, enemyPosition); var attackAction = cc.scaleTo(0.5, 1.2).reverse(); // 简单的攻击动画,先放大再缩小 var moveBack = cc.moveTo(1, originalPosition); var sequenceAction = cc.sequence([moveToEnemy, attackAction, moveBack]); var repeatAction = cc.repeat(sequenceAction, Infinity); // 根据实际需求设置重复次数 this.node.runAction(repeatAction);
2、游戏中的道具收集:当玩家收集到一个道具时,让道具闪烁几次(使用Repeat
和FadeInOut
),然后消失(使用RemoveSelf
),可以使用CallFunc
在道具消失后更新玩家的道具数量等信息。
var fadeInOutAction = cc.fadeIn(0.5).reverse().repeat(3); var removeSelfAction = cc.removeSelf(); var sequenceAction = cc.sequence([fadeInOutAction, removeSelfAction]); this.node.runAction(sequenceAction); // 同时可以在游戏中的道具管理系统中更新道具数量等信息
Q&A
Q1:如何让一个动作在执行过程中改变速度?
A1:Cocos2d-JS 本身没有直接提供在动作执行过程中动态改变速度的 API,但你可以通过一些变通的方法来实现类似的效果,比如将动作拆分成多个小的动作片段,在不同的片段中使用不同的速度执行动作,然后通过Sequence
将这些片段组合起来,或者使用定时器在动作执行过程中不断地调整节点的属性来模拟速度变化的效果,不过这种方法比较复杂且可能需要根据具体的需求进行详细的调试和优化。
Q&A
Q2:如何判断一个动作是否执行完毕?
A2:可以通过监听动作的回调函数来判断动作是否执行完毕,在使用CallFunc
或CallFuncN
时,在回调函数中可以添加相应的逻辑来处理动作执行完毕后的操作,有些动作本身可能具有完成标志或状态属性,你可以定期检查这些属性来判断动作是否结束,但这需要对 Cocos2d-JS 的源码有一定的了解并且不是所有的动作都支持这种方式。
到此,以上就是小编对于“cocos2djs动作”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/827285.html