我正在练习Java,试图回到面向对象编程。我决定使用在线教程重新创建蛇。我使用图形为我的代码,我想知道如果paintComponent()方法被称为60次每秒或类似的东西。我的问题是,我正在建造一些墙,如果蛇碰撞他死了,墙壁,但我只希望他们画一次,但似乎墙壁是一遍又一遍绘制(我使用sysout测试了这个)。下面提供了一些代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
在draw函数内部
//Draw wall
wall1 = new Walls(10, 10, 10, 20, UNIT_SIZE, g);
Walls构造函数
Walls(int startX, int startY, int endX, int endY, int UNIT_SIZE, Graphics g)
{
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
g.setColor(Color.GRAY);
for(int i = startY; i<=endY; i++)
{
for(int j = startX; j<=endX; j++)
{
g.fillRect(UNIT_SIZE*j, UNIT_SIZE*i, UNIT_SIZE, UNIT_SIZE);
}
}
}
Swing绘制系统在需要更新组件外观时调用paintComponent()
。原因可能是窗口被隐藏或部分遮挡,现在又变得可见了,或者组件的内容发生了变化。
因此,每当Swing调用paintComponent()
时,重要的是绘制属于组件的油漆请求部分的所有内容,否则您将获得令人讨厌的油漆工件,如缺少元素或先前窗口状态的剩余。
从你的描述,我猜这主要是你的软件请求重新绘制你的组件,通过调用repaint()
方法在你的代码的某个地方。我的建议:
- 确保为
repaint()
调用提供一个矩形,指定已更改的区域(蛇头,或多或少)。Swing在调用paintComponent()
之前设置一个合适的剪辑区域,只重新绘制已知需要它的组件部分。 - 优化
paintComponent()
实现,检查图形对象的裁剪区域是否与墙壁相交。如果没有,你可以不刷墙。