一个cc.blink动作的bug

情景是这样的,我开启了一个blink动作,使其一直运行,直到计时的时间到达为止,然后就会出现一种情况,闪烁效果的组件,有时候在停止了闪烁后不会显示出来,代码如下。

let blinksAction = cc.blink(2,5);
this.button.node.runAction(blinksAction.repeatForever());
setTimeout(() => {
this.button.node.stopAction(blinksAction );
blinksAction = null;
}, 3000);

当3秒到达后,button停止闪烁了,但button没有显示出来,你们可以试一下,多调整一下闪烁次数和等参数,很容易出现停止闪烁后显示不出来的问题,请问这个问题能着手解决掉吗?

3秒之后设置为显示不行的嘛?

我用的是Cocos Creator 1.4.2版本,用你的代码试了一下,最终是显示出来的。

================================================

因为你这边没有显示出来,并且我也不知道你这边是什么情况,所以提供两种解决办法:
1.办法1:计算好要闪烁的时间,比如这里是3秒,但是你是2秒闪烁5次,那么三秒就是闪烁7.5次,想下取整是7次,所以代码可以写成

let blinksAction = cc.blink(3, 7);
this.button.node.runAction(blinksAction);

2.办法2:通过查看cc.blink的源码可以发现,blink操作的其实是节点的opacity,所以在stopAction的时候加上一句

this.button.node.opacity = 255;

附:cc.blink的源码:

        cc.Blink = cc.ActionInterval.extend({
            _times: 0,
            _originalState: false,
            ctor: function(duration, blinks) {
                cc.ActionInterval.prototype.ctor.call(this);
                void 0 !== blinks && this.initWithDuration(duration, blinks);
            },
            initWithDuration: function(duration, blinks) {
                if (cc.ActionInterval.prototype.initWithDuration.call(this, duration)) {
                    this._times = blinks;
                    return true;
                }
                return false;
            },
            clone: function() {
                var action = new cc.Blink();
                this._cloneDecoration(action);
                action.initWithDuration(this._duration, this._times);
                return action;
            },
            update: function(dt) {
                dt = this._computeEaseTime(dt);
                if (this.target && !this.isDone()) {
                    var slice = 1 / this._times;
                    var m = dt % slice;
                    this.target.opacity = m > slice / 2 ? 255 : 0;
                }
            },
            startWithTarget: function(target) {
                cc.ActionInterval.prototype.startWithTarget.call(this, target);
                this._originalState = target.opacity;
            },
            stop: function() {
                this.target.opacity = this._originalState;
                cc.ActionInterval.prototype.stop.call(this);
            },
            reverse: function() {
                var action = new cc.Blink(this._duration, this._times);
                this._cloneDecoration(action);
                this._reverseEaseList(action);
                return action;
            }
        });
        cc.blink = function(duration, blinks) {
            return new cc.Blink(duration, blinks);
        };
1赞

我知道你说的意思,但是你不能保证每次都能显示,可以通过计算间隔时间的方式来让其显示,但是这并不是一个最保险的方式,可能在你运行的过程中有些其他的影响造成计算的结果是正确的但运行结果出现偏差,我是试出来了的,有时候确实可以通过你那种方式来做,也确实基本没有显示不出来的时候,但是有的时候停止闪烁是手动触发的,这种情况我不知道你试过没有,一个简单的用例,比如说你收到一个邮件,邮件图片有一个闪烁的效果,当你手动点击了,闪烁效果就没了,一般的情况,这个频率是一秒一次,这个只是打个比方,但是我也出现过点击停止动作,那个组件没有显示出来的情况,你可以多试几次,我想表达的是,没有显示出来的情况有,出现的情况是在你指定动作一直运行然后手动停止的时候或者运行一段时间有条件的停止,至少能让我有办法强制让组件显示出来,现在情况就是如果出现了组件不显示的情况,我没办法让其显示出来了