lufy's legend

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 7097|回复: 8
打印 上一主题 下一主题

消除类的游戏,消除时使用粒子效果,其他部分图片会闪烁

[复制链接]

8

主题

0

好友

104

积分

士兵

Rank: 1

跳转到指定楼层
楼主
发表于 2014-10-9 12:44:13 |只看该作者 |倒序浏览
当消除的区块时,给消除的区块加入的粒子效果。可是周边的其他图片会出现闪烁,不知道是什么问题
回复

使用道具 举报

8

主题

0

好友

104

积分

士兵

Rank: 1

沙发
发表于 2014-10-9 15:47:49 |只看该作者
例如,我点击颜色相同的区块。进行消除时,因为消除时会利用粒子效果,结果其他的小部分图片会出现闪烁现象
popApple.png
回复

使用道具 举报

37

主题

8

好友

9313

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

板凳
发表于 2014-10-9 20:11:21 |只看该作者
引擎不会导致你说的问题,
得看你的处理是不是会对其他地方产生影响
所以,方便的话,请贴出具体代码
不回答与技术和引擎不相关的问题
回复

使用道具 举报

8

主题

0

好友

104

积分

士兵

Rank: 1

地板
发表于 2014-10-10 14:06:53 |只看该作者
Star.prototype.onframe =function(event){
        var  self = event.target;
        var bitmapdata;  
    var bitmap;  
    var addY,addX;  
  
    if(self.lbitmap){  
      
        addY = 8;  
        self.lbitmap.y += addY;  
        if(self.lbitmap.y >= self.lbitmapHeight){  
            addY += self.lbitmapHeight - self.lbitmap.y;  
            self.lbitmap.y = self.lbitmapHeight;  
         
            self.removeChild(self.lbitmap);
            Main.gameBody.removeChild(self);
        }else{  
            self.lbitmap.bitmapData.setProperties(0,self.lbitmap.y,self.lbitmap.getWidth(),(self.lbitmapHeight - self.lbitmap.y));  
        }  
      
        var arr = [];  
        for(i=0;i<self.lbitmap.getWidth();i += 8){  
            addX = 8;  
            if(i+addX > self.lbitmap.getWidth()){  
                addX = self.lbitmap.getWidth() - i;  
            }  
           
            bitmapdata = new LBitmapData(Main.starImgs[self.index],i,self.lbitmap.y-addY,addX,addY);  
            bitmap = new LBitmap(bitmapdata);  
            bitmap.x = i;  
            bitmap.y = self.lbitmap.y-addY;  
            self.addChild(bitmap);  
            arr.push(bitmap);  
        }  
        if(self.lbitmap.y >= self.lbitmapHeight)self.lbitmap=null;  
        self.windList.push(arr);  
    }  
    self.windrun();
}

Star.prototype.windrun = function (){
        var self = this;

       
        var i,j,flag,ml=1;  
   
    for(i=0;i<self.windList.length;i++){  
        if(self.windList[i].length == 0){  
                self.windList.splice(i,1);  
            i--;  
            continue;  
        }  
        for(j=0;j<self.windList[i].length;j++){  
            if(self.windList[i][j].i == null)self.windList[i][j].i=1;  
            flag = Math.random();  
            if(flag < 0.3){  
                self.windList[i][j].x += ml*self.windList[i][j].i;  
            }else if(flag < 0.6){  
                    self.windList[i][j].x -= ml*self.windList[i][j].i;  
            }else{  
                    self.windList[i][j].y -= ml*self.windList[i][j].i;  
            }  
            self.windList[i][j].alpha -= 0.05;  
            self.windList[i][j].i += 2;  
            if(self.windList[i][j].alpha <= 0 || self.windList[i][j].x > LGlobal.width || self.windList[i][j].y > LGlobal.height){  
                    self.removeChild(self.windList[i][j]);  
                    self.windList[i].splice(j,1);  
                j--;  
            }  
        }  
    }
       
}

1.这个就是那个引用你那个粒子效果教程例子,然后就会导致其他图片会闪烁。
2.其次,还有个疑问。我新加一个图层用于显示粒子效果,把一个完整的图事先全部切割完毕。结果是在手机端访问时,有的机型比如Iphone下可以,小米只有UC和谷歌浏览器可以,然后其他浏览器会直接更新画面卡死。
function  LEffect (x,y,index){
        base(this,LSprite,[]);
        this.init(x,y,index);
}

LEffect.prototype.init = function (x,y,index){
       
        var self = this ;
        self.x = x;
        self.y = y;
        self.index = index;       
       
        self.dustList = new Array();
       
}

LEffect.prototype.resolve = function (){
        var  self = this;
        var seeX = 56;
        var seeY = 56;
        var index = 1;
        var bitmap  ;
        for(var x=0;x<168;x +=56){
                for(var y=0;y<168;y +=56){                       
                 bitmap = new LBitmap(new LBitmapData(Main.starImgs[5],x,y,seeX,seeY));
                 bitmap.x = x;
                 bitmap.y = y;
                 bitmap.si = 1;
                 self.addChild(bitmap);
                 self.dustList.push(bitmap);
                }
        }       
}



LEffect.prototype.onframe = function (event){
       
        var  self = event.target;
       
        var list = self.dustList;
        if(list.length>0){
                for(var i=0,len=self.dustList.length;i<len;i++){
                       
                        //if(list[i].si == null) list[i].si=1;
                        if(list[i]){
                                 flag = Math.random();
                                 
                                 if(flag < 0.25){  
                                         self.dustList[i].x += self.dustList[i].si;  
                         }else if(flag < 0.5){  
                                 self.dustList[i].x -= self.dustList[i].si;
                         }else if(flag<0.75){  
                                 self.dustList[i].y += self.dustList[i].si;
                         } else{
                                 self.dustList[i].y -= self.dustList[i].si;
                         }
                                 
                                 self.dustList[i].alpha -= 0.05;  
                                 self.dustList[i].si += 3;  
                         if(self.dustList[i].alpha <= 0 || self.dustList[i].x > LGlobal.width || list[i].y > LGlobal.height){
                                // console.log(self.dustList[i].name);
                             self.removeChild(list[i]);  
                             self.dustList.splice(i,1);  
                             i--;  
                         }  
                        }
                }
        }else{
                self.removeEventListener(LEvent.ENTER_FRAME,self.onframe);
                Main.gameBody.removeChild(self);
               
        }
       
       
}
回复

使用道具 举报

8

主题

0

好友

104

积分

士兵

Rank: 1

5#
发表于 2014-10-10 14:17:56 |只看该作者
选中色块,全部延迟调用的,这样会不会有影响。用新的图层显示粒子效果,就不会闪烁。但是,在手机端会出现一些问题,就和前面一个问题描述一样,机子不同,浏览器不同,会出现卡死现象。
//新图层加入粒子效果
Main.waitRemove = function (star,time){
        setTimeout(function(){
                var  effect = new LEffect( star.x , star.y,star.index);
                Main.gameBody.removeChild(star);
                Main.gameBody.addChild(effect);
                effect.resolve();               
                effect.addEventListener(LEvent.ENTER_FRAME,effect.onframe);
        },time*100);
       
}
//利用原图做粒子消除
Main.waitRemoveStar = function (star,time){
        setTimeout(function(){
               
                star.addEventListener(LEvent.ENTER_FRAME,star.onframe);               
               
        },time*100);
       
}
回复

使用道具 举报

8

主题

0

好友

104

积分

士兵

Rank: 1

6#
发表于 2014-10-10 15:23:26 |只看该作者
这里是完整的源码,和源文件。写得很凌乱

yuanma.zip

441.31 KB, 下载次数: 13970

回复

使用道具 举报

37

主题

8

好友

9313

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

7#
发表于 2014-10-10 22:02:26 |只看该作者
Ramsey 发表于 2014-10-10 15:23
这里是完整的源码,和源文件。写得很凌乱

看你的写法,你是把方块和粒子都放到了同一层吧,加上你使用了setTimeout不断的添加和删除,可能是这个过程令显示列表出现问题,
游戏层次最好分开,你实现粒子的时候,完全可以在另外一个LSprite容器中做,
另外,setTimeout用的有点多了,使用lufylegend开发游戏的话,setTimeout基本上可以不用
当然,你这个问题,最有可能的原因是方块和粒子在同一层
不回答与技术和引擎不相关的问题
回复

使用道具 举报

8

主题

0

好友

104

积分

士兵

Rank: 1

8#
发表于 2014-10-10 23:56:50 |只看该作者
lufy 发表于 2014-10-10 22:02
看你的写法,你是把方块和粒子都放到了同一层吧,加上你使用了setTimeout不断的添加和删除,可能是这个过 ...

是啊,我换一个图层之后。就会出现手机端浏览器兼容问题。会直接卡死,游戏无法进行。
我主要是想用setTimeout,做一个时间差。在视觉上来体现下坠效果。不用额外给方块加入向下,向左的运动动画了。(提问:lufy哥,这样合理吗?)
回复

使用道具 举报

37

主题

8

好友

9313

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

9#
发表于 2014-10-11 07:33:09 |只看该作者
Ramsey 发表于 2014-10-10 23:56
是啊,我换一个图层之后。就会出现手机端浏览器兼容问题。会直接卡死,游戏无法进行。
我主要是想用setTi ...

兼容问题?这个不太可能,应该是代码的问题了。
给你个优化建议吧,代码我虽然没有细看,但是从效果上来说,这个粒子没有太大必要,将粒子效果直接做成一组图片,使用LAnimation来实现的话效率必然会提升很多。
不回答与技术和引擎不相关的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

防止垃圾广告,请填写任意字符

Archiver|lufy's legend

GMT+8, 2024-5-22 03:59 , Processed in 0.055830 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部