0

我正在制作游戏,虽然我主要是先处理逻辑,但我有一个简单、快速的绘制方法:

   public class Draw extends JPanel {

    private static final long serialVersionUID = 1L;

//  BufferedImage heroitext;
    Hero hero;
    Vector<Enemy> enemies;
    Vector<Bullet> ammo;
    Vector<Terrain> terrains;

    public Draw() {
//      (int)try {
//          heroitext = ImageIO.read(getClass().getResource("/images/circulo.png"));
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
    }

    public void render(Level lvl) {
        hero = lvl.getHero();
        ammo = lvl.getAmmo();
        enemies = lvl.getEnemies();
        terrains = lvl.getTerrains();
        repaint();
    }


    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        System.out.println("drawing");

        //draw Hero
        g.drawRect((int)hero.getX(), (int)hero.getY(), hero.getWidth(), hero.getHeight());

        //draw Enemies
        for(int i=0; i<enemies.size(); i++)
        {
            if(!enemies.get(i).isToKill()) g.drawRect((int)enemies.get(i).getX(), (int)enemies.get(i).getY(), enemies.get(i).getWidth(), enemies.get(i).getHeight());
            for(int j=0; j<enemies.get(i).getAmmo().size(); j++)
            {
                g.drawRect((int) enemies.get(i).getAmmo().get(j).getX(), (int)enemies.get(i).getAmmo().get(j).getY(), enemies.get(i).getAmmo().get(j).getWidth(), enemies.get(i).getAmmo().get(j).getHeight());
            }
        }

        //draw Ammo
        for(int i=0; i<ammo.size(); i++)
        {
            g.drawRect((int)ammo.get(i).getX(), (int)ammo.get(i).getY(), ammo.get(i).getWidth(), ammo.get(i).getHeight());
        }

        //draw Terrains
        for(int i=0; i<terrains.size(); i++)
        {
            g.drawRect((int)terrains.get(i).getX(), (int)terrains.get(i).getY(), terrains.get(i).getWidth(), terrains.get(i).getHeight());
        }
    }
}

它通常工作得很好,但有时,即使我不更改代码,一些运行也会给我一个白屏,并且通过一些 println,我发现虽然代码到达 repaint(),但paintComponent 方法没有被调用全部。

正如我所说,这只是有时会发生,而且看起来不可预测。

发生的另一件事是,当我将大约 50000 个敌人添加到敌人向量时,无论我尝试运行多少次,都不会调用paintComponent。根据我的研究,有些人说这是因为如果另一个面板已经在等待绘制(或类似的东西),Java 不会费心绘制一个面板,但这在第一种情况下没有意义,因为我没有更改任何代码。

有人可以解释一下实际发生的事情以及如何正确解决它吗?

4

0 回答 0