0

我正在尝试在一个非常基本的程序中模拟一场战斗,但由于这是我第一次使用 Java 中的大型程序,所以我对如何进行几乎一无所知。我在想我应该有一个 600×600 的大面板并使用 Graphics2D 将地形绘制为 20x20 矩形......不幸的是,即使有几个教程我也不知道该怎么做。

我有 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 教程做到了这一点,所以我的代码有点不稳定。我在主表单代码中只有一个复选框触发事件。(GUI 是在 Netbeans 编辑器中预先设计的。)

4

2 回答 2

8

1) 我强烈建议您在 OpenGL 之前坚持学习 Java 2d。
2) 理想情况下,您将有一些模型视图分离 - 您将有一个表示地图内容的类和另一个实际呈现它的类。

这是一些示例代码,可以让您更接近目标。请尝试通读并理解它,而不仅仅是复制粘贴并破解它。

在此处输入图像描述

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);
            }
        });
    }
}
于 2011-12-23T07:00:46.290 回答
1

老实说,我认为您正在以错误的方式学习Java。如果这就是您通过从这些教程中学习来尝试做的事情。

我个人没有制作平铺地图的经验,但是通过阅读您的代码,我可以看到一些缺失的东西。

通常,当我查看瓷砖地图代码时,我会看到一个二维数字数组,在您的情况下,它将是一个 2D 数字数组,范围从 1 到 10,放置在随机索引中。据我了解,您在显示的代码中所做的只是将图像分配给一个数字并将它们添加到您的 blocks 数组中。

问题在于,由于没有 2D 数组来实际可视化您正在创建的地图,您所做的只是创建一个数组是一堆带背景的矩形。

我无法理解的另一个问题是您将地图区域设置为 720 个索引,这基本上是一个字段,我不知道 27 个图像乘 27 个图像将是您创建的那些整数中的 x 和 y 值. 给您留下一个 JPanel,该 JPanel 被划分为您尝试创建的不可见瓦片地图网格。

根据我之前所说的 2D Array 的索引中的数字,背景将填充相应的图像。

关于 OpenGL 或 Graphics 2D 问题: 您使用什么图形库并不重要,问题在于您如何编码。OpenGL 对于初学者来说非常先进(尤其是 2D,根据我的经验),它是一个 3D 库,所以即使 2D 是可能的,它也有点难。在进入任何下一步之前学习一些 Java API。

希望我有帮助,或者再次有意义 O_o 我从来没有做过瓷砖地图,所以我正在回复你发布的代码。

于 2011-12-23T04:59:08.680 回答