2017-02-23 1 views
1

J'ai un script qui rend une grille hexagonale en forme de hexagone 2D. La grille se charge bien, mais mes textures manquent d'énormes morceaux de couleur. Quel est le problème avec mon code? Ai-je cartographié incorrectement les coordonnées?Comment mapper correctement une texture à un hexagone dans LWJGL?

C'est l'image de texture que je suis le chargement: enter image description here

Voici comment la texture apparaît dans mon jeu: enter image description here

Voici mon code:

public class LWJGLHelloWorld { 

    public static int SCREEN_WIDTH; 
    public static int SCREEN_HEIGHT; 
    public static int WINDOW_WIDTH; 
    public static int WINDOW_HEIGHT; 
    public double WIDTH; 
    public double HEIGHT; 
    public ArrayList<Hexagon> hexagons = new ArrayList<Hexagon>(); 
    public ArrayList<String> resources = new ArrayList<String>(); 
    public Texture brick; 
    public Texture stone; 
    public Texture lumber; 
    public Texture wool; 
    public Texture wheat; 
    public Texture wasteland; 
    public int textureID; 
    private float[][] textureCoords = { 
     {0.5f, 0.5f}, 
     {0.5f, 0.0f}, 
     {0.0f, 0.25f}, 
     {0.0f, 0.75f}, 
     {0.5f, 0.0f}, 
     {1.0f, 0.75f}, 
     {1.0f, 0.25f} 
}; 
    private static enum State { 
     INTRO, MAIN_MENU, GAME; 
    } 

    private State state = State.INTRO; 

    public LWJGLHelloWorld(){ 

     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     double SCREEN_WIDTH = screenSize.getWidth(); 
     double SCREEN_HEIGHT = screenSize.getHeight(); 
     double WIDTH = SCREEN_WIDTH * .85; 
     double HEIGHT = SCREEN_HEIGHT * .85; 

     try { 
      Display.setDisplayMode(new DisplayMode((int)WIDTH, (int)HEIGHT)); 
      Display.setTitle("Hello, LWJGL!");; 
      Display.create(); 
     } catch (LWJGLException e){ 
      e.printStackTrace(); 
     } 
     resetResources(); 


     brick = loadTexture("brick"); 
     stone = loadTexture("stone"); 
     lumber = loadTexture("lumber"); 
     //Texture wheat = loadTexture("wheat"); 
     wool = loadTexture("wool"); 
     wasteland = loadTexture("wasteland"); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, WIDTH, HEIGHT, 0, 1, -1); 
     glMatrixMode(GL_MODELVIEW); 
     glEnable(GL_TEXTURE_2D); 

     int originX = (int)(Display.getDisplayMode().getWidth()/2); 
     int originY = (int)(Display.getDisplayMode().getHeight()/2); 
     int radius = (int)(HEIGHT * .1); 
     int padding = (int)(HEIGHT * .005); 

     findHexCoords(originX, originY, 5, radius, padding); 

     while(!Display.isCloseRequested()){ 
      checkInput(); 
      glClear(GL_COLOR_BUFFER_BIT); 
      for(int h = 0; h < hexagons.size(); h++){ 
       String rsrc = resources.get(h); 
       switch(rsrc){ 
       case "brick": 
        brick.bind(); 
        break; 
       case "stone": 
        stone.bind(); 
        break; 
       case "lumber": 
        lumber.bind(); 
        break; 
       case "wheat": 
        //wheat.bind(); 
        break; 
       case "wool": 
        wool.bind(); 
        break; 
       case "wasteland": 
        wasteland.bind(); 
        break; 
       } 
       glBegin(GL_POLYGON); 
       Hexagon hex = hexagons.get(h); 
       for(int p = 0; p < hex.points.length; p++){ 
        Point point = hex.points[p]; 
        glVertex2f(point.x, point.y); 
        glTexCoord2f(textureCoords[p][0], textureCoords[p][0]); 
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); 
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); 
       } 
       glEnd(); 
      } 

      Display.update(); 
      Display.sync(60); 
     } 

     Display.destroy(); 
    } 

    private void bindTexture(String rsrc){ 

    } 

    private void findHexCoords(int x, int y, int size, int radius, int padding) { 

     Point origin = new Point(x, y); 
     double ang30 = Math.toRadians(30); 
     double xOff = Math.cos(ang30) * (radius + padding); 
     double yOff = Math.sin(ang30) * (radius + padding); 
     int half = size/2; 

     int i = 0; 
     for (int row = 0; row < size; row++) { 

      int cols = size - Math.abs(row - half); 

      for (int col = 0; col < cols; col++) { 

       int xLbl = row < half ? col - row : col - half; 
       int yLbl = row - half; 
       int centerX = (int) (origin.x + xOff * (col * 2 + 1 - cols)); 
       int centerY = (int) (origin.y + yOff * (row - half) * 3); 

       Hexagon hex = new Hexagon(centerX, centerY, radius); 
       System.out.println(centerX+","+centerY); 
       hexagons.add(hex); 
       i++; 
      } 
     } 
    } 

    public void checkInput(){ 
     switch(state){ 
     case INTRO: 
      if(Keyboard.isKeyDown(Keyboard.KEY_S)){ 
       state = State.MAIN_MENU; 
      } 
      if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){ 
       Display.destroy(); 
       System.exit(0);; 
      } 
      break; 
     case GAME: 
      if(Keyboard.isKeyDown(Keyboard.KEY_BACK)){ 
       state = State.MAIN_MENU; 
      } 
      break; 
     case MAIN_MENU: 
      if(Keyboard.isKeyDown(Keyboard.KEY_RETURN)){ 
       state = State.GAME; 
      } 
      if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)){ 
       state = State.INTRO; 
      } 
      break; 
     } 
    } 

    private Texture loadTexture(String key){ 
     try { 
      return TextureLoader.getTexture("PNG", new FileInputStream(new File("img/" + key + ".png"))); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    public static void main(String[] args) { 
     new LWJGLHelloWorld(); 

    } 

    public void resetResources(){ 
     resources.clear(); 
     resources.add("Brick"); 
     resources.add("Brick"); 
     resources.add("Brick"); 
     resources.add("Wool"); 
     resources.add("Wool"); 
     resources.add("Wool"); 
     resources.add("Wool"); 
     resources.add("Lumber"); 
     resources.add("Lumber"); 
     resources.add("Lumber"); 
     resources.add("Lumber"); 
     resources.add("Stone"); 
     resources.add("Stone"); 
     resources.add("Stone"); 
     resources.add("Wheat"); 
     resources.add("Wheat"); 
     resources.add("Wheat"); 
     resources.add("Wheat"); 
     long seed = System.nanoTime(); 
     Collections.shuffle(resources, new Random(seed)); 
     int randomIndex = ThreadLocalRandom.current().nextInt(0, 19); 
     resources.add(randomIndex, "Wasteland"); 
     for(int r = 0; r < resources.size(); r++){ 
      System.out.println(resources.get(r)); 
     } 
    } 

} 

Mise à jour

Je suppose que cela se produit parce que mes coordonnées de texture ne sont pas correct car chaque fois que je les change, la zone de noir dans les textures change.

Répondre

0

Vos coordonnées de texture sont en effet erronées. Puisque vous dessinez un polygone dans son ensemble, il n'y a pas de sommet avec la coordonnée de texture [0.5, 0.5], qui est le centre d'une texture. Essayez d'utiliser l'image ci-dessous pour déterminer vos coordonnées de texture correctement. :)

enter image description here

écrire une coordonnée de texture pour chaque sommet et de mettre « em en même ordre que vous dessinez vos sommets.

EDIT:

Pour être juste, vous seriez bien mieux dessiner les tuiles comme rectangles/quadriceps et faire « em se chevauchent un peu. Vos coordonnées de texture seraient alors {[0, 0], [0, 1], [1, 1], [1, 0]} en supposant que vous commenciez dans le coin inférieur gauche et que vous dessiniez dans le sens des aiguilles d'une montre. Voir l'image ci-dessous.

enter image description here

+0

Merci pour la réponse. Avec quelle coordonnée dois-je commencer et dans quelle direction vont-ils? – ShoeLace1291

+0

Commencez avec une coordonnée pour hex.points [0] et continuez à partir de là. :) Je ne peux pas vraiment le tester moi-même en ce moment, mais je parie que ça va être soit le sommet haut-milieu ou haut-droit. –

+0

Désolé, je ne comprends toujours pas. Quel devrait être mon tableau textureCoords [] []? – ShoeLace1291