我和我的朋友正在制作一款游戏,我们希望在背景中添加分层图像,并在这些图像上方设置导航按钮。一个图像可以保持不变,而另一个则不断变化。要做到这一点,我认为渲染和刻度哲学将是伟大的。
对于那些看过那些来自日本的俗气的视觉小说游戏的人来说,这基本上就是我们正在做的。
更新:所以我在下面使用了你的许多建议。我的新问题是我的JButton将消失在图片下面之前,我滚动它。当我按照建议添加super.paintComponent(g)时,一切都立即消失了。
main方法的代码现在看起来是这样的:
package Urban.Blade.Package;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import Urban.Blade.Package.gfx.*;
import javax.swing.*;
public class MainGame extends JPanel{
private static final long serialVersionUID = 1L;
public static final int WIDTH = 300, HEIGHT = 300, SCALE = 2, PICSCALE = 0;
public BufferedImage background1;
public BufferedImage testCharacter1;
static JButton b1 = new JButton();
static JButton b2 = new JButton();
static JPanel j1 = new JPanel();
static JPanel j2 = new JPanel();
static JFrame frame = new JFrame("Urban Blade");
static MainGame mGame = new MainGame();
static JLayeredPane lJ = new JLayeredPane();
static JLayeredPane lJ2 = new JLayeredPane();
public static void main(String[] args){
lJ.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
lJ.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
lJ.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
lJ.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);
mGame.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
mGame.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
mGame.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
mGame.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);
frame.setSize(WIDTH * SCALE, HEIGHT * SCALE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
lJ.setLayout(null);
frame.add(mGame);
frame.add(lJ);
j2.setLayout(new GridLayout());
j2.setSize(WIDTH * SCALE, HEIGHT * SCALE);
j2.setLocation(0, 0);
j1.setLayout(new GridLayout());
j1.setSize(100, 25);
j1.setLocation(225*SCALE, 250*SCALE);
j1.add(b1);
b1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
System.out.println("CLICKED");
}
});
frame.setVisible(true);
lJ.add(j2);
lJ.add(j1);
lJ.setComponentZOrder(j2, 1);
lJ.setComponentZOrder(j1, 0);
mGame.init();
mGame.paintComponent();
}
public void init(){
ImageLoader loader = new ImageLoader();
background1 = loader.load(new File("res/testBackground.png"));
testCharacter1 = loader.load(new File("res/testForeground.png"));
}
public void paintComponent(){
Graphics g = j2.getGraphics();
g.drawImage(background1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
g.drawImage(testCharacter1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
super.paintComponent(g);
g.dispose();
}
}
你的问题是你正试图在BufferStrategy中混合正常的GUI绘图与自定义绘图。如果使用BufferStrategy,则更新/绘制操作不起作用。一种选择是使用普通的paint/paintComponent重写和一个null布局管理器,这样你就可以将按钮放置在你想要的任何地方,并在它们后面绘制图像。
如果你想继续使用BufferStrategy,你可以尝试手动调用paint传入你的图形对象。不确定这是否会起作用,因为我从来没有尝试过。
如果您使用第一个选项,您必须确保JPanel具有透明的背景而不是不透明的。您还必须在绘制图像之后调用super.paint(),这样JDK绘图将在您的自定义绘图之后发生,并且按钮将出现在顶部。