Java上界图形

时间:2014-03-28 20:38:46

标签: java swing graphics

关于这个基本碰撞检测的简短视频:

https://www.youtube.com/watch?v=ptqhnmP8FY0&list=PL6E90696571998DC2

有人能告诉我为什么上边界需要是球的大小吗?我认为从左上角开始绘制一个带有边界矩形的椭圆形。如果是这种情况,那么似乎y == 0将是上边界,但显然不是这种情况。

摘要问题:如果边界三角形在左上角开始,为什么上边界20而不是0。

以下是代码:

public class JavaGame extends JFrame {

int x,y,sizeX = 350,sizeY=350;
//boolean erase = false;

private Image dbImage;
private Graphics dbg;

public class AL extends KeyAdapter{

    public void keyPressed(KeyEvent e){
        int keyCode = e.getKeyCode(); 

        if (keyCode == e.VK_LEFT){

            if(x<= 0)
                x=0;
            else
                x-=5;
        }
        if (keyCode == e.VK_RIGHT){
            if(x==sizeX-20)
                x=sizeX-20;
            else
                x+=5;
        }if (keyCode == e.VK_UP){
            if(y==20)
                y=20;
            else
            y-=5;
        }if (keyCode == e.VK_DOWN){
            if(y==sizeY-20)
                y=sizeY-20;
            else
            y+=5;
        }

        /*if (keyCode == e.VK_S){
            erase = true;
        }*/
    }
    public void keyReleased(KeyEvent e){

    }
}

public JavaGame(){
    addKeyListener(new AL());
    x=y=150;
    setTitle("Java Game");
    setBackground(Color.WHITE);
    setSize(sizeX,sizeY);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


public void paint(Graphics g){

    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);

}

public void paintComponent(Graphics g){

    g.fillOval(x, y, 20, 20);

    /*if(erase){
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 500, 500);
        erase = false;
    }*/

    repaint();


}

public static void main(String[] args) {


    new JavaGame();

}

}

2 个答案:

答案 0 :(得分:2)

主要问题是,覆盖paint的{​​{1}}允许你在框架下绘画。

这是您应避免在顶级容器上覆盖JFrame的众多原因之一。

如上所述:

在Swing中,通常建议在paint范围内的paintComponent方法中执行自定义绘制,例如JComponent

这不仅允许您将输出与特定容器(JPanel)分离,还可以确保在添加到顶级容器时,它只占用窗口的可视区域而不会在框架边框。

基于

JFrame的组件也受益于双缓冲,这意味着您不需要实现自己的双缓冲策略,但它不会在重新绘制之间闪烁

此外,在执行任何自定义绘画之前必须调用super方法,否则会产生绘制工件

请查看Painting in AWT and SwingPerforming Custom Painting了解详情

旁注:

您还应该避免JComponent的用户,因为他们因焦点相关问题而臭名昭着。相反,您应该使用Key Bindings API

答案 1 :(得分:0)

它是JFrame标题栏的高度,这就是为什么y在22之后开始显现的原因。

由于x外边框宽度而从2开始显示的JFrame相同。

以下是示例代码以及快照

    g.setColor(Color.RED);
    g.drawRect(3, 22, 200, 200);

enter image description here

- 编辑 -

我从不建议你使用它。请阅读以下评论,了解它的缺点。