我目前正在开发2D游戏,所以我没有使用布局管理器:
Main.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也是我的类之一):
PixelPanel.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());
}
}
现在我正在尝试制作一些资产
Characters.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;
}
}
并将它们放入我的游戏中:
Main.java
mainframe.add(pchar);
然而,JFrame是深灰色,但PixelPanel没有出现......
答案 0 :(得分:0)
你有几个问题:
您永远不会在Swing组件上使用getGraphics()和paintComponent()。 Swing将确定何时需要绘制组件并将正确的Graphics对象传递给绘制方法。您所能做的就是建议使用repaint()方法重新绘制组件。
您的组件大小为(0,0),因此无需绘制任何内容。
要解决这些问题,您需要重新设计代码。你需要更好地理解绘画的基础知识。我建议您首先阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例,以便开始使用。
一旦您更好地了解自定义绘画的工作原理,您就可以决定要使用哪两种方法。
您可以使用BufferedImage
创建自定义&#34;字符&#34;添加到您的游戏中。您只需要一个图像来表示每个唯一字符。下一步是决定你想要对角色做什么。那就是你需要在面板上画出你的角色。那么问题是你想如何做到这一点?
你可以:
使用BufferedImage
创建ImageIcon
,然后将ImageIcon
添加到JLabel
,并将标签添加到面板中。使用此方法,您需要管理标签的大小/位置。尺寸将是标签的首选尺寸,位置将根据游戏规则而变化。
这种方法利用了Swing组件,你只需要提供绘画的图像。您可以根据需要创建任意数量的JLabel,使用相同或不同的图像来表示您的角色。
或者你可以:
手动管理面板上特定位置的角色绘画。您需要覆盖面板的paintComponent(...)
方法来绘制每个角色对象。
使用这种方法,您可以保留要绘制的对象的ArrayList。该对象至少包含两个数据:
然后paintComponent()
方法中的逻辑简单地遍历ArrayList并绘制每个对象。所以你显然还需要一个允许你将角色对象添加到ArrayList的方法。
您可以查看Custom Painting Approaches中的Draw On Component
示例,了解此方法的示例。