我正在制作游戏,虽然我主要是先处理逻辑,但我有一个简单、快速的绘制方法:
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 不会费心绘制一个面板,但这在第一种情况下没有意义,因为我没有更改任何代码。
有人可以解释一下实际发生的事情以及如何正确解决它吗?