【发布时间】:2016-08-05 05:02:48
【问题描述】:
我正在编写一个简单的游戏,在这个游戏中,球在撞到墙上时应该会反弹。我使用 JavaFX 作为 GUI、Canvas 和 GraphicsContext 进行绘图。
我绘制球的代码:
public void moving(){
gc.setFill(Color.BLACK);
gc.fillOval(ball.getCenterX()-15, ball.getCenterY()-15, 30,30);
if (ball.getCenterX()<285 && ball.getCenterX()>15) {
double xtemp = ball.getCenterX()+vektorx;
ball.setCenterX(xtemp);
} else {
vektorx = -vektorx;
double xtemp = ball.getCenterX()+vektorx;
ball.setCenterX(xtemp);
}
if (ball.getCenterY()<485 && ball.getCenterY()>15) {
double ytemp = ball.getCenterY()+vektory;
ball.setCenterY(ytemp);
} else {
vektory = -vektory;
double ytemp = ball.getCenterY()+vektory;
ball.setCenterY(ytemp);
}
gc.setFill(Color.AQUA);
gc.fillOval(ball.getCenterX()-15, ball.getCenterY()-15, 30,30);
}
请注意,gc 是我使用的 GraphicsContext。一切都按应有的方式进行,但只有一件事困扰着我:
球留下了它一直走的路,这让我很困扰。我尝试了一个动作的代码(再次将其绘制为蓝色和黑色),它没有留下任何痕迹,但是当我将它放在线程上并让它运行时,就会发生这种情况。
【问题讨论】:
-
我在这里看不到任何代码来清除动画每个刻度上的 GraphicsContext 或用黑色或其他东西填充它。因此,发现它在其身后留下了踪迹也就不足为奇了。
-
好吧,如果我理解正确的话,我确实在移动发生之前将球涂成黑色(球的坐标发生变化)。你可以在方法的第一行看到它。我正在学习,如果有什么我不知道的,请赐教。
-
好吧,如果您正在绘制球,然后在更新期间移动它,然后重新绘制,它将留下前一个球的痕迹。通常,您必须在任何绘制操作之前清除整个画布(或 GraphicsContext),除非您可以通过反转所有绘制操作的方式来执行此操作。这是immediate mode绘图的本质。
-
也许我明白你在说什么。我会看看这件事。你会建议什么来解决这个问题?我应该在更新之前创建一个单独的方法将球画回黑色吗?或者我应该添加一些东西?非常感谢
-
只需在每个动画帧滴答上的任何绘制操作之前绘制一个黑色矩形或其他东西。更新你的模型,清除绘图区域,做你的绘图操作,重复。这同样适用于即时模式下的任何动画循环。
标签: java javafx java-canvas