所以我和我的朋友正在制作一个非常基本的游戏来娱乐,它将是一个自上而下(大约 45 度角),其中有一个伐木工人砍伐树木。我知道非常基本且有点蹩脚,但我们刚刚进入半高级Java。
首先,我们决定需要树的精灵,但我们意识到无论如何它都是一个在树周围有白色像素的矩形,但这会切掉部分背景图像。所以我们想要获取每个白色的像素(空白/负空间),然后让这些像素透明。为此,我们查看了大量代码,我们看到最多的是下面的代码,它有效,但我不太明白。
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class simpleFrame extends JFrame {
JPanel mainPanel = new JPanel() {
ImageIcon originalIcon = new ImageIcon("image.png");
ImageFilter filter = new RGBImageFilter() {
int transparentColor = Color.white.getRGB() | 0xFF000000;
public final int filterRGB(int x, int y, int rgb) {
if ((rgb | 0xFF000000) == transparentColor) {
return 0x00FFFFFF & rgb;
} else {
return rgb;
}
}
};
ImageProducer filteredImgProd = new FilteredImageSource(originalIcon.getImage().getSource(), filter);
Image transparentImg = Toolkit.getDefaultToolkit().createImage(filteredImgProd);
public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width, getSize().height);
g.drawImage(transparentImg, 140, 10, this);
}
};
public simpleFrame() {
super("Transparency Example");
JPanel content = (JPanel)getContentPane();
mainPanel.setBackground(Color.black);
content.add("Center", mainPanel);
}
public static void main(String[] argv) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
simpleFrame c = new simpleFrame();
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.setSize(700,700);
c.setVisible(true);
}
});
}
}
所以我们不完全理解的是为什么在第 6 行声明 JPanel 之后有括号,那么我不知道第 6-16 行是怎么回事。就像在括号之间一样,右括号后面有一个分号。我不知道它是如何工作的,除了声明 JPanel 的结构之外,每个命令行都放在一边,JPanel mainPanel = new JPanel() { };
我试图实现这一点,以便我可以将图像导入我的 JPanel 类,然后使所有负空间透明,然后绘制它。我似乎无法理解程序的结构以及如何将它实现到一个类中。
我的代码如下:
public class Frame extends JPanel {
/*
* This is the JPanel in which I want to add the transparent image to a JPanel
* then add the JPanel object,"Frame", above in a JFrame declared in my
* class above
*/
public Frame() {
JPanel jp = new JPanel();
jp.setSize(300,300);
jp.setVisible(true);
circle = new BufferedImage();
try {circle = ImageIO.read(new File("circle.PNG"));}
catch (IOException ex) {}
}
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.drawImage(circle,0,0,300,300, null);
g.drawRect(50, 50, 50, 50);
}
}
它只是导入图像,使其透明,然后将其绘制在 JPanel 上的测试代码。我们只是想了解执行此操作的最佳方法,而我发现的代码(第一个代码块)似乎可以很好地完成这项工作,但我们无法找出将其实施到我们的代码中的最佳方法。
提前致谢,
罗比和尼克