好的,我有两个类似的类(图形以相同的方式设置),另一个类显示在底部。如您所见,我想同时显示两个graphics2ds,并且item类是透明的且位于顶部(items类几乎没有内容,而游戏类完全被图片等覆盖)
有什么办法吗?
当前,物品类比游戏类具有更高的优先级,因为它被称为最后一个,并且完全阻塞了游戏类。
public class game extends Canvas implements Runnable
{
public game()
{
//stuff here
setBackground(Color.white);
setVisible(true);
new Thread(this).start();
addKeyListener(this);
}
public void update(Graphics window)
{
paint(window);
}
public void paint(Graphics window)
{
Graphics2D twoDGraph = (Graphics2D)window;
if(back==null)
back = (BufferedImage)(createImage(getWidth(),getHeight()));
Graphics graphToBack = back.createGraphics();
//draw stuff here
twoDGraph.drawImage(back, null, 0, 0);
}
public void run()
{
try
{
while(true)
{
Thread.currentThread();
Thread.sleep(8);
repaint();
}
}catch(Exception e)
{
}
}
}
第二课
public class secondary extends JFrame
{
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
public secondary()
{
super("Test RPG");
setSize(WIDTH,HEIGHT);
game game = new game();
items items = new items();
((Component)game).setFocusable(true);
((Component)items).setFocusable(true);
getContentPane().add(game);
getContentPane().add(items);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main( String args[] )
{
secondary run = new secondary();
}
}
最佳答案
这是我的建议:
扩展JComponent而不是Canvas(您可能需要轻量级的Swing组件,而不是重量级的AWT组件)
然后,不必为图形的手动后备缓冲而烦恼-Swing会自动为您进行后备缓冲(这样做时可能会使用硬件加速)
让一个组件同时绘制项目和游戏背景的其余部分。没有充分的理由单独进行操作(即使仅更改项目图层,由于透明效果,也需要重新绘制背景)
将您的班级名称大写,看到小写的班级名称会让我头疼:-)
编辑
典型地,该方法将是具有代表游戏的可见区域的类,例如。 GameScreen,带有paintCompoent方法,如下所示:
public class GameScreen extends JComponent {
....
public void paintComponent(Graphics g) {
drawBackground(g);
drawItems(g);
drawOtherStuff(g); // e.g. animated explosions etc. on top of everything else
}
}
关于java - 多个graphics2d,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12613126/