在数组中制作圆圈(基于平铺的游戏光照贴图)

时间:2015-07-26 01:53:15

标签: java arrays tile

我在java中制作基于平铺的游戏,我想制作一张光照贴图。

我遇到了一些问题。我有光照贴图数组,其上放置了影响数组的灯光。灯发出圆圈形状。到目前为止似乎还不错,但这并不是我想要的。

到目前为止,这是我的代码:

for(float i = 0; i < strength + 1; i++){
    for(double u = 0.0f; u < 360; u += 0.5){
        double angle = u * Math.PI / 180;
        int x2 = (int)(x + i * Math.cos(angle));
        int y2 = (int)(y + i * Math.sin(angle));
        if(map[y2][x2] > 1 - 1 / i)
            map[y2][x2] = 1 - 1 / i;
    }
}

结果:

Result

正如你在结果中看到的那样,似乎光线在左下方(红色x)上扩展得太多了。我该如何解决这个问题?

背景信息:

  

强度:
  光到达的半径。这也是   确定光线在阵列的每个瓦片上的亮度。

     

数组“map”是2D浮点数组。我使用的引擎使用浮动   Alpha通道的值。范围是0(完全透明)   到1(完全不透明)。

解决方案(感谢Gene):

for(int x2 = -strength; x2 <= strength; x2++){
    for (int y2 = -strength; y2 <= strength; y2++) {
        double r = Math.sqrt(x2 * x2 + y2 * y2);
        double inv_rad = r <= strength + 1 ? 1 / r : 0;
        if(map[y + y2][x + x2] > 1 - (float) inv_rad)
            map[y + y2][x + x2] = 1 - (float) inv_rad;
    }
}

2 个答案:

答案 0 :(得分:3)

您的算法会受到地图标记整数截断的影响。试试另外一个人。计算从中心到中心的正方形中每个像素的距离。从这个距离计算出强度应该是多少。它将是这样的:

for (x = -R; x <= R; x++)
  for (y = -R; y <= R; y++) {
    double r = Math.sqrt(x * x + y * y);
    double inv_rad = r <= R ? 1 / r : 0; // truncate outside radius R
    map[yc + y][xc + x] = 1 - inv_rad;
  }

这里xc和yc是整数中心坐标。 R是中心周围盒子的一半大小。

答案 1 :(得分:0)

当我尝试将此添加到我的项目中时,我只能回到o.o 我输入的值是500,500,50

private float map[][] = new float[1000][1000];

 public void test(int x, int y, float strength){
    public void addLight(int x,int y,int strength ){
    for(int x2 = -strength; x2 <= strength; x2++){
        for (int y2 = -strength; y2 <= strength; y2++) {
            double r = Math.sqrt(x2 * x2 + y2 * y2);
            double inv_rad = r <= strength + 1 ? 1 / r : 0;
            if(map[y + y2][x + x2] > 1 - (float) inv_rad)
                map[y + y2][x + x2] = 1 - (float) inv_rad;
            System.out.println(map[y + y2][x + x2]);
        }
    }
}