关于unschedule的使用方法

最近的飞机大战项目中,涉及到了玩家和敌人发射子弹的问题,我想着是写一个子弹发射器的类,里面负责添加子弹的工作,然后某一个敌人或玩家需要发射子弹的功能就在玩家或敌人类里添加一个子弹的control,这样复用起来比较方便,敌人的子弹发射类型也可以丰富起来,目前就差了一部,就是我玩家或敌人在死亡时会先播放一个动画,所以在播动画之前我需要停掉这个子弹发射器,这里出现了问题,不能正常停止,为了以后的扩展我不太想使用unscheduleAllCallbacks这个方法去停止,想让各位大神看一下怎么解决


代码如下:
//子弹发射器基类
var bulletControlBase = cc.Class({
ctor: function() {
//代理者
this.delegate = null;
//类型
this.type = null;
//子弹类型
this.bulletType = null;
//子弹所属
this.bulletGroup = null;
//添加位置
this.bulletPosition = cc.v2(0, 0);
//发射间隔
this.internal = null;
//重复次数
this.repeat = null;
//发射延时
this.delay = null;
},

//设置代理者
setDelegate: function(delegate) {
    this.delegate = delegate;
},

//开启发射器(有需要重写)
fireBullet: function() {
    var self = this;
    this.delegate.schedule(function(){
        //创建子弹
        var bullet = createBullet(self.delegate.bullet, self.bulletType);
        
        bullet.group = self.bulletGroup; //分组
        
        //位置
        bullet.setPosition(cc.pAdd(self.delegate.node.getPosition(), self.bulletPosition));
        self.delegate.node.parent.addChild(bullet);
        
    }, this.internal, this.repeat, this.delay);
},

//关闭发射器(有需要重写)
stopBulletControl: function() {
    
}

});

module.exports = bulletControlBase;


这是玩家的子弹发射器

var bulletControlBase = require(“bulletControlBase”);

//玩家发射器1
var playerBulletControl1 = cc.Class({
extends: bulletControlBase,
ctor: function() {
//类型
this.type = bulletControlType.player1;
//子弹类型
this.bulletType = bulletType.playerBullet1;
//子弹所属
this.bulletGroup = “playerBullet”;
//添加位置
this.bulletPosition = cc.v2(0, 20);
//发射间隔
this.internal = 0.2;
},

//创建子弹
createPlayerBullet: function() {
    //创建子弹
    var bullet = createBullet(this.delegate.bullet, this.bulletType);
    
    bullet.group = this.bulletGroup; //分组
    
    //位置
    bullet.setPosition(cc.pAdd(this.delegate.node.getPosition(), this.bulletPosition));
    this.delegate.node.parent.addChild(bullet);
},

//开启发射器(有需要重写)
fireBullet: function() {
    var self = this;
    this.delegate.schedule(self.createPlayerBullet.bind(self), self.internal);
},


//关闭发射器(有需要重写)
stopBulletControl: function() {
    var self = this;
    this.delegate.unschedule(self.createPlayerBullet.bind(self));
}

});

module.exports = playerBulletControl1;

这里面有开启和关闭两个方法,开启可以正常使用
比如玩家类里:
//开启子弹发射器
startBulletController: function() {
//玩家子弹发射器
this.bulletControl = createBulletControl(1);
this.bulletControl.setDelegate(this);
this.bulletControl.fireBullet();
},

关闭无法使用,stopBulletControl这个方法被调用了,但是unschedul没有起作用。另外在模拟器里玩家和敌人的发射器都可以正常使用,但是在网页上运行敌人子弹没有正常发射出来,也不知道是什么原因。

每人看下吗,感觉还是我用的有问题

看了眼代码,估计是这个问题:
self.createPlayerBullet.bind(self)会每次生成一个新函数,所以你schedule和unschedule传进去的函数不相同,就不能正常unschedule了。你试试在fireBullet里面把self.createPlayerBullet.bind(self)保存起来再用,比如(纯手打,未测试):

self.createPlayerBulletBindSelf = self.createPlayerBullet.bind(self);
...schedule(self.createPlayerBulletBindSelf...)
...unschedule(self.createPlayerBulletBindSelf...)

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

确实是,我光注意schedule方法内this指针指向的是this.delegate方法而加了一个bind却忘了bind后的函数已经不是最开始的那个方法了,谢谢

其实你根本不需要在后边 bind(this)啊,谁schudle的这个函数,这个函数里的this指针就是谁。不信你试试

厄,并不是,schedule方法内的this指针指向的是其调用者,在我的方法里就是this.delegate,而我需要的是this,因此需要var self = this,并在方法内bind(self),不加这个bind,createPlayerBullet方法内的this指向的会是this.delegate