如何在LWJGL中将不同的纹理应用于多个多边形?

时间:2017-02-23 09:32:31

标签: java opengl lwjgl

我画的是六边形瓷砖网格。我有六个不同的图像,我想用它们作为这些瓷砖的填充物。我使用我的六边形类来遍历tile中的每个点。纹理存储在数组列表中,然后将其随机排列为随机顺序。我的脚本现在的问题是每个图块都应用了相同的纹理。我做错了什么?

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 个答案:

答案 0 :(得分:2)

您在resources中添加的字符串的第一个字母是大写的(例如Brick)。

bindTexture switch中,您正在搜索resources中首字母小写的字符串(例如brick)。因此switch应始终失败,并且无法绑定正确的纹理。

相应地修复switchresources数组。