2017-09-11 1 views
0

J'ai besoin de créer une image de superposition avec une taille variable. Cependant, si j'utilise surface.setSize() lorsque j'essaie ensuite de stocker l'image résultante avec get(), l'esquisse se bloque avec ArrayIndexOutOfBoundsException. Pourquoi? Est-ce que size() initialise le canvas différemment?get() throws ArrayIndexOutOfBoundsException

final int w = 320; 
final int h = 240; 

PImage overlay; 

void setup() { 
    surface.setSize(w, h); // remove it, and you're ok 
    background(0);   // draw something 
    overlay = get();  // exception 
} 

Répondre

0

Jetez un oeil à this question, je ne peux pas beaucoup de commentaires sur le « pourquoi » des choses ici, mais pour autant que je peux comprendre, setSize() court après l'installation est terminée, car il ne peut pas courir tandis que les choses (dans ce cas, l'arrière-plan) sont en train d'être dessinées. Déplacement de cette ligne à la fin de l'installation ne produit pas en dehors des limites exception:

final int w = 320; 
final int h = 240;  

PImage overlay; 

void setup() {  
    background(0,200,150);  
    overlay = get();  
    surface.setSize(w, h); 
} 

void draw() { 
    tint(0,200,0); 
    image(overlay,50,0); 
} 

Modifier: Il semble que le get() dans ce cas est saisissant seulement la taille de fenêtre par défaut de pixels

Il existe une solution pour cela - vous pouvez commencer en déclarant size avec des dimensions raisonnables ou pratiquement toutes plus grandes que w et h, puis utilisez la méthode get() avec 4 paramètres pour saisir l'image selon le w et h dimensions:

final int w = 320; 
final int h = 240; 

PImage overlay; 

void setup() { 

    size(1000, 1000); //can be any numbers greater than w and h 
    background(0, 200, 150);  
    surface.setSize(w, h); 
    overlay = get(0, 0, w, h); 
} 

void draw() { 
    tint(0, 200, 0); 
    image(overlay, 50, 0); 
} 
0

Je suppose que vous utilisez surface.setSize() au lieu de size() parce que vous avez une erreur lorsque vous avez essayé de passer des variables dans la fonction size()? La solution à ce problème est pas pour appeler la fonction surface.setSize(). Au lieu de cela, vous devez définir une fonction settings() qui appelle ensuite la fonction size() avec des variables en tant que paramètres. Le reste de votre code resterait dans la fonction setup().

final int w = 320; 
final int h = 240; 

PImage overlay; 

void settings() { 
    size(w, h); 
} 

void setup() { 
    background(0); 
    overlay = get(); 
} 

Plus d'informations peuvent être trouvées dans the reference.

Une autre approche serait de se débarrasser complètement des variables w et h, et de passer simplement des nombres à la fonction size(). Ensuite, vous pouvez simplement utiliser les variables width et height partout où vous utilisiez précédemment les variables w et h.