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