我是一位经验丰富的程序员,他用Java创建了几个游戏引擎模板和小型2D游戏。我目前正在扩展到3D游戏引擎,并且正在重新编写以前的引擎以更具适应性和面向对象。
我的问题是,并且定期,有时只渲染对象。这使我必须不断重新运行程序只是为了显示任何图像。
我还没有找到这个问题的任何直接答案,似乎没有其他人有同样的问题(即使使用完全相同的代码设置观察源代码)。问题显然在于render()方法,有时候没有正确地创建或利用Graphics&在从main方法调用的线程内部的BufferStrategy对象。
以下是“Main”类的一些代码:
public Main() {
addScreenAndFrame();
}
public static void main(String[] args) {
main = new Main();
frame.add(main);
thread = new Thread(main);
running = true;
thread.start();
}
public void run() {
while (running) {
render();
tick();
}
}
public void tick() {
screen.tick();
}
public void render() {
bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
screen.paintComponent(g);
g.dispose();
bs.show();
}
以下是Screen类的一些代码:
public Screen(int width, int height) {
this.width = width;
this.height = height;
addEntities();
}
public void paintComponent(Graphics g) {
p.render(g);
}
public void tick() {
KeyInput.tick();
renderInput();
}
public void addEntities() {
p = new PolygonObject(new double[] {50,200,50}, new double[] {50,200, 200} );
}
最后这里是PolygonObject类:
public PolygonObject(double x[], double y[]) {
Screen.polygonSize ++;
polygon = new Polygon();
for (int i=0; i < x.length; i++) {
polygon.addPoint((int)x[i], (int)y[i]);
}
}
public void render(Graphics g) {
g.fillPolygon(polygon);
g.setColor(Color.black);
g.drawPolygon(polygon);
}
我不知道为什么在线程中调用render()会在将图像绘制到屏幕时产生不一致的结果。我已经看到许多游戏模板和教程的源代码,使用完全相同的代码,没有任何渲染问题。渲染一致工作的唯一方法是使用Canvas类的paintComponent()方法在线程之外绘制图像,这限制了我的程序功能并且是游戏引擎的糟糕设计。
我想解释一下这个以及任何可能的解决方案。我没有准确的方法来构建游戏引擎而不使用线程来控制基于时间的功能。
答案 0 :(得分:0)
第三个线程调用的run()方法不稳定,由于封装问题,有时无法正确构造每个对象。
我删除了额外的线程并重新构造引擎,以在Screen类的JPanel的paintComponent()方法中进行所有渲染。 Main类已重新构造为仅创建框架,然后在管理游戏逻辑和输入时将Screen和KeyInput对象添加到框架中。
引擎现在呈现100%成功,所有对象都可以正常工作。
已解决11/17/2017