2017-10-05 11 views
-2

J'ai essayé d'écrire une classe qui devrait créer un cylindre. Mais quand j'essaie de dessiner mon ArrayList il y a 180 objets avec la même valeur dedans. Je ne comprends pas ce qui ne va pas quand j'essaie d'ajouter les Quads à mon ArrayList.Ajout d'éléments à une liste de tableaux

public class Planet { 
    public static ArrayList<Quad> createRing(int x, int y, int z, int radius) { 
     ArrayList<Quad> quads = new ArrayList<Quad>(); 
     for (int i = 0; i < 360; i++) { 
      float x1 = (float) (Math.sin(Math.toRadians(i)) * radius); 
      float y1 = (float) (Math.cos(Math.toRadians(i)) * radius); 
      i++; 
      float x2 = (float) (Math.sin(Math.toRadians(i)) * radius); 
      float y2 = (float) (Math.cos(Math.toRadians(i)) * radius); 

      quads.add(new Quad(new Vector3f(x1, y1, 4), new Vector3f(x2, y2, 4), new Vector3f(x2, y2, 0), 
        new Vector3f(x1, y1, 0))); 
     } 
     return quads; 
    } 
} 

----QUAD.java 

import org.lwjgl.opengl.GL11; 
import org.lwjgl.util.vector.Vector3f; 

public class Quad { 
//have to be non-static 
static Vector3f Cord1; 
static Vector3f Cord2; 
static Vector3f Cord3; 
static Vector3f Cord4; 
//have to be non-static 
public Quad(Vector3f cord1,Vector3f cord2,Vector3f cord3,Vector3f cord4) { 
Cord1 = cord1; 
Cord2 = cord2; 
Cord3 = cord3; 
Cord4 = cord4; 
} 
public void draw() { 
//GL11.glBegin(GL11.GL_QUADS); 
GL11.glColor3f(1, 0, 0); 
GL11.glVertex3f(Cord1.x, Cord1.y, Cord1.z); 
GL11.glVertex3f(Cord2.x, Cord2.y, Cord2.z); 
GL11.glVertex3f(Cord3.x, Cord3.y, Cord3.z); 
GL11.glVertex3f(Cord4.x, Cord4.y, Cord4.z); 
} 
public void out() { 

System.out.println(Cord1.x+" "+ Cord1.y+" "+ Cord1.z); 
System.out.println(Cord2.x+" "+ Cord2.y+" "+ Cord2.z); 
System.out.println(Cord3.x+" "+ Cord3.y+" "+ Cord3.z); 
System.out.println(Cord4.x+" "+ Cord4.y+" "+ Cord4.z); 
} 
} 
+0

Avez-vous essayé 'System.out.println (eins); System.out.println (zwei); 'etc et vérifiez si elles sont identiques? Êtes-vous sûr d'attribuer des valeurs différentes à chaque fois? –

+1

J'ai testé cela en changeant la valeur dans la boucle for et chaque fois que je dessine, j'ai une autre partie de mon cylindre. Mais je ne peux pas dessiner le cylindre entier à la fois. –

+0

Est-ce que 'Quad' est une classe que vous avez définie? Ses membres sont-ils "statiques"? Veuillez ajouter le code pour cette classe. (S'ils sont statiques, rendez-les non statiques). –

Répondre

0
public class Quad { 
static Vector3f Cord1; 
static Vector3f Cord2; 
static Vector3f Cord3; 
static Vector3f Cord4; 
public Quad(Vector3f cord1,Vector3f cord2,Vector3f cord3,Vector3f cord4) { 
Cord1 = cord1; 
Cord2 = cord2; 
Cord3 = cord3; 
Cord4 = cord4; 
} 

Vous avez fait les CordN des variables static, de sorte que chaque champ a seulement 1 valeur, partagée entre toutes les instances de la classe. Ainsi, chaque fois que vous créez une nouvelle instance de la classe, les valeurs précédentes sont remplacées.

Retirer le modificateur static.


En outre, notez qu'il est bon de faire des variables membres final à moins que vous avez absolument besoin qu'ils ne soient pas. Cela ne semble pas être le cas ici, alors faites-les final - et cela aurait attiré votre problème automatiquement, car vous ne seriez pas en mesure de réaffecter un champ static final dans le constructeur.