【发布时间】:2021-09-17 11:21:09
【问题描述】:
我正在为游戏制作渲染器,一切正常,但 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) 类名应以大写字符开头。并且不要使用“Canvas”,这是一个 AWT 类。使用更具描述性的名称。 2) 组件应该在框架可见之前添加到框架中 3) 绘画方法不应该改变类的状态。那就是你不应该清除 ArrayLIist,只绘制 ArrayList 中包含的任何内容。 4) 你不应该使用静态变量和方法。阅读Custom Painting 上的 Swing 教程以获取更多信息和工作示例。
-
重申camickr所说的:从你的绘画方法中删除
objects.clear();。您无法控制绘画发生的频率。它可以由任意数量的用户操作引起,例如移动窗口、降低或升高窗口,甚至将鼠标移到窗口上。在您的程序逻辑中清除该列表,而不是在绘画方法中。