Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在阵列中制作圆(基于平铺的游戏灯光贴图)_Java_Arrays_Tile - Fatal编程技术网

Java 在阵列中制作圆(基于平铺的游戏灯光贴图)

Java 在阵列中制作圆(基于平铺的游戏灯光贴图),java,arrays,tile,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; in

我正在用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;
    }
}
for(浮点i=0;i1-1/i)
map[y2][x2]=1-1/i;
}
}
结果:

正如您在结果中所看到的,似乎灯光在左下角(红色x)扩展过多。我该如何解决这个问题

背景信息:

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;
    }
}
强度:
光线到达的距离的半径。这也 确定阵列每个平铺处的灯光亮度

数组“map”是一个二维浮点数组。我使用的发动机使用浮子 alpha通道的值。范围为0(完全透明) 到1(完全不透明)

解决方案(由于基因):

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;
    }
}

for(int x2=-strength;x2您的算法会受到地图标记整数截断的影响。请在另一个方向上尝试。计算围绕中心的正方形中每个像素到中心的距离。从该距离计算强度应该是多少。如下所示:

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;
  }

for(x=-R;x当我试图将它添加到我的项目中时,我只得到了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]);
        }
    }
}
private float map[][]=new float[1000][1000];
公共空隙试验(int x、int y、浮力){
公共虚空附加光(整数x,整数y,整数强度){

对于(int x2=-strength;x2您可以添加另一个显示预期结果的图像吗?最好是只有一个光源,用于当前结果和预期结果。我对哪些变量表示什么有些困惑。R是圆的半径,R是到目前为止达到的半径吗?
R
可能等同于
强度谢谢!它现在工作得更好了。我稍微修改了它以适应我的设置。我把它放在我的问题中。再次感谢!这应该是一个注释,当它说“发布答案”时,这是它的意思,而不是问题。首先,该解决方案不起作用。检查我在“解决方案(感谢Gene)”下发布的解决方案还有,检查一下Gene的答案。这是我在那个算法中出错的原因,复制它不会有任何作用。很抱歉,我选错了方法,但当你使用新的方法时,我仍然会得到0@vedi0boy但是我还不能评论,我改变了方法,所以现在它显示正确:)你不能在一个方法中有一个方法……无论哪种方式,它都能工作。你必须仔细查看代码的每一部分。正如你所看到的“if”语句:
if(map[y+y2][x+x2]>1-(float)inv\u rad)
检查当前存在的内容是否更暗(值更高)默认情况下,当您创建浮点数组时,所有内容都是0.0,这意味着没有任何内容会变得更轻,并且该条件从未满足。请尝试将其删除以进行测试。