2015-11-23 4 views
1

Я пытаюсь сделать прыгающий мяч. Границы установлены, что позволяет шару начинать с начальной точки, когда она превышает границы кадра. Я не могу заставить мяч подпрыгнуть. Как заставить мяч отскакивать после того, как будут удалены границы (внешние края кадра)? Я считаю, что проблема заключается в методе moveBall().Реверсирование JFrame Bounds

Главный класс импорт javax.swing.JFrame;

public class MainForm { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     MainFrame mainFrame = new MainFrame(); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(220, 270); 
     mainFrame.setVisible(true); 
    } 

} 

второго класс

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MainFrame extends JFrame { 

    private CustomPanel _panel; 

    public MainFrame() 
    { 
     super("Bouncing Ball"); 

     _panel = new CustomPanel(); 
     add(_panel, BorderLayout.CENTER); 
    } 
} 

третий класс

import java.awt.Graphics; 
import javax.swing.JPanel; 


public class CustomPanel extends JPanel{ 

    private final BouncingBall _ball1; 
    private final BouncingBall _ball2; 
    private final BouncingBall _ball3; 

    public CustomPanel() 
    { 
     _ball1 = new BouncingBall(this, 20, 3); 
     Thread thread1 = new Thread(_ball1); 
     _ball2 = new BouncingBall(this, 40, 6); 
     Thread thread2 = new Thread(_ball2); 
     _ball3 = new BouncingBall(this, 60, 9); 
     Thread thread3 = new Thread(_ball3); 

     thread1.start(); 
     thread2.start(); 
     thread3.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     _ball1.draw(g); 
     _ball2.draw(g); 
     _ball3.draw(g); 
    } 
} 

4 класса

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JPanel; 


public class BouncingBall implements Runnable { 

    private JPanel _panel; 
    private int _xComponent; 
    private int _yComponent; 
    private int _sleepDelay; 

    public BouncingBall(JPanel panel, int startingYPosition, int sleepDelay) 
    { 
     _panel = panel; 
     _xComponent = 0; 
     _yComponent = startingYPosition; 
     _sleepDelay = sleepDelay; 
    } 

    @Override 
    public void run() 
    { 
     while(true) 
     { 
      try 
      { 
       Thread.sleep(_sleepDelay); 

       moveBall(); 
       _panel.repaint(); 
      } 

      catch (InterruptedException ex) 
      { 
       Logger.getLogger(BouncingBall.class.getName()).log(Level.SEVERE,null, ex); 
      } 
     } 
    } 

    public void draw(Graphics g) 
    { 
     g.setColor(new Color(255, 0, 0)); 
     g.fillOval(_xComponent, _yComponent, 20, 20); 
    } 

    private void moveBall() 
    { 
     _xComponent += 2; 

     Rectangle bounds = _panel.getBounds(); 

     if(_xComponent >= bounds.width) 
      _xComponent = -_xComponent; 
    } 
} 

ответ

1

Вам необходимо изменить скорость (шаги).

Предполагая, что границы являются относительными, в (0, 0), и один начинается внутри границ.

x += dx; 
    y += dy; 

    if (x < 0 || x > bounds.width) { 
     dx = -dx; 
     x += dx; 
    } 
    if (y < 0 || y > bounds.height) { 
     dy = -dy; 
     y += dy; 
    } 

(x короткая рука для _xComponent)

+0

Что представляют собой представления dx и dy? –

+0

Изменение размера x и y, размеры шага, как 2 в коде. –

+0

поэтому, когда я меняю код, я либо не получаю никакого кадра, либо получаю шар, остановленный или мигающий с правой стороны панели. Все еще не обратный. _xComponent + = 2; Rectangle bounds = _panel.getBounds(); if (_xComponent + 20 <0 || _xComponent + 20> = bounds.width) { _xComponent = -2; _xComponent + = 2; –

0

_xComonent является левым верхним углом коробки мяч компоненты. Таким образом, чтобы "обнаружить столкновение" справа и Боттона связанно вам придется

if(_xComponent+ball.width >= bounds.width)

insteed из

if(_xComponent >= bounds.width).

То же самое должно быть сделано с высотой, чтобы «столкнуться» с дном. Топ и левые столкновения могут быть обнаружены простым способом.

Теперь еще одна вещь, когда вы инвертируете ваш _xComponent, который вычитает из/добавляет к нему, вы мгновенно переместите свой «шар» из привязки. Помните, что (0,0) - левый верхний угол компоновщика/экрана, а не его центр. Таким образом, в целом все отрицательные компоненты точки приведут к нестандартному рисунку.

Здесь вы можете получить информацию о системе координат Swing прямо из Oracle. https://docs.oracle.com/javase/tutorial/2d/overview/coordinate.html

+0

не имеет переменный шар, чтобы использовать, если (_xComponent + ball.width). Я также не понимаю вторую часть. Хорошо, что имеет смысл, что если я добавлю/вычитаю, это выведет его за пределы. Итак, как мне манипулировать рамкой, чтобы иметь границы, где мяч меняет направление? –

+0

у вас нет ball.width, но ваш мяч равен 20 px w/h в соответствии с 'g.fillOval (_xComponent, _yComponent, 20, 20):' Сначала вам нужно понять, что то, что вы видите, это не то, что на самом деле компоненты , Так, например, ваш компонент шара не является овальным, а прямоугольником, который овально нарисован в нем без какого-либо фона. – Antoniossss

+0

мой идеал не распознает команду ball.width. Было бы полезно, если бы я опубликовал весь код? У меня 4 файла. –