Java上界图

关于这个基本碰撞检测的短video:

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(); } } 

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

由于JFrame外边框宽度,从2开始可见的x相同。

以下是示例代码以及快照

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

在此处输入图像描述

– 编辑 –

我从不建议你使用它。 阅读下面的评论,因为它的缺点。

主要问题是,覆盖JFrame paint允许您在框架下绘制装饰。

这是为什么你应该避免覆盖顶级容器上的paint原因之一。

如上所述:

  • 即使在重新resize时,如何获得屏幕的中间位置
  • Java AWT drawString()不会显示在窗口上
  • 我怎么能在中间设置?
  • Java图形图像
  • 标题栏中的图形渲染

在Swing中,通常建议在从JComponent扩展的组件的paintComponent方法中执行自定义绘制,如JPanel

这不仅允许您将输出与特定容器( JFrame )分离,还确保在添加到顶级容器时,它仅占用窗口的可视区域,并且不在框架边框下呈现。

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

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

有关详细信息,请参阅AWT和Swing中的 绘画以及执行自定义绘画

附注:

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