I am drawing a grid of hexagon tiles. I have six different images that I want to use as the fill for these tiles. I use my hexagon class to loop through each point in the tile. The textures are stored in an array list which is then shuffled into a random order. The problem with my script right now is that the same texture is applied to each tile. What am I doing wrong?
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)); } }
1 Answers
Answers 1
The first letter of the strings that you are adding in resources
is uppercase (e.g. Brick
).
In the bindTexture
switch
you are searching strings from resources
that have a lowercase first letter (e.g. brick
). Therefore the switch
should always fail and not able to bind the correct texture.
Either fix the switch
or the resources
array accordingly.
0 comments:
Post a Comment