окончание пути мяча - PullRequest
0 голосов
/ 07 июня 2011

У меня есть небольшая панель, где я заставляю шар двигаться, просто меняя его x co-ordinate. Я хочу, чтобы мяч двигался назад, когда он сталкивается с концом кадра. Ширина моего кадра 300 (by fr.setSize(300,300)). Теперь я запрограммировал анимацию как:

// when x == 300
// stop the timer

Но х = 300 кажется больше, чем его ширина, которая равна 300! Как это возможно. ** Мяч выходит из рамки 300 x 300 и становится невидимым. Почему это происходит?

Это скриншоты того, что происходит в конце концов.

Ball is moving...

Ball is no where..!!

Upon Enlarging,ball is there

Первый снимок - это движущийся шар, второй показывает, что шар исчез, третий показывает при увеличении, что шар там. Почему это происходит? Как я могу установить конечную точку кадра как конечную точку мяча?

Ответы [ 5 ]

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

Координата х указывает на левый верхний угол изображения?Если это так, то при x == 300 остальная часть изображения будет уже вне кадра.Вы должны вычесть ширину изображения из уравнения.

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

Вам необходимо учитывать видимый размер вашего компонента. Это не обязательно будет тот размер, который вы просили.

Вы можете использовать метод getSize, чтобы определить фактический размер вашего компонента, но вам также нужно вызвать getInsets, чтобы узнать, было ли зарезервировано какое-либо пространство для использования границами. Это даст вам реальную, пригодную для рисования область:

public void paint(Graphics g) {
    Dimension size = getSize();
    Insets insets = getInsets();
    int available = size.width - insets.left - insets.right;
    // Draw stuff. Remember to offset by insets.left and insets.top!
    ...
}

Также помните, что Graphics процедуры, такие как fillOval, опускаются вниз и справа от указанного вами coodinate, поэтому вам нужно подумать о том, что означает координата шара. Это центр мяча, или левая или правая сторона? Возможно, вам придется вычесть ширину шарика при расчете, достиг ли он стороны области рисования или нет.

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

Является ли "x-координата" вашего шара, возможно, его верхней левой границей? Это объяснило бы, почему оно движется за рамкой. Также учтите, что у вашей рамки есть несколько пикселей оформления вокруг.

Может быть, вам нужно настроить что-то вроде

if (x == framewidth - decorationwidth - ballwidth) stopAnimation ();
1 голос
/ 13 июня 2011

Это условие

if ( end > (frameWidth-ballWidth) )  // end is any integer
  // stop the timer or do whatever

Обратите внимание, что координата x и координата y овала являются центрами овала. Поэтому вам необходимо вычесть ширину шара из ширины рамки.

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

Вы должны получить Rectangle за paintComponent(Graphics g).

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AnimationJPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private int cx = 0;
    private int cy = 150;
    private int cw = 20;
    private int ch = 20;
    private int xinc = 1;
    private int yinc = 1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                AnimationJPanel panel = new AnimationJPanel();
                panel.setPreferredSize(new Dimension(400, 300));
                panel.animate();
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public AnimationJPanel() {
        setLayout(new BorderLayout());
        JLabel label = new JLabel("This is an AnimationJPanel");
        label.setForeground(Color.RED);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        add(label);
        setBackground(Color.BLACK);
        setForeground(Color.RED);
        setOpaque(true);
    }

    public void animate() {
        new Timer(15, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Rectangle oldCircle = new Rectangle(cx - 1, cy - 1, cw + 2, ch + 2);
                cx += xinc;
                cy += yinc;
                if (cx >= getWidth() - cw || cx <= 0) {
                    xinc *= -1;
                }
                if (cy >= getHeight() - ch || cy <= 0) {
                    yinc *= -1;
                }
                repaint(oldCircle);
                repaint(cx - 1, cy - 1, cw + 2, ch + 2);
            }
        }).start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(cx, cy, cw, ch);
    }
}
...