2d阵列中的圆形效果用于照明

时间:2014-10-06 02:48:39

标签: javascript arrays computer-science

我正在制作一款基于平铺的游戏并正在实施照明。照明是在每个图块的基础上完成的,其中光的强度将是默认值,除非它靠近光源。在我更新灯光之前,我会浏览一系列瓷砖并检查是否有一个像这样的灯:

for(var y=this.x;y<(this.x+this.h);y++){
        for(var x=this.y;x<(this.y+this.w);x++){
            if(x>=0 && x<earth.plot.length && y>=0 && y<earth.plot.length){
                if(earth.plot[y][x].top==13){
                this.lights.push(new entity(x,y,this.baseintenseity/5));//adds new light source to the lights array with very bright intensity
                }
            }
        }
    }

在光线周围以光线强度下降的方式在光源周围添加更多光值的最佳方法是什么?制作一个简单的T模式很简单,我只是在添加灯光的部分下添加了一个for循环。看起来像这样:

var ln=5;
for(var i=0;i<ln;i++){
this.lights.push(new entity(x+(1+i),y,this.baseintenseity/(ln-i)));
this.lights.push(new entity(x-(1+i),y,this.baseintenseity/(ln-i)));
this.lights.push(new entity(x,y-(1+i),this.baseintenseity/(ln-i)));
this.lights.push(new entity(x,y+(1+i),this.baseintenseity/(ln-i)));
}

我真的只是想找到一种方法,将上面的内容快速转换为光源周围的放射状图案。强度下降。

1 个答案:

答案 0 :(得分:1)

想出来,我不得不做一个洪水填充方法。

var lights=[[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
        ];
var tiles=[[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
       ,[0,0,0,0,0]
        ];
var dx=[0,1,0,-1];
var dy=[-1,0,1,0];
function setlights(x,y,b,dir){
if(b<=0)
    return;

tiles[x][y]=1;
lights[x][y]=b;
for(var i=0;i<4;i++){
    if (i == dir) {
        continue;
    }
    var newx=x+dx[i];
    var newy=y+dy[i];
    var newdir = dir;
    if (newdir == -1) {
        newdir = (i+2)%4;
    }
    if(newx >= 0 && newx < tiles[0].length && newy >= 0 && newy < tiles.length){
        if (!tiles[newx][newy]) {
            setlights(newx, newy, b-1, newdir);
        }
    }
  }
}

这会使可变光充满强度数,然后我会变成我想要的强度。调用setlights(2,2,4,-1)可以解决问题并返回 01210 12321 23432 12321 01210