我目前正在开发2D游戏,所以我没有使用布局管理器:
主.java
public class Main {
static JFrame mainframe = new JFrame();
private static JPanel pchar;
public static void main(String[] args) {
mainframe.getContentPane().setBackground(Color.DARK_GRAY);
mainframe.setLayout(null);
pchar = Characters.basiccharacter();
}
}
我设计了自己的 JPanel,因为我还没有找到一种简单的方法来绘制每个像素的组件(Area 也是我的类之一):
像素面板.java
public class PixelPanel extends JPanel {
private BufferedImage img;
private int scale;
public PixelPanel(Dimension d, int scale) {
this.setLayout(null);
img = new BufferedImage(d.width * scale, d.height * scale, BufferedImage.TYPE_INT_ARGB);
this.scale = scale;
drawImage();
}
// this will draw the pixel(s) according to the set scale
public void drawPixel(int x, int y, int rgb) {
drawArea(new Area(x * scale, (x + 1) * scale, y, (y + 1) * scale), rgb);
}
public void drawArea(Area a, int rgb) {
for(int x = a.x1(); x < a.x2(); x++) {
for(int y = a.y1(); y < a.y2(); y++) {
drawTruePixel(x, y, rgb);
}
}
drawImage();
}
// this will only draw the one pixel at x : y
private void drawTruePixel(int x, int y, int rgb) {
img.setRGB(x, y, rgb);
}
private void drawImage() {
this.paintComponent(img.getGraphics());
}
}
现在我试图制作一些资产
人物.java
public class Characters {
static int w = 10;
static int h = 12;
static int scale = 4;
public static JPanel basiccharacter() {
PixelPanel pchar = new PixelPanel(new Dimension(w, h), scale);
pchar.drawPixel(1, 2, 000);
// drawing some more pixels
return pchar;
}
}
并将它们放在我的游戏中:
主.java
mainframe.add(pchar);
但是,JFrame是深灰色的,但PixelPanel没有显示...
你有几个问题:
-
你永远不会在 Swing 组件上使用 getGraphics() 和 paintComponent()。Swing 将确定何时需要绘制组件,并将正确的图形对象传递给绘制方法。您所能做的就是建议使用 repaint() 方法重新绘制组件。
-
组件的大小为 (0, 0),因此无需绘制任何内容。
要解决这些问题,您需要重新设计代码。你需要更好地了解绘画的基础知识。 我建议您首先阅读自定义绘画的 Swing 教程中的部分,以获取更多信息和工作示例以开始使用。
一旦您更好地了解了自定义绘画的工作原理,您就可以决定要使用两种方法中的哪一种。
您可以使用BufferedImage
创建自定义"角色"以添加到游戏中。您只需要一个图像来表示每个唯一字符。下一步是决定你想对你的角色做什么。也就是说,您需要在面板上绘制您的角色。所以问题是你想怎么做?
您可以:
使用BufferedImage
创建ImageIcon
,然后将ImageIcon
添加到JLabel
并将标签添加到面板。使用此方法,您需要管理标签的大小/位置。大小将是标签的首选大小,位置将根据游戏规则而变化。
此方法利用了使用 Swing 组件的优势,您只需提供要绘制的图像。您可以根据需要创建任意数量的JLabels,使用相同或不同的图像来代表您的角色。
或者你可以:
手动管理面板上特定位置的角色绘画。您需要重写面板的paintComponent(...)
方法才能绘制每个角色对象。
使用这种方法,您将保留要绘制的对象的 ArrayList。此对象将包含至少两条数据:
- 要绘制的对象(即您的缓冲图像)
- 对象在面板上的位置。
然后,paintComponent()
方法中的逻辑只是遍历 ArrayList 并绘制每个对象。因此,您显然还需要一种允许您将字符对象添加到 ArrayList 的方法。
您可以查看自定义绘制方法中找到的Draw On Component
示例以获取此方法的示例。