мяч уходит с экрана - PullRequest
3 голосов
/ 14 июня 2011

Я пытался сделать анимацию прыгающего мяча. У меня все правильно, кроме одной вещи.Мяч уходит с экрана, как только он попадает на нижнюю деку рамы и правую часть рамы.

Я установил условие следующим образом:

if( x_Pos > frameWidth - ballRadius)
  // turn the ball back
if( y_Pos > frameHeight - ballRadius)
  // turn the ball back

Но мяч исчезает на некоторое время, когда он попадает на нижнюю и правую колоду кадра.Вот что в конечном итоге происходит: enter image description here

enter image description here

Во второй картинке мяч попал в нижнюю колоду и на некоторое время исчез. Почему это происходит?

Если это мой полный код:

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

Ответы [ 4 ]

4 голосов
/ 14 июня 2011

По сути, это потому, что вы установили JFrame на 200 пикселей в высоту, что означает, что ваша панель будет иметь меньшую высоту (без заголовка и границ).

Кроме того, ваш мяч увеличивается с (xpos, ypos) до (xpos+diameter,ypos+diameter), и поэтому правильное условие будет y_Pos > frameHeight - ballDiameter вместо y_Pos > frameHeight - ballRadius.

2 голосов
/ 14 июня 2011

Кажется, что ширина используемой вами рамки (700) больше, чем фактический размер компонента (600).Используйте JPanel.getWidth () и JPanel.getHeight (), чтобы получить действительные координаты вместо жестко заданных.

1 голос
/ 14 июня 2011

MovingBall2D.this.getHeight () равно 173 (из-за заполнения панели, заголовка, границы и т. Д.).Вот почему

Просто замените условие if следующим образом:

    else if( y_Pos >= ( MovingBall2D.this.getHeight()- radius ) )
    {
        y_Pos = MovingBall2D.this.getHeight() - radius;
        speedY = -1;
    }

Преимущество этого состоит в том, что даже если пользователь изменяет размеры окна, шар попадает в новые границы окна.Сделайте то же самое для оси X.

0 голосов
/ 14 июня 2011

Попробуйте не сбрасывать позицию, вместо этого используйте Tuple2D, чтобы зафиксировать положение мяча. Я не достаточно закодировал в Java, чтобы действительно знать правильный синтаксис и еще много чего, но Google должен помочь.

...