所以我在玩游戏,我是一个相当混乱的工人,然后我回去整理它。所以请忽略任何愚蠢的命名约定或方法或任何东西。我后来回去整理一下。
所以基本上我正在尝试制作一个主菜单,我只是想在屏幕上画一些东西并让它留在那里。我正在将图形写入图像ATM并显示图像,因为我尝试只是绘制到画布上,它只是闪烁在屏幕上然后它变成空白。我将它改为runnable所以我可以放入sleep()尝试和错误搜索。我现在已经删除了所有错误搜索代码。事实证明,当我将图像放在屏幕上超过50毫秒之前或之后有睡眠时,矩形会停留在屏幕上,并且在绘制后不会闪烁1毫秒。
我不确定发生了什么。我可能不那么清楚,我道歉。
import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;
public class test extends Thread{
public static void main(String[] args){
test t = new test();
t.start();
}
@Override
public void run() {
JFrame f = new JFrame("Test");
Canvas c = new Canvas();
Graphics g;
c.setSize(400, 400);
f.add(c);
f.pack();
f.setVisible(true);
c.setVisible(true);
try {
sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g = c.getGraphics();
g.drawRect(10, 10, 40, 68);
}
}
答案 0 :(得分:0)
基本上,这不是AWT中的绘画效果。绘画应该在组件的paint
方法的上下文中完成。在AWT中,Canvas
似乎是首选的基本组件。
你永远不应该使用getGraphics
,除了能够返回null
之外,它只会代表上一个绘制周期中的Graphics
上下文,添加到它的任何内容都可以被删除更新的油漆事件...这可能发生在你身上。
请查看Painting in AWT and Swing,了解有关绘画如何运作的详细信息。
说了这么多,我不鼓励你使用基于AWT的API,因为15年前它被Swing取代了。
有关在Swing中绘画的更多详细信息,请查看Performing Custom Painting
答案 1 :(得分:0)
您可以获得这个想法,但有一些标准的设计模式可以为初学者创建游戏check out this code。
基本上,您需要一种称为游戏循环的东西,它会每秒更新并呈现给显示器一定次数(帧速率或帧速率)。当它渲染时,它会以一定的间隔清除并重新绘制一个新位置的图像,如果你的fps为60,你将每秒渲染(清除和重绘)60次。我们还可以引入更高级的概念,例如缓冲策略(如上例所示),以减少撕裂和闪烁。
总结一下,你就是那种,你只需要经常这样做g = c.getGraphics()
所以......
while (true) {
g = c.getGraphics();
// set color
// draw a rectangle
g.dispose();
}
请注意我是如何添加dispose的,这将释放所有未使用的内存。只是为了澄清,这绝不是好的代码,但它会给你一个开始的地方:)
闪烁是由于只有1个屏幕,为了阻止这种闪烁,你需要buffer strategy。基本上有两个缓冲区就像有两个屏幕,而你在一个屏幕上渲染'您可以清除并在第二个屏幕上绘制下一步并在两个缓冲区之间切换;这减少了闪烁。