2017-02-23 18 views
1

私は六角形のタイルのグリッドを描いています。私は、これらのタイルの塗りつぶしとして使用したい6種類の画像を持っています。私は六角形のクラスを使ってタイルの各ポイントをループします。テクスチャは配列リストに格納され、ランダムな順序にシャッフルされます。私のスクリプトの問題は、同じテクスチャが各タイルに適用されていることです。私は間違って何をしていますか?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の文字列は、小文字の最初の文字(brick)を持つresourcesから検索しています。したがって、switchは常に失敗し、正しいテクスチャをバインドできません。

switchまたはresourcesアレイをそれに応じて修正してください。

関連する問題