关于这个基本碰撞检测的简短视频:
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();
}
}
答案 0 :(得分:2)
主要问题是,覆盖paint
的{{1}}允许你在框架下绘画。
这是您应避免在顶级容器上覆盖JFrame
的众多原因之一。
如上所述:
在Swing中,通常建议在paint
范围内的paintComponent
方法中执行自定义绘制,例如JComponent
。
这不仅允许您将输出与特定容器(JPanel
)分离,还可以确保在添加到顶级容器时,它只占用窗口的可视区域而不会在框架边框。
JFrame
的组件也受益于双缓冲,这意味着您不需要实现自己的双缓冲策略,但它不会在重新绘制之间闪烁
此外,在执行任何自定义绘画之前必须调用super方法,否则会产生绘制工件
请查看Painting in AWT and Swing和Performing Custom Painting了解详情
旁注:
您还应该避免JComponent
的用户,因为他们因焦点相关问题而臭名昭着。相反,您应该使用Key Bindings API
答案 1 :(得分:0)
它是JFrame
标题栏的高度,这就是为什么y
在22之后开始显现的原因。
由于x
外边框宽度而从2开始显示的JFrame
相同。
以下是示例代码以及快照
g.setColor(Color.RED);
g.drawRect(3, 22, 200, 200);
- 编辑 -
我从不建议你使用它。请阅读以下评论,了解它的缺点。