我一直试图制作一个弹跳球动画。除了一件事,我已经把一切都搞定了。 一旦击中框架的下层甲板和框架的右侧,球就会离开屏幕。
我设置的条件如下:
if( x_Pos > frameWidth - ballRadius)
// turn the ball back
if( y_Pos > frameHeight - ballRadius)
// turn the ball back
但当球击中框架的下甲板和右甲板时,球会消失一段时间。 以下是最终发生的事情:
在第二张照片中,球已经击中了下层并且已经消失了一段时间。 为什么会这样?
如果这是我的完整代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MovingBall2D extends JPanel{
int x_Pos=0;
int y_Pos=30;
int speedX=1;
int speedY=1;
int diameter=30;
int height=30;
int frameX=700;
int frameY=200;
int radius=diameter/2;
MovingBall2D() {
this.setSize(frameX,frameY);
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if(x_Pos < 0) {
x_Pos = 0;
speedX = 1;
}
else if( x_Pos >= ( frameX - radius ) ) {
x_Pos = frameX - diameter;
speedX = -1;
}
if(y_Pos < 0) {
y_Pos = 0;
speedY = 1;
}
else if( y_Pos >= ( frameY - radius ) ) {
y_Pos = frameY - radius;
speedY = -1;
}
x_Pos = x_Pos + speedX;
y_Pos = y_Pos + speedY;
repaint();
}
};
new Timer(4,taskPerformer).start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.fillRect(0,0,frameX,frameY);
g.setColor(Color.red);
g.fillOval(x_Pos , y_Pos , diameter , height);
}
}
class Main2D {
Main2D() {
JFrame fr=new JFrame();
MovingBall2D o = new MovingBall2D();
fr.add(o);
fr.setSize(600,200);
fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new Main2D();
}
}
答案 0 :(得分:4)
基本上是因为您将JFrame
设置为200像素高,这意味着您的面板将减少高度(减去标题和边框)。
此外,您的球从(xpos, ypos)
延伸至(xpos+diameter,ypos+diameter)
,因此正确的条件为y_Pos > frameHeight - ballDiameter
而不是y_Pos > frameHeight - ballRadius
。
答案 1 :(得分:2)
您使用的帧宽(700)似乎大于组件(600)的实际大小。使用JPanel.getWidth()和JPanel.getHeight()来获取实际坐标而不是硬编码。
答案 2 :(得分:1)
MovingBall2D.this.getHeight()是173(因为面板填充,标题,边框等)。这就是为什么
只需更换if conidion:
else if( y_Pos >= ( MovingBall2D.this.getHeight()- radius ) )
{
y_Pos = MovingBall2D.this.getHeight() - radius;
speedY = -1;
}
这样做的好处是即使用户调整窗口大小,球也会碰到新的窗口边界。对X轴执行相同操作。
答案 3 :(得分:0)
尝试不重置位置,而是使用Tuple2D来夹住球的位置。我在java中没有足够的编码来真正了解正确的语法和诸如此类的东西,但谷歌应该提供帮助。