一个node下只可以有一个动画吗?

假如一个守门员需要做出向左,向右的动作,但动画编辑器只能对一个节点做动画。

你是说向左的同时又向右吗?这个应该做不到

如果你说的是一个node需要多个动画的话,你在资源管理器鼠标右键新建clip,然后后添加到node下面的animation组件的clip数组里,然后就可以在动画编辑器编辑各个动画了

我的意思是根据球的位置做动画反应,谢谢神盾局

你添加多个clip,然后根据自定义条件来选择播放哪一个就行了啊:open_mouth:

不知道是不是没有理解到你的意思?

一个node可以有一个Animation组件,一个Animation组件里可以有多个Clips,默认播放Default Clip。每个Clip里可以编辑一个动画,动画编辑器左下角可以切换当前编辑的Clip。比如有两个Clip,叫left和right,
node.getComponent(cc.Animation).play(‘left’)
node.getComponent(cc.Animation).play(‘right’)

1赞

我是在做完一个图向右移动的时候,希望添加同一张图向左的动画,结果发现只能修改,不能添加,我是用另一张图实现的向左的动画。
一个节点下的一张是不是只能实现一个动画?图的相矛盾的动画只能用另一张相同的图实现。

额,我还是不知道你是什么意思

我猜一下

1.一个球员的sprite在向右移动,向右移动完成之后,再向左移动

2.向右移动的同时又向左移动

你是想要那种?

(弱弱的说一下,描述尽量详细一点,比如你说的只能修改,不能添加,什么东西只能修改不能添加?,比如什么一个节点下的一张是不是只能实现一个动画,我都看不懂:joy:,尽量用creator里的术语来描述,比如cc.Animation只能修改clip,不能添加clip,比如一个节点是不是只能播放一个clip)

或者你直接说你想要达到的效果也行

我以前没有编程语言的基础的,4月才开始自学,术语不怎么会说,不好意思,不过以后我会尽力让自己规范化的。我在一个脚本写了一个监听事件,希望随机发送数字,(足球踢了出去)
onTouchEnded: function (touch, event) { // 点击事件结束处理
this.move(this.node.x,this.node.y);
var i = Math.floor(Math.random())
this.node.emit(‘i’);
}.bind(self)

另一个脚本,监听,收到随机数字,然后播放动画。(守门员的反应,向左或者向右扑球)
onLoad: function () {
this.ball.on(‘0’,this.play,this)
this.ball.on(‘1’,this.play1,this)
},

play:function(){
    this.getComponent(cc.Animation).play(this.AnimName)
},
play1:function(){
    this.getComponent(cc.Animation).play(this.AnimName2)
}

没关系,慢慢来,我也只比你早几个月自学:joy:

从你代码来看应该是你想要的效果啊,现在是哪里有问题呢?

0和1收不到,
var i = Math.floor(Math.random())
this.node.emit(‘i’);
这段应该有问题,虽然我可以加条件判断发送0或1,但我还是希望随机发送0,1

首先,on和emit都是node的成员方法,也就是你在哪个node发送的事件,只有这个node才能接收到,所以你this.node.emit()发送的事件只有this.node才能收到,所以你在this.ball上添加监听是收不到的

其次

这里你实际上发送的是事件名称为“i”的事件,而不是以变量i的值为事件名称的事件(事件名为“0”或者“1”),你并没有监听事件名为“i”的事件(你只监听了事件名为“0”和事件名为“1”的事件),如果你想发送以变量i的值为事件名称的事件,应该这样

this.node.emit(i + “”);

这样发送的事件就是“0”事件或者“1”事件

还有你也不必监听两次,只需要像这样

监听:
this.node.on(‘out’,this.play,this)

play: function (event) {
    if(event.detail.rand == 0){
         //向左(或者向右)
    }else if(event.detail.rand == 1){
        //向右(或者向左)
    }
}

发送事件:

var r = Math.floor(cc.random0To1())
this.node.emit("out", {rand: r});

当然我没有测试过,你试试看:joy:

[quote=“atmy, post:11, topic:38961”]
首先,on和emit都是node的成员方法,也就是你在哪个node发送的事件,只有这个node才能接收到,所以你this.node.emit()发送的事件只有this.node才能收到,所以你在this.ball上添加监听是收不到的
[/quote]我是在ball发送事件的,所以是this.node,然后我把ball作为组件的,放在了运动员上,所以是this.ball监听。
我按照你的方法试了,好像只能接受为0的事件。

哦哦,可能你代码只贴了一部分,所以我理解错了

不如你做个简单的demo我帮你看看吧,这样来的快一点

football.rar (468.5 KB)
代码写的不好,还希望多指教

我代码也写的不怎么样,所以没什么可以指教的:joy:

问题的原因是在ball.js里第35行,获取随机数那里

Math.floor是向下取整,也就是去掉小数部分(好像是这样的,比如随机数是0.6,Math.floor(0.6) 的返回值就是0),改成四舍五入

Math.round(cc.random0To1())

就可以了

1赞

谢谢神盾局,

这虽然是16年的贴子,但是我也忍不住回一下,怕别人搜到,没有答案。
为什么多个clip不能编辑,只能编辑一个,是因为切换clip的下拉菜单在界面底下,很容易被windows状态栏挡住,别问我为什么知道,我才知道。

1赞

感谢你

哈哈哈我20-22年 都经常忘