关于这个基本碰撞检测的短视频:
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
的 paint
允许您在框架装饰下绘画。
这是您应该避免覆盖顶级容器上的 paint
的众多原因之一。
正如所讨论的:
- How to get the EXACT middle of a screen, even when re-sized
- Java AWT drawString() does not display on window
- How can I set in the midst?
- Java graphic image
- Graphics rendering in title bar
在 Swing 中,通常建议在从 JComponent
扩展的组件的 paintComponent
方法中执行自定义绘制,例如 JPanel
。
这不仅允许您将输出与特定容器 (JFrame
) 解耦,还确保当添加到顶级容器时,它仅占据窗口的可视区域,并且不会不在框架边框下渲染。
JComponent
基于组件也受益于双缓冲,这意味着您不需要实现自己的双缓冲策略,但它不会在重绘之间闪烁
此外,您必须在执行任何自己的自定义绘画之前调用 super 方法,否则可能会产生绘画伪影
看看Painting in AWT and Swing和 Performing Custom Painting了解更多详情
旁注:
您还应该避免使用KeyListener
,因为他们因存在与焦点相关的问题而臭名昭著。相反,您应该使用 Key Bindings API
关于Java 上边界图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722777/