Java 在阵列中制作圆(基于平铺的游戏灯光贴图)
我正在用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
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,这意味着没有任何内容会变得更轻,并且该条件从未满足。请尝试将其删除以进行测试。