我目前正在使用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)
答案 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);