2017-07-02 11 views
0

Je travaille actuellement sur un jeu 2D en Java et j'ai un peu de mal à mettre en place un cycle jour/nuit. J'ai actuellement un système en place qui dessine un rectangle semi-transparent sur l'ensemble de l'écran. Selon l'heure du jeu, le rectangle devient plus ou moins transparent. Le problème avec ceci est le taux de trame prend un coup énorme. Maintenant, j'essaie de prendre la valeur de couleur hexadécimale du pixel en cours d'affichage, de le diviser en valeurs RVB séparées, et de réduire ces valeurs, puis de renvoyer le nombre en hexadécimal pour le dessiner à l'écran .Java changeant la couleur de l'image pour représenter le cycle jour/nuit

Ceci est mon code pour le moment. Mon problème est que si les valeurs sont supérieures à 99, le programme se bloque.

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; 

} 

Lorsque je plante, c'est ce que je reçois.

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

qui fait la ligne plantage du programme sur? quel est le message d'erreur? – Dziugas

+0

Me rappelle de Castlevania 2: Simon's Quest - "Quelle horrible nuit d'avoir une malédiction." –

+0

vous vérifiez si la chaîne 'hex' contient plus d'un caractère, mais vous la manipulez en supposant que la chaîne contient 8 caractères, par ex. temp = hex.substring (6, 8) – Dziugas

Répondre

0

La 110.112.129 valeur en hexadécimal que vous essayez de convertir en int est égal à 4.564.525.353 en décimal - elle est supérieure à la valeur maximale d'un entier peut stocker:

Integer.MAX_VALUE est 2147483647

La cause en est que vous convertissez les valeurs r, b, g en une chaîne décimale au lieu d'une chaîne hexadécimale.

Au lieu de

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

essayer:

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