Java - Создание 2D-карты тайлов на панели с помощью Graphics2D Rectangles? - PullRequest
0 голосов
/ 23 декабря 2011

Я пытаюсь смоделировать битву в действительно простой программе, но, поскольку я впервые работаю с большой программой на Java, я почти не знаю, как действовать дальше. Я думал, что у меня будет большая панель 600 на 600 и я буду использовать Graphics2D, чтобы просто рисовать ландшафт в виде прямоугольников размером 20х20 ... К сожалению, даже с несколькими уроками я понятия не имею, что делать.

У меня есть 10 различных типов ландшафта для прохождения цикла и 5 различных ландшафтных профилей. По сути, я хочу, чтобы программа работала, когда я выбираю определенный профиль в поле со списком, он рисует ландшафт и две противоположные стороны в битве (хотя я еще не совсем там)

Честно говоря, я не достиг большого прогресса в программе. Должен ли я использовать просто Graphics2D и прямоугольники для чего-то вроде этого, или я должен перейти на OpenGL или что-то подобное? Хотя с моим нынешним опытом работы с Java, я не думаю, что смогу справиться с этим без посторонней помощи. В любом случае, вот что у меня есть:

public class Map extends JPanel {
    int n = 1;
    int x; int y;
    int Area = 750;
    public Color City = new Color(214,217,223);
    public Color Desert = new Color(255,204,102);
    public Color DirtRoad = new Color(153,102,0);
    public Color Forest = new Color(0,102,0);
    public Color Hills = new Color(51,153,0);
    public Color Lake = new Color(0,153,153);
    public Color Mountains = new Color(102,102,255);
    public Color Ocean = new Color(0,0,153);
    public Color PavedRoad = new Color(51,51,0);
    public Color Plains = new Color(102,153,0);
    public Rectangle blocks[];
    public Map(){
        blocks = new Rectangle[750];
        if (n == 1) {
            setBackground(City);
            n = 2;
        } else if (n == 2) {
            setBackground(Desert);
            n = 3;
        } else if (n == 3) {
            setBackground(DirtRoad);
            n = 4;
        } else if (n == 4) {
            setBackground(Forest);
            n = 5;
        } else if (n == 5) {
            setBackground(Hills);
            n = 6;
        } else if (n == 6) {
            setBackground(Lake);
            n = 7;
        } else if (n == 7) {
            setBackground(Mountains);
            n = 8;
        } else if (n == 8) {
            setBackground(Ocean);
            n = 9;
        } else if (n == 9) {
            setBackground(PavedRoad);
            n = 10;
        } else if (n == 10) {
            setBackground(Plains);
            n = 1;
        } else {
        }
        for (int i = 1; i <= Area; i++) {
            blocks[i] = new Rectangle(x, y, 20, 20);
        }
    }

Я дошел до этого с несколькими уроками на Youtube, поэтому мой код немного ошибочен. Все, что у меня есть в основном коде формы, это событие запуска checkBox. (GUI предварительно разработан в редакторе Netbeans.)

Ответы [ 2 ]

7 голосов
/ 23 декабря 2011

1) Я настоятельно рекомендую вам продолжить изучение Java 2d до OpenGL.
2) В идеале у вас должно быть какое-то разделение видов модели - у вас будет один класс, представляющий содержимое карты, и другой класс для его рендеринга.

Вот пример кода, который должен приблизить вас к цели.Пожалуйста, попробуйте прочитать и понять это, а не просто скопировать вставить и взломать его.

enter image description here

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class Map extends JPanel {

    public static final Color CITY = new Color(214,217,223);
    public static final Color DESERT = new Color(255,204,102);
    public static final Color DIRT_ROAD = new Color(153,102,0);
    public static final Color FOREST = new Color(0,102,0);
    public static final Color HILLS = new Color(51,153,0);
    public static final Color LAKE = new Color(0,153,153);
    public static final Color MOUNTAINS = new Color(102,102,255);
    public static final Color OCEAN = new Color(0,0,153);
    public static final Color PAVED_ROAD = new Color(51,51,0);
    public static final Color PLAINS = new Color(102,153,0);

    public static final Color[] TERRAIN = {
        CITY,
        DESERT,
        DIRT_ROAD,
        FOREST,
        HILLS,
        LAKE,
        MOUNTAINS,
        OCEAN,
        PAVED_ROAD,
        PLAINS
    };

    public static final int NUM_ROWS = 25;
    public static final int NUM_COLS = 30;

    public static final int PREFERRED_GRID_SIZE_PIXELS = 10;

    // In reality you will probably want a class here to represent a map tile,
    // which will include things like dimensions, color, properties in the
    // game world.  Keeping simple just to illustrate.
    private final Color[][] terrainGrid;

    public Map(){
        this.terrainGrid = new Color[NUM_ROWS][NUM_COLS];
        Random r = new Random();
        // Randomize the terrain
        for (int i = 0; i < NUM_ROWS; i++) {
            for (int j = 0; j < NUM_COLS; j++) {
                int randomTerrainIndex = r.nextInt(TERRAIN.length);
                Color randomColor = TERRAIN[randomTerrainIndex];
                this.terrainGrid[i][j] = randomColor;
            }
        }
        int preferredWidth = NUM_COLS * PREFERRED_GRID_SIZE_PIXELS;
        int preferredHeight = NUM_ROWS * PREFERRED_GRID_SIZE_PIXELS;
        setPreferredSize(new Dimension(preferredWidth, preferredHeight));
    }

    @Override
    public void paintComponent(Graphics g) {
        // Important to call super class method
        super.paintComponent(g);
        // Clear the board
        g.clearRect(0, 0, getWidth(), getHeight());
        // Draw the grid
        int rectWidth = getWidth() / NUM_COLS;
        int rectHeight = getHeight() / NUM_ROWS;

        for (int i = 0; i < NUM_ROWS; i++) {
            for (int j = 0; j < NUM_COLS; j++) {
                // Upper left corner of this terrain rect
                int x = i * rectWidth;
                int y = j * rectHeight;
                Color terrainColor = terrainGrid[i][j];
                g.setColor(terrainColor);
                g.fillRect(x, y, rectWidth, rectHeight);
            }
        }
    }

    public static void main(String[] args) {
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Game");
                Map map = new Map();
                frame.add(map);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
1 голос
/ 23 декабря 2011

Я думаю, что вы собираетесь изучать Java неправильно, если честно.Если это то, что вы пытаетесь сделать, изучая эти учебные пособия.

У меня лично нет опыта в создании карт тайлов , но мне не хватает некоторых вещей, которые я вижу, читаяваш код.

Обычно, когда я смотрю на код карты тайла, я вижу двумерный массив чисел, в вашем случае это будет двумерный массив чисел в диапазоне от 1 до 10, помещенный в случайные индексы.Насколько я понимаю, вы делаете в отображаемом вами коде то, что вы просто присваиваете изображение числу и добавляете его в массив блоков.

Проблема заключается в том, что, поскольку нет 2D-массива для фактической визуализации создаваемой карты, все, что вы делаете, - это создание набора прямоугольников с фонами.

ДругойПроблема, которую я не могу понять, состоит в том, что у вас есть область карты, установленная на 720 индексов, которая в основном является полем, я не знаю, что 27 изображений на 27 изображений будут вашими значениями x и y в тех созданных вами целых.оставляя вас с JPanel, разделенной на невидимую сетку карты плиток, которую вы пытаетесь создать.

Исходя из того, какое число находится в индексе двумерного массива, о котором я говорил ранее, фон будет заполненсоответствующее изображение.

О проблеме OpenGL или Graphics 2D: Неважно, какую графическую библиотеку вы используете, вопрос в том, как вы ее кодируете.OpenGL довольно продвинут для начинающего (особенно из 2D, по моему опыту), это 3D-библиотека, так что, хотя 2D и возможен, это довольно сложно.Изучите некоторые API Java, прежде чем переходить к следующему шагу.

Надеюсь, я помог или имел смысл, О_о, я никогда не создавал карты тайлов, поэтому я отвечаю на код, который вы опубликовали.

...