我正在为一个游戏制作渲染器,一切正常,但jpanel不会更新,当它更新时,有时渲染会出现问题。
示例:
以下是渲染帧的代码:
static Container c;
static JFrame f;
static ArrayList<renderable_object> objs = new ArrayList<>();
public void main () {
Image iconI = Toolkit.getDefaultToolkit().getImage(icon);
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.getContentPane().add(new canvas());
c = f.getContentPane();
}
class canvas extends JComponent {
public void paint(Graphics g)
{
Dimension size = getSize();
g.drawRect(0, 0, size.width, size.height);
for (renderable_object part : objs) {
g.setColor(part.c);
if (part.type == 1) {
g.drawLine(part.i,part.j,part.k,part.l);
} else if (part.type == 2) {
g.drawOval(part.i,part.j,part.k,part.l);
} else if (part.type == 3) {
g.drawRect(part.i,part.j,part.k,part.l);
} else if (part.type == 4) {
g.drawString(part.name,part.k,part.l);
}
}
objs.clear();
}
}
class renderable_object {
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int type = 0;
String name = "";
Color c = new Color(0,0,0);
}
}
arraylist确保渲染器正确地对对象排序。
谢谢你的帮助。
1条答案
按热度按时间ekqde3dh1#
我看到的第一个问题是你没有打电话
super.paint(g);
作为你习惯的第一件事paint
方法。当使用jcomponent时,您可以使用它内置的双缓冲功能。但是,此功能不适用于paint
方法,但使用paintComponent
方法,因此您应该将当前解决方案替换为以下解决方案:通过使用这种方法,你正在做的整个图像的填充也变得多余,所以你可以忽略它。