2017-08-15 1 views
-6

J'ai un problème avec mon code, j'essaie de rendre mon script spawn un différent chaque fois que je clique sur la souris, mais je reçois une erreur avec mon commutateur parce que j'utilise un aléatoire pour choisir un nombre différent à chaque fois. Je reçois cette erreur chaque fois que j'essaie d'exécuter le script et que je ne trouve pas l'erreur.Flotteur ne fonctionne pas avec le commutateur

Cannot switch on a value of type float. Only convertible int values, strings or enum variables are permitted 

Certaines balises et noms de variables sont en danois car je suis danois.

int posX = 100; 
int posX2 = 1820; 
int dirX = 1; 
int dirX2 = 1; 
boolean drawforest = true; 
int height = 1080; 
int width = 1920; 
//img = loadImage("BlueMorpho.png"); 
PImage img; 
int storrelse = 15; 
int storrelse2 = storrelse + 2; 
float skift = random(0,2); 

//setup()-metoden køres én gang, når sketchen startes 
void drawBackground() 
{ 
    color e = color(135, 206, 235); 
    fill(e); 
    rect(960, 270, 1920, 560); 
} 
void setup() 
{ 
    size(1920, 1080); 
    rectMode(CENTER); 
    drawBackground(); 
    color f = color(1, 142, 14); 
    fill(f); 
    rect(960, 820, 1920, 540); 
    //noLoop(); 
} 


//draw()-metoden kører i et loop, indtil den stoppes 
void draw() 
{ 
    switch(skift) 
    { 
    case 0: 
    img = loadImage("BlueMorpho.png"); 
    break; 
    case 1: 
    img = loadImage("BlueMorpho2.png"); 
    break; 
    default: 
    img = loadImage("BlueMorpho3.png"); 
    break; 
    } 



    if (drawforest) 
    { 
    drawForest(); 
    drawforest = false; 
    } 
    drawBackground(); 
    drawCloud(); 
    drawCloud2(); 
    posX = posX+1; 
    posX2 = posX2-1; 
    if (posX>width-20 || posX<20) 
    { 
    dirX=-dirX; 
    } 
    if (posX2>width-20 || posX<20) 
    { 
    dirX2=-dirX2; 
    } 
} 


void drawForest() 
{ 
    for (int i = 0; i < 12; i++) 
    { 
    drawTree(random(55, 1865), 635 + 30*i); 
    } 
} 

void drawTree(float xx, float yy) 
{ 
    color c = color(139, 69, 19); 
    fill(c); 
    //noStroke(); 
    rect(xx, yy+30, 50, 100); 
    color d = color(000, random(25, 100), 000); 
    fill(d); 
    //noStroke(); 
    ellipse(xx, yy-30, 125, 100); 
    color g = color(100, 0, 0); 
    fill(g); 
    ellipse(random(xx-50, xx+50), random(yy-50, yy+18), 10, 10); 
} 

void drawCloud() 
{ 
    color h = color(255, 255, 255); 
    fill(h); 
    ellipse(posX, 150, 100, 50); 
    //posX += random(50,1920); 
    noStroke(); 
} 
void drawCloud2() 
{ 
    color h = color(0, 0, 0); 
    fill(h); 
    ellipse(posX2, 200, 100, 50); 
    //posX += random(50,1920); 
} 

void tegnSommerfugl(float xx, float yy) 
{ 
    image(img, xx, yy, width/storrelse2, height/storrelse); 
} 

void mouseClicked() 
{ 
    tegnSommerfugl(mouseX,mouseY); 
} 
+0

Vous essayez de changer la variable « skift » qui est de type à flotteur . Peut-être changer «skift» à un int? – khriskooper

+0

Le problème de base est déclaration flottant skift, mais difficile d'imaginer ce que vous voulez au niveau du design.Peut-être devrait être int, mais pas sûr –

+1

Le compilateur a raison, vous ne pouvez pas basculer en fonction de float, il doit être int, chaîne ou enum. –

Répondre

1

Comme le suggèrent les commentaires: comportement attendu. Vous ne pouvez pas basculer sur une variable de type float.

Le répondre est: ce serait une mauvaise idée de toute façon. Gardez à l'esprit que nombres à virgule flottante sont "inexactes" par conception (voir here par exemple). Alors que switch a la notion de exactement correspondant n différents cas. Mais c'est simplement techniquement pas possible pour les nombres à virgule flottante.

En ce sens: reculez, et changez le type de cette variable en int par exemple. Il devrait être int skift - pas float.

Et comme vous demandez alors: « mais comment puis-je obtenir un aléatoireint Numéro » - Voir here.

+0

Je l'ai utilisé comme un int au début, mais ensuite il est venu et a dit "Impossible de convertir float en int" Dans la référence, il est dit que random() a besoin d'une valeur flottante, si je Je ne me trompe pas. – Andreas2200

+1

Voir mes mises à jour. Et indice: essayez de faire des recherches la prochaine fois. Ce n'est pas comme si vous entrez dans un territoire inexploré où aucun humain n'a mis les pieds avant. – GhostCat

0

L'instruction cas interrupteur fonctionne uniquement avec:

  • primitives: octet, court, omble chevalier, int;
  • classes-emballages des primitives: caractères, Byte, Short, Integer
  • Enum и Chaîne (depuis 7+ JDK)

    Vous pouvez utiliser un interrupteur sur flotteurs jusqu'à les chiffres de précision que vous recherchez:

  • se multiplient skift pour le 10..0 pour décaler le point que vous avez besoin
  • puis utilisez Math.round (skift) pour obtenir le nombre entier

ou utiliser l'autre méthode aléatoire comme GhostCat dit