- 注册时间
- 2013-2-20
- 最后登录
- 2020-1-26
- 阅读权限
- 45
- 积分
- 1866
- 精华
- 1
- 帖子
- 181
|
在lufylegend.js中运行以下代码会出现闪烁的问题:- LInit(50, "mygame", 600, 480, main);
- var img = null;
- var addIndex = 40, addSpeed = addIndex;
- function main () {
- var loader = new LLoader();
- loader.addEventListener(LEvent.COMPLETE, demoInit);
- loader.load("./gold_ingot.png");
- }
- function demoInit (e) {
- img = e.target;
- var layer = new LSprite();
- addChild(layer);
- layer.addEventListener(LEvent.ENTER_FRAME, function (e) {
- var s = e.currentTarget;
- if (addIndex++ > addSpeed) {
- addIndex = 0;
- var item = new Item();
- s.addChild(item);
- }
- });
- }
- function Item () {
- var s = this;
- LExtends(s, LSprite, []);
- var bmpd = new LBitmapData(img);
- var bmp = new LBitmap(bmpd);
- s.addChild(bmp);
- s.addEventListener(LEvent.ENTER_FRAME, s.loop);
- }
- Item.prototype.loop = function(e) {
- var s = e.currentTarget;
- s.x += 3;
- if (s.x > LGlobal.width) {
- s.remove();
- }
- };
复制代码 测试地址:http://wyh.wjjsoft.com/test/blink_bug/index.html
出现这类问题是因为调用remove函数删除自己破坏了父元素显示列表。ENTER_FRAME事件是在LSprite对象渲染完毕时调度的,子LSprite元素渲染函数是在父元素遍历显示列表childList时调用的,所以在这里面删除自己会导致父元素还未完成遍历显示列表,显示列表就已经被破坏了。为此,我查看了lufylegend里LSprite的ll_show方法:- _ll_show : function (c) {
- var s = this;
- s.graphics.ll_show();
- LGlobal.show(s.childList);
- s._ll_debugShape();
- },
复制代码 可见,要解决这个问题,可以通过更改LGlobal.show方法来实现,原来的LGlobal.show的代码如下:- LGlobal.show = function (s) {
- for (var i = 0, l = s.length; i < l; i++) {
- if (s[i] && s[i].ll_show) {
- s[i].ll_show();
- }
- }
- };
复制代码 由于用变量l保存了列表的length属性,删除自己时length改变了,但是l并没有改变,所以就出现遍历错误的问题。
更改后的代码如下:- LGlobal.show = function (s) {
- var list = s.slice(0, s.length);
- for (var i = 0, l = list.length; i < l; i++) {
- if (list[i] && list[i].ll_show) {
- list[i].ll_show();
- }
- }
- };
复制代码 更改后这个问题基本上就解决了
测试地址:http://wyh.wjjsoft.com/test/blink_bug/index2.html
除了上述的方法,还可以用一个数组保存需要删除的对象,在父元素的ENTER_FRAME事件中,清除这个列表里保存的对象,并清空这个数组。
|
|