2

好的,我有两个类似的类(图形的设置方式相同)和另一个显示在底部的类。如您所见,我有两个图形2ds,我想同时显示它们,并且项目类是透明的并且位于顶部(项目类中几乎没有任何内容,游戏类完全被图片等覆盖)

有什么办法吗?

目前项目类优先于游戏类,因为它是最后调用的并且完全阻塞了游戏类。

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();

}
}
4

1 回答 1

1

以下是我的建议:

  • 扩展 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
  }  
}
于 2012-09-27T02:31:06.857 回答