Java-使用Graphics2D矩形在面板中创建2D平铺贴图?
我正试图用一个非常基本的程序来模拟一场战斗,但由于这是我第一次用Java编写一个大程序,我对如何进行几乎一无所知。我想我应该有一个600乘600的大面板,用Graphics2D把地形画成20x20的矩形。。。不幸的是,即使有几个教程,我也不知道该怎么做 我有10种不同类型的地形可供骑行,还有5种不同的景观轮廓。基本上,我想让程序做的是,当我在组合框中选择一个特定的配置文件时,它会描绘战场上的风景和对立双方,尽管我还不太清楚 老实说,我在这个项目上没有取得多大进展。我应该仅仅使用图形2D和矩形来实现类似的功能,还是应该切换到OpenGL或类似的功能?尽管以我目前的Java经验,如果没有帮助,我想我不会走得很远。不管怎么说,到目前为止,我得到的是:Java-使用Graphics2D矩形在面板中创建2D平铺贴图?,java,map,graphics2d,tile,Java,Map,Graphics2d,Tile,我正试图用一个非常基本的程序来模拟一场战斗,但由于这是我第一次用Java编写一个大程序,我对如何进行几乎一无所知。我想我应该有一个600乘600的大面板,用Graphics2D把地形画成20x20的矩形。。。不幸的是,即使有几个教程,我也不知道该怎么做 我有10种不同类型的地形可供骑行,还有5种不同的景观轮廓。基本上,我想让程序做的是,当我在组合框中选择一个特定的配置文件时,它会描绘战场上的风景和对立双方,尽管我还不太清楚 老实说,我在这个项目上没有取得多大进展。我应该仅仅使用图形2D和矩形来实
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编辑器中预先设计的。老实说,我认为您学习java的方法是错误的。如果你正试图通过从这些教程中学习来做到这一点 我个人没有做平铺贴图的经验,但是从阅读你的代码中我可以看出我缺少了一些东西 通常,当我查看平铺贴图代码时,我会看到一个2D数字数组,在您的例子中,它是一个2D数字数组,范围从1到10,放在随机索引中。据我所知,您在显示的代码中所做的只是将一个图像分配给一个数字,并将其添加到块数组中 问题是,因为没有2D数组来实际可视化您正在创建的地图,所以您所做的只是创建一个数组,它是一组带有背景的矩形 另一个我无法理解的问题是,你的地图区域设置为720个索引,这基本上是一个字段,我不知道27个图像乘以27个图像将是你创建的整数中的x和y值。留给您的是一个JPanel,它被分割成您试图创建的不可见的平铺贴图网格 根据我前面提到的2D数组索引中的数字,背景将填充相应的图像 关于OpenGL或图形2D问题: 使用什么图形库并不重要,问题在于如何编写它。OpenGL对于初学者来说是非常先进的,尤其是2D,根据我的经验,它是一个3D库,所以即使2D是可能的,也有点难。在进入下一步之前,先学习一些JavaAPI
希望我能帮上忙,或者说有意义。我从来没有做过平铺贴图,所以我会回复你发布的代码。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);
}
});
}
}
那么…问题是什么?投票结束。我应该使用Graphics2D或OpenGL创建地图吗?我应该如何使用这两种方法中的任何一种来创建地图?如果这些都是图像,不用麻烦使用它们,只需使用JLabels即可。如果它们不是如您的示例所示,则通过重写JComponent的paintComponent来使用Graphics2D。@mre是正确的,例如,或者。垃圾神,mre,谢谢,我真的不知道该如何开始。谢谢-我想我已经解决了它。请让我知道,如果它仍然看起来是错误的。好的,这看起来很有希望,我几乎可以理解发生了什么。谢谢。问题:我不确定for循环在paintComponent中是如何工作的。它基本上是单独画出清晰的矩形,一个一个矩形吗?@fungusanthrax是的。我已经清除了矩形g.clearRect,然后我在它上面画了填充矩形g.FillRec是的,我知道,我的项目截止日期,我想我咬了太多了。哦,好吧,我希望一切顺利!