Мяч не движется как я хочу - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу создать игру в понг.Я хочу переместить мяч так, чтобы он коснулся стены.если он касается стены, он идет другим путем.Проблема в том, что когда я начинаю играть, мяч движется в правильном направлении, но когда он касается стены, направление мяча меняется на противоположное, но только на один пиксель, поэтому шар поворачивается на 1 пиксель, а затем направление меняется на противоположное, и оно касается стены.снова.Мой код для движущегося шара находится в методе initBall.Пожалуйста, помогите мне: (

вот мой класс playPanel:

private int posX = SCREEN_WIDTH / 2;
private int posY;

public Point posMouse = new Point();
private Point posBall = new Point();

private int playPanelWidth;
private int playPanelHeight;

private int padPanelWidth;
private int padPanelHeight;

private int panPanelWidth;
private int panPanelHeight;

private JLabel player1Score = new JLabel("0");
private JLabel ComputerScore = new JLabel("0");

private JPanel panPlayer1;
public JPanel panComputer;

public JPanel padPlayer1;
public JPanel padComputer;

private JButton but_Escape = new JButton("Press escape to continue !");

/*
 * Constructor
 */
// ==============================================
public PlayPanel() {
    super(new BorderLayout());
    setBackground(PANPLAY_COLOR);

    panPlayer1 = new JPanel();
    panComputer = new JPanel();

    padPlayer1 = new JPanel();
    padComputer = new JPanel();

    padPlayer1.setBackground(Color.DARK_GRAY);
    padComputer.setBackground(Color.DARK_GRAY);

    padPlayer1.setPreferredSize(PADPANEL_SIZE);
    padComputer.setPreferredSize(PADPANEL_SIZE);

    panPlayer1.setBackground(PANPLAY_COLOR);
    panComputer.setBackground(PANPLAY_COLOR);

    panPlayer1.add(padPlayer1);
    panComputer.add(padComputer);

    add(panPlayer1, BorderLayout.WEST);
    add(panComputer, BorderLayout.EAST);

    addMouseMotionListener(this);

    panPlayer1.addComponentListener(new ComponentAdapter() {

        @Override
        public void componentResized(ComponentEvent arg0) {
            setPanPanelWidth(arg0.getComponent().getSize().width);
            setPanPanelHeight(arg0.getComponent().getSize().height);
        }

    });

    addComponentListener(new ComponentAdapter() {

        @Override
        public void componentResized(ComponentEvent arg0) {

            setPlayPanelWidth(arg0.getComponent().getSize().width);
            setPlayPanelHeight(arg0.getComponent().getSize().height);
        }

    });
}

/*
 * Setters and Getters
 */
// ==============================================

public int getPosX() {
    return posX;
}

public void setPosX(int posX) {
    this.posX = posX;
}

public int getPosY() {
    return posY;
}

public void setPosY(int posY) {
    this.posY = posY;
}

public JPanel getPanPlayer1() {
    return panPlayer1;
}

public void setPanPlayer1(JPanel panPlayer1) {
    this.panPlayer1 = panPlayer1;
}

public JPanel getPanComputer() {
    return panComputer;
}

public void setPanComputer(JPanel panComputer) {
    this.panComputer = panComputer;
}

public int getPlayPanelHeight() {
    return playPanelHeight;
}

public void setPlayPanelHeight(int playPanelHeight) {
    this.playPanelHeight = playPanelHeight;
}

public int getPlayPanelWidth() {
    return playPanelWidth;
}

public void setPlayPanelWidth(int playPanelWidth) {
    this.playPanelWidth = playPanelWidth;
}

public int getPadPanelWidth() {
    return padPanelWidth;
}

public void setPadPanelWidth(int padPanelWidth) {
    this.padPanelWidth = padPanelWidth;
}

public int getPadPanelHeight() {
    return padPanelHeight;
}

public void setPadPanelHeight(int padPanelHeight) {
    this.padPanelHeight = padPanelHeight;
}

public int getPanPanelWidth() {
    return panPanelWidth;
}

public void setPanPanelWidth(int panPanelWidth) {
    this.panPanelWidth = panPanelWidth;
}

public int getPanPanelHeight() {
    return panPanelHeight;
}

public void setPanPanelHeight(int panPanelHeight) {
    this.panPanelHeight = panPanelHeight;
}

/*
 * Add the ball
 */
// ==============================================
public void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.BLACK);

    initBall(g2);

    // trait épais
    g2.setColor(Color.DARK_GRAY);

    g2.setStroke(new BasicStroke(10));
    g2.drawLine((getPlayPanelWidth() / 2) - 5, getPlayPanelHeight(),
            (getPlayPanelWidth() / 2) - 5, 0);
}

/*
 * Init ball
 */
// ==============================================
private void initBall(Graphics2D graphics2d) {

    int x = getPosX(), y = getPosY();
    boolean backX = false;
    boolean backY = false;

    Graphics2D g2 = graphics2d;

    g2.fillOval(posX, posY, BALL_WIDTH, BALL_HEIGHT);

    //posBall.setLocation(posX + BALL_WIDTH, posY + (BALL_HEIGHT / 2));

    if (x < 1)
        backX = false;
    if (x > getWidth() - 50)
        backX = true;

    if (y < 1)
        backY = false;
    if (y > getHeight() - 50)
        backY = true;


    if (!backX)
        setPosX(++x);

    else {
        setPosX(--x);
    }

    if (!backY)
        setPosY(++y);
    else
        setPosY(--y);

    repaint();

    try {
        Thread.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

@Override
public void mouseDragged(MouseEvent arg0) {
}

@Override
public void mouseMoved(MouseEvent arg0) {

    posMouse.setLocation(arg0.getX(), arg0.getY()
            - (getPadPanelHeight() / 2));

    padPlayer1.setLocation(getPanPanelWidth() - 15, (int) posMouse.getY());
    padComputer.setLocation(5, (int) posMouse.getY());
}

}

1 Ответ

3 голосов
/ 02 апреля 2012

Итак, у вас есть:

private void initBall(Graphics2D graphics2d) {

int x = getPosX(), y = getPosY();
boolean backX = false;
boolean backY = false;

в начале, так что независимо от того, в каком направлении движется мяч, логические значения будочки каждый раз устанавливаются в false. Тогда у вас не будет «Else», когда дело доходит до установки опции возврата в

    if (x < 1)
    backX = false;
if (x > getWidth() - 50)
    backX = true;

if (y < 1)
    backY = false;
if (y > getHeight() - 50)
    backY = true;

То, что происходит, - то, что шар движется в правильном направлении, пока он не ударит стену (я предполагаю верхнюю стенку). тогда это называется:

if (y > getHeight() - 50)
    backY = true;

Итак, для этой итерации мяч возвращается из-за

if (!backY)
    setPosY(++y);
else
    setPosY(--y);

Но тогда вы сразу же установите его обратно в ложь. Я предлагаю вам 1013 *

private boolean backX = false; //same for backY

вне вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...