2017-02-23 4 views
1

Ich zeichne ein Gitter aus Sechseck-Fliesen. Ich habe sechs verschiedene Bilder, die ich als Füllung für diese Fliesen verwenden möchte. Ich benutze meine Hexagon-Klasse, um jeden Punkt in der Kachel zu durchlaufen. Die Texturen werden in einer Array-Liste gespeichert, die dann in eine zufällige Reihenfolge gemischt wird. Das Problem mit meinem Skript ist, dass dieselbe Textur auf jede Kachel angewendet wird. Was mache ich falsch?Wie verwende ich verschiedene Texturen auf mehrere Polygone in 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)); 
     } 
    } 

Antwort

2

Der erste Buchstabe der Saiten, die Sie in resources Zugabe sind in Großbuchstaben (z Brick).

Im bindTextureswitch Sie suchen Strings aus resources, die einen Klein ersten Buchstaben haben (z brick). Daher sollte die switch immer fehlschlagen und nicht in der Lage sein, die richtige Textur zu binden.

Korrigieren Sie entweder das switch oder das resources Array entsprechend.

Verwandte Themen