Java改变图像颜色以表示日/夜循环

时间:2017-07-02 02:13:18

标签: java image 2d lighting

我目前正在使用Java进行2D游戏,而且我在实施日/夜循环时遇到一些麻烦。我现在有一个系统在整个屏幕上绘制一个半透明的矩形。根据游戏中的时间,矩形变得或多或少透明。这个问题是帧速率受到了巨大冲击。

所以现在我试图获取当前显示的像素的十六进制颜色值,将其拆分为单独的RGB值,然后减少这些值,然后将数字返回为十六进制,以便将其绘制到屏幕。

这是我目前的代码。我的问题是如果值大于99,程序崩溃。

public int getRGB(String hex) {
    if (hex.length() > 1) {
        String temp;
        int colVal;
        temp = hex.substring(2, 4);
        red = Integer.parseInt(temp, 16);
        temp = hex.substring(4, 6);
        green = Integer.parseInt(temp, 16);
        temp = hex.substring(6, 8);
        blue = Integer.parseInt(temp, 16);
        colVal = darkenTile(red, green, blue);
        return colVal;
    } else {
        return 0;
    }
}

public int darkenTile(int r, int g, int b) {
    int col = 0;
    String red;
    String green;
    String blue;
    for (int i = 0; i < 20; i++) {
        if (r > 0) r--;
        if (g > 0) g--;
        if (b > 0) b--;
    }
    if (r == 0) red = "00";
    else red = Integer.toString(r);
    if (g == 0) green = "00";
    else green = Integer.toString(g);
    if (b == 0) blue = "00";
    else blue = Integer.toString(b);
    String hex = red + green + blue;
    System.out.println(hex);
    col = Integer.parseInt(hex, 16);
    return col;

}

当我崩溃时,这就是我得到的。

Exception in thread "Display" java.lang.NumberFormatException: For input string: "110112129"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at com.cousersoft.game.graphics.Screen.darkenTile(Screen.java:178)
    at com.cousersoft.game.graphics.Screen.getRGB(Screen.java:154)
    at com.cousersoft.game.graphics.Screen.renderTile(Screen.java:50)
    at com.cousersoft.game.level.tile.RockTile.render(RockTile.java:13)
    at com.cousersoft.game.level.Level.render(Level.java:84)
    at com.cousersoft.game.Game.render(Game.java:200)
    at com.cousersoft.game.Game.run(Game.java:163)
    at java.lang.Thread.run(Unknown Source)

1 个答案:

答案 0 :(得分:0)

您尝试转换为int的十六进制值110112129等于4,564,525,353(十进制) - 它大于整数可以存储的最大值:

Integer.MAX_VALUE是2,147,483,647

原因是你将r,b,g值转换为十进制字符串而不是十六进制字符串。

而不是

if (r == 0) red = "00";
else red = Integer.toString(r);
if (g == 0) green = "00";
else green = Integer.toString(g);
if (b == 0) blue = "00";
else blue = Integer.toString(b);

尝试:

if (r == 0) red = "00";
else red = Integer.toHexString(r);
if (g == 0) green = "00";
else green = Integer.toHexString(g);
if (b == 0) blue = "00";
else blue = Integer.toHexString(b);