画到画布上

时间:2014-06-22 22:05:23

标签: java image jframe sleep

所以我在玩游戏,我是一个相当混乱的工人,然后我回去整理它。所以请忽略任何愚蠢的命名约定或方法或任何东西。我后来回去整理一下。

所以基本上我正在尝试制作一个主菜单,我只是想在屏幕上画一些东西并让它留在那里。我正在将图形写入图像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);

    }
}

2 个答案:

答案 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。基本上有两个缓冲区就像有两个屏幕,而你在一个屏幕上渲染'您可以清除并在第二个屏幕上绘制下一步并在两个缓冲区之间切换;这减少了闪烁。