如题,我现在是非cc.component的自定义类里面使用定时器,这时候没法用this.scheduleOnce了,只能自己调用cc.director.getScheduler(),但发现里面只有schedule方法,而为什么没有scheduleOnce方法?
请各位老师指教,谢谢!
如题,我现在是非cc.component的自定义类里面使用定时器,这时候没法用this.scheduleOnce了,只能自己调用cc.director.getScheduler(),但发现里面只有schedule方法,而为什么没有scheduleOnce方法?
请各位老师指教,谢谢!
感觉非常不理解啊。。。
component里的也只不过是封装一下而已,也是调用schedule
我是在自己定义的Node类里面想实现定时器,现在有点糊涂。
我在自定义的Node类里的构造函数ctor里先cc.director.getScheduler().enableForTarget(this);这里的this是Node节点自己。然后调用cc.director.getScheduler().schedule实现自己的定时部分。
现在cc.director.getScheduler().schedule报错 cc.Scheduler: Illegal target which doesn’t have uuid or instanceId
你可以用js的setInterval()或者setTimeout()
或者用update 自己封装一个
唉,本来用setTimeOut,但setTimeOut退出场景时不销毁节点,导致程序崩溃。scheduleOnce能避免这些问题。
自定义类继承一下cc.component就能用了吧
这个不行吧,因为是自定义的节点类,已经继承于节点了。
自己手动销毁一下不行吗?
@ccclass
class A extends cc.Component {
timer = 0;
onClick(){
this.timer = setTimeout(()=> {},1000)
}
onDestory(){
clearTimeout(this.timer)
}
}
感谢楼上二位的回复,自己clear掉setTimeout这种方式肯定行。但因为用了非常多的setTimeout,如果这样,设置的变量很多,最后clear起来很麻烦(另外,一些动画工具类里面也有setTimeout)。
另外,主要是既然官方提供了schedulOnce这种能退出时自动销毁的方式,还是希望研究透彻点。
不是没有解决方案,比如使用延迟动作代替定时器等等。但就是想搞清schedulOnce的机制。毕竟这应该是官方最推荐的方式
你的Node类实现IScheduler接口了么
我在自定义的Node类里的构造函数ctor里先cc.director.getScheduler().enableForTarget(this);这里的this是Node节点自己。这算是实现接口了吗?
最好上传个demo
继承自cc.Node,然后在constructor里面addComponent(cc.Component),保存下这个comp的引用,这样就可以用scheduleOnce了
大概就是下面这样:
var GameNode = cc.Class({
extends: cc.Node,
properties: {
},
ctor: function () {
cc.director.getScheduler().enableForTarget(this);
},
onLoad(){
cc.director.getScheduler().schedule(() => {
console.log("test schedule")
}, 1,6);
}
});
您的意思是为了用scheduleOnce,特意addComponent(cc.Component)一下?感觉理论上好像可以,但多少有点偏方。。。。没别的意思,非常感谢!这种方式我确实没尝试过
这思路确实挺巧妙,实现起来也方便,唯一有点美中不足就是可能程序的可读性稍微有一点点。。。别人维护起来可能先蒙圈一下,呵呵
方法调用错了啊 
你的target没传入啊
你可以参考component封装一下