2017-02-23 73 views
1

我正在繪製一個六邊形瓷磚的網格。我有六個不同的圖像,我想用這些瓷磚填充。我使用我的六邊形類來循環切片中的每個點。紋理存儲在一個數組列表中,然後隨機組合成一個隨機順序。我的腳本現在的問題是相同的紋理應用於每個瓷磚。我究竟做錯了什麼?如何將不同的紋理應用於LWJGL中的多個多邊形?

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; 

    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()){ 
      glClear(GL_COLOR_BUFFER_BIT); 
      for(int h = 0; h < hexagons.size(); h++){ 
       String rsrc = resources.get(h); 
       bindTexture(rsrc); 
       glBegin(GL_POLYGON); 
       Hexagon hex = hexagons.get(h); 
       for(int p = 0; p < hex.points.length; p++){ 
        Point point = hex.points[p]; 
        glTexCoord2f(point.x, point.y); 
        glVertex2f(point.x, point.y); 
       } 
       glEnd(); 
      } 

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

     Display.destroy(); 
    } 

    private void bindTexture(String rsrc){ 
     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; 
     } 
    } 

    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++; 
      } 
     } 
    }    

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

回答

2

你是在resources加入串的第一個字母是大寫(例如Brick)。

bindTextureswitch中,您正在搜索resources的字符串,其首字母小寫(例如brick)。因此,switch應該總是失敗並且無法綁定正確的紋理。

要麼相應地修復switchresources陣列。

相關問題